ro属性和persist属性的区别
在 Android 系统中,ro.
和 persist.
是两种不同用途的系统属性前缀,它们的核心区别如下:
1. ro.
属性(Read-Only)
特性:
- 只读属性,初始化后无法通过代码修改(
SystemProperties.set()
会失败)。 - 通常在 系统启动时 由
init
进程或build.prop
文件设置。 - 重启后值会被重置(除非在代码或配置文件中重新定义)。
- 只读属性,初始化后无法通过代码修改(
常见用途:
ini
ro.build.version=Android12 # 系统版本(只读) ro.product.model=Pixel6 # 设备型号(只读)
代码操作:
java
String value = SystemProperties.get("ro.build.version"); // 可读 SystemProperties.set("ro.build.version", "new"); // 失败!
2. persist.
属性(Persistent)
特性:
- 持久化属性,修改后会保存在
/data/property/persistent_properties
中。 - 重启后值仍然保留。
- 需要 SELinux 权限 才能修改(常见错误来源)。
- 持久化属性,修改后会保存在
常见用途:
ini
persist.sys.timezone=Asia/Shanghai # 时区设置(持久化) persist.vendor.audio.volume=80 # 厂商自定义配置
代码操作:
java
// 需要权限:android.permission.WRITE_SECURE_SETTINGS SystemProperties.set("persist.vendor.debug", "1"); // 可写
3. 关键对比表
特性 | ro. 属性 | persist. 属性 |
---|---|---|
可修改性 | ❌ 只读 | ✅ 可写(需权限) |
持久化 | ❌ 重启丢失 | ✅ 重启保留 |
存储位置 | /system/build.prop | /data/property/ |
典型用途 | 系统硬件信息、版本号 | 用户配置、厂商自定义参数 |
SELinux 要求 | 无 | 需显式授权 |
4. 常见问题解决
Q1: 为什么修改 persist.
属性失败?
- 原因:SELinux 策略限制或缺少权限。
- 解决:
- 检查 SELinux 规则(参考
avc: denied
日志)。 - 确认进程有
WRITE_SECURE_SETTINGS
权限:xml
<uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" />
- 检查 SELinux 规则(参考
Q2: 如何强制修改 ro.
属性?
- 仅限调试:通过
adb
在 root 下操作:bash
adb root adb shell setprop ro.debug.example 1 # 临时生效(重启失效)
5. 最佳实践
ro.
:用于 不可变 的系统信息(如硬件参数)。persist.
:用于 需持久化 的用户/厂商配置(如功能开关)。- 避免滥用:频繁读写
persist.
属性可能影响 I/O 性能。