System Properties 和 Settings.Global 的区别
System Properties 与 Settings.Global 对比表
对比维度 | System Properties | Settings.Global |
---|---|---|
本质 | Linux 内核级别的键值对 | Android Framework 层的数据库条目 |
存储位置 | /system/build.prop (或 system_ext、vendor 等) | SQLite 数据库(如 /data/data/com.android.providers.settings/databases/settings.db ) |
访问方式 | Java: SystemProperties.get() Shell: getprop / setprop | Java: Settings.Global.getString() , getInt() 等 |
生效时机 | 系统启动早期加载 | Framework 启动后可用 |
可变性 | 只读(通常),修改需重新编译刷机 | 可运行时动态修改(需权限) |
是否持久化 | ✅ 是(build.prop 文件) | ✅ 是(SQLite 数据库存储) |
是否支持运行时修改 | ❌ 否(除非用 setprop ,不推荐) | ✅ 是 |
影响范围 | 多个系统组件共享(Zygote、SurfaceFlinger、init 等) | Framework 层服务及 App |
修改权限 | 需要 root 或刷入新系统 | 需要 WRITE_SETTINGS 权限 |
🧩 使用场景对比
✅ System Properties
-
适用于:
- 控制底层行为(如硬件特性、调试开关)
- 系统启动参数(如 ro.boot.hardware)
- 只读属性(如设备型号、固件版本)
-
示例:
ro.product.model=MyDevice persist.sys.debug.enable=1
-
特点:
- 被多个系统组件共享(如 Zygote、SurfaceFlinger、init)
- 修改需要 root 权限 + 修改 build.prop 文件并重启
✅ Settings.Global
-
适用于:
- 全局设置项(如飞行模式、屏幕亮度、开发者选项等)
- Framework 层服务控制(如 Wi-Fi、蓝牙开关)
-
示例:
Settings.Global.putInt(getContentResolver(), Settings.Global.AIRPLANE_MODE_ON, 1);
-
特点:
- 可以通过 Settings Provider 动态更新
- 不影响底层系统行为
- 某些设置项受权限保护(如
WRITE_SETTINGS
)
🔒 权限与安全性对比
对比点 | System Properties | Settings.Global |
---|---|---|
修改权限 | 需要 root 或刷入新系统 | 需要 WRITE_SETTINGS 权限 |
是否持久化 | ✅ 是(build.prop 文件) | ✅ 是(SQLite 数据库存储) |
是否支持运行时修改 | ❌ 否(除非用 setprop ,不推荐) | ✅ 是 |
是否被系统服务监听 | ✅ 是(如 init、SurfaceFlinger) | ✅ 是(如 SettingsProvider、Framework 监听变化) |
🛠️ 典型应用场景对比
应用场景 | 推荐使用 |
---|---|
设置默认屏幕方向 | ro.product.default_orientation=landscape (System Property) |
开启调试日志输出 | persist.sys.debug.enable=1 (System Property) |
控制是否允许安装未知来源应用 | Settings.Global.INSTALL_NON_MARKET_APPS |
设置系统语言 | 一般由 localepicker 控制,最终写入 Settings.Global |
控制是否启用开发者选项 | Settings.Global.DEVELOPMENT_SETTINGS_ENABLED |
设置默认输入法 | Settings.Global.DEFAULT_INPUT_METHOD |
🔄 与其他配置方式对比
类型 | 是否可运行时修改 | 是否持久化 | 影响范围 | 修改方式 |
---|---|---|---|---|
System Properties | ❌(不推荐) | ✅ | 整个系统 | 修改 build.prop 并重启 |
BuildConfig | ❌ | ✅ | 单个 App | 编译时决定 |
Settings.Global | ✅ | ✅ | Framework 层 | API 动态修改 |
🧪 查看方式
查看 System Properties
:
adb shell getprop
adb shell getprop ro.product.model
查看 Settings.Global
:
adb shell settings list global
adb shell settings get global airplane_mode_on
✅ 总结对比表
对比维度 | System Properties | Settings.Global |
---|---|---|
层级 | Native 层 / Init 层 | Framework 层 |
修改难度 | 复杂(需刷机) | 简单(API 或命令) |
生效时间 | 启动初期 | Framework 启动后 |
适用对象 | 系统级、底层模块 | Framework、App |
是否适合 App 使用 | ❌ 否 | ✅ 是 |
📝 何时该用哪个?
场景 | 推荐使用 |
---|---|
控制底层模块行为(如 Camera HAL) | ✅ System Properties |
控制 Framework 行为(如 Wi-Fi、飞行模式) | ✅ Settings.Global |
App 配置(如默认主题) | ✅ SharedPreferences 或 App 自定义配置 |
系统构建信息(如产品名称、版本号) | ✅ System Properties |
用户可配置的全局设置 | ✅ Settings.Global |