2. 属性系统概述
在 Android 系统中,属性(property)是一组以“键值对”形式存在的全局配置变量。它由 init 进程统一维护,通过共享内存区域向所有进程暴露只读或可写视图,并由 libc 中的 __system_property_get、__system_property_set 等接口提供访问能力。属性不是普通的文件,也不是环境变量,而是一套带有权限控制、触发动作和持久化语义的系统级配置机制。
一、属性的定义与基本结构
一个属性由名称和值两部分组成,名称采用点分层级命名,例如 ro.build.version.sdk、persist.sys.locale、sys.boot_completed。名称前缀往往携带语义:
ro.:只读属性,通常在启动早期确定,运行期不可修改,常用于构建信息、硬件能力。persist.:持久化属性,写入后保存到/data/property,重启后仍然保留。sys.:系统运行状态属性,可读写,常用于启动完成、电源状态等动态标志。service.:与服务启动、重启策略相关的属性。debug.:调试类属性,通常受ro.debuggable等条件约束。
属性值本质上是字符串,但可以被解释为布尔、整数或列表。属性名称长度和值长度都有上限,超出部分会被截断,因此不适合承载大块数据。
二、属性系统的作用
属性系统在 Android 中承担四类关键职责:
- 启动配置传递:bootloader 通过
androidboot.*向内核和 init 传递参数,init 再将其转换为属性,供后续服务读取。 - 进程间配置共享:不同进程无需直接通信,只需读取同一属性即可获得一致的配置视图。
- 状态标志与生命周期同步:如
sys.boot_completed=1表示系统启动完成,许多服务据此决定是否开始工作。 - 触发动作:init 可以监听属性变化,当属性满足条件时执行对应命令,实现“配置即动作”。
三、属性与系统配置的关系
属性系统是系统配置的“运行时载体”。系统配置通常有三种形态:编译期配置(如 BoardConfig、产品 mk 文件)、启动期配置(如 init.rc、fstab)和运行期配置(如 Settings、系统属性)。属性系统位于三者交汇处:编译期生成的默认值可以写入属性,启动期由 init 解析并设置属性,运行期则由系统服务或应用通过属性接口读写。
因此,属性不是孤立存在的,而是配置链路上的一个关键节点。理解属性,必须同时理解它的来源、消费者和权限边界。
四、典型应用场景
属性系统在 Android 中的使用非常广泛,以下是最常见的几类场景:
| 场景 | 典型属性 | 作用说明 |
|---|---|---|
| 启动完成标志 | sys.boot_completed |
系统启动完成后置 1,服务和应用据此判断可开始工作 |
| 构建信息查询 | ro.build.version.sdk |
应用和框架读取 SDK 版本、指纹、型号等 |
| 语言与区域 | persist.sys.locale |
持久化用户语言设置,重启后保持 |
| 调试开关 | debug.sf.hw |
控制 SurfaceFlinger 等模块的调试行为 |
| 服务启动控制 | service.bootanim.exit |
通知 bootanimation 服务退出 |
| 硬件能力标识 | ro.hardware |
标识硬件平台,供 HAL 和驱动选择配置 |
五、属性系统的生态位
从生态位角度看,属性系统处于“底层启动”与“上层框架”之间的中间层。它不像 Binder 那样承担复杂 IPC,也不像 Settings 数据库那样面向用户界面,而是以极轻量的键值对形式,为整个系统提供一条低开销、高可用的配置通道。
它的上游是 bootloader、内核命令行、编译期配置和 init 脚本;下游是 init 服务管理、SystemServer、HAL、应用框架以及调试工具。属性系统本身不生产配置,而是配置的“搬运工”和“触发器”。
六、常见误区与复盘
- 误区一:把属性当数据库用。属性值长度有限,且不适合频繁写入,大量数据应使用 Settings 或文件存储。
- 误区二:忽略权限与 SELinux。属性读写受
property_contexts和 SELinux 策略约束,普通应用无法随意设置系统属性。 - 误区三:认为属性修改立即全局生效。属性写入后,其他进程需要重新读取才能获得新值;监听属性变化需要注册回调或依赖 init 触发。
- 误区四:混淆
ro.与persist.。ro.只读,persist.可持久化,二者语义和生命周期完全不同。
掌握属性系统的定义、作用、与系统配置的关系以及典型场景,是后续深入学习属性读写接口、init 触发机制和 SELinux 属性标签的基础。在实际工程中,合理使用属性可以显著降低模块耦合,提高系统配置的灵活性和可维护性。