> 技术文档 > ro属性和persist属性的区别

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_SETTINGSSystemProperties.set(\"persist.vendor.debug\", \"1\"); // 可写

3. 关键对比表

特性 ro. 属性 persist. 属性 可修改性 ❌ 只读 ✅ 可写(需权限) 持久化 ❌ 重启丢失 ✅ 重启保留 存储位置 /system/build.prop /data/property/ 典型用途 系统硬件信息、版本号 用户配置、厂商自定义参数 SELinux 要求 无 需显式授权

4. 常见问题解决

Q1: 为什么修改 persist. 属性失败?
  • 原因:SELinux 策略限制或缺少权限。
  • 解决
    1. 检查 SELinux 规则(参考 avc: denied 日志)。
    2. 确认进程有 WRITE_SECURE_SETTINGS 权限:

      xml

Q2: 如何强制修改 ro. 属性?
  • 仅限调试:通过 adb 在 root 下操作:

    bash

    adb rootadb shell setprop ro.debug.example 1 # 临时生效(重启失效)

5. 最佳实践

  • ro.:用于 不可变 的系统信息(如硬件参数)。
  • persist.:用于 需持久化 的用户/厂商配置(如功能开关)。
  • 避免滥用:频繁读写 persist. 属性可能影响 I/O 性能。