在 Android 开发中,经常会遇到两种"属性"设置方式,它们虽然名字相似,但作用域和机制完全不同。
1. System.setProperty (Java System Properties)
这是标准的 Java 机制,用于在 Java 虚拟机 (JVM) 层面设置键值对。
- 作用域 (Scope) : 仅限于当前进程 (Current Process)。
- 设置的属性只在当前 App 或当前 Java 进程的内存中有效。
- 其他 App 或系统进程无法读取到这个值。
- 生命周期 (Lifecycle) : 非持久化 。
- 进程重启后,属性丢失。
- 访问方式 (Access) :
System.setProperty("key", "value");//设置属性System.getProperty("key");//读取属性
- 用途 :
- 用于库的配置(例如配置 Log4j,或者某些 SDK 的初始化参数)。
- 在同一个进程的不同模块间传递简单的全局配置。
2. adb setprop (Android System Properties)
这是 Android 操作系统特有的属性系统,底层由 init 进程维护,存储在共享内存区域。
- 作用域 (Scope) : 系统全局 (System-wide)。
- 一旦设置,系统中的所有进程(只要有权限)都可以读取到这个值。
- 常用于跨进程通信、系统功能开关、调试标记。
- 生命周期 (Lifecycle) :
- 普通属性 : 重启后丢失 (例如
debug.,sys.,log.开头的属性)。 - 持久化属性 : 以
persist.开头的属性会将值写入磁盘 (/data/property/),重启后依然有效。
- 普通属性 : 重启后丢失 (例如
- 访问方式 (Access) :
- 命令行 (ADB):
- 设置:
adb shell setprop <key> <value> - 读取:
adb shell getprop <key>
- 设置:
- 代码 (Android):
android.os.SystemProperties.get("key", "default");android.os.SystemProperties.set("key", "value");(通常需要系统权限/Root 权限)
- 命令行 (ADB):
- 权限 :
- 读取通常比较宽松。
- 设置 (set) 通常受到 SELinux 策略的严格限制,普通 App 无法随意 setprop,通常只有系统进程或 Root 后的 Shell 才能设置。
总结对比
| 特性 | System.setProperty (Java) | adb setprop (Android SystemProperties) |
|---|---|---|
| 底层机制 | JVM 内存 Map | Android OS 共享内存 (Property Service) |
| 作用范围 | 仅当前进程 | 全局 (所有进程可见) |
| 持久化 | 否 (进程重启即失效) | persist. 开头可持久化,其他重启失效 |
| 权限要求 | 无 (进程内随意设置) | 严格 (设置通常需 System/Root 权限) |
| 典型用途 | 库配置、进程内全局变量 | 系统开关、跨进程标志、调试开关 |
代码示例
Java Property
System.setProperty("my.app.debug", "true"); // 设置
String isDebug = System.getProperty("my.app.debug");// 读取
Android System Property
//命令行设置 (需要权限)
# adb shell setprop log.tag.MyTag true
// 代码读取
SystemProperties.getBoolean("log.tag.MyTag", false);