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 中承担四类关键职责:

  1. 启动配置传递:bootloader 通过 androidboot.* 向内核和 init 传递参数,init 再将其转换为属性,供后续服务读取。
  2. 进程间配置共享:不同进程无需直接通信,只需读取同一属性即可获得一致的配置视图。
  3. 状态标志与生命周期同步:如 sys.boot_completed=1 表示系统启动完成,许多服务据此决定是否开始工作。
  4. 触发动作:init 可以监听属性变化,当属性满足条件时执行对应命令,实现“配置即动作”。

三、属性与系统配置的关系

属性系统是系统配置的“运行时载体”。系统配置通常有三种形态:编译期配置(如 BoardConfig、产品 mk 文件)、启动期配置(如 init.rc、fstab)和运行期配置(如 Settings、系统属性)。属性系统位于三者交汇处:编译期生成的默认值可以写入属性,启动期由 init 解析并设置属性,运行期则由系统服务或应用通过属性接口读写。

因此,属性不是孤立存在的,而是配置链路上的一个关键节点。理解属性,必须同时理解它的来源、消费者和权限边界。

Android 属性系统生态位与数据流 配置来源 Bootloader androidboot.* 编译期配置 BoardConfig / mk init.rc / fstab 启动期脚本 Settings / 应用 运行期写入 persist 持久化存储 属性系统核心 共享内存属性区 /dev/__properties__ 属性服务 property_service init 进程内 权限控制 property_contexts SELinux 标签 触发动作 on property init 条件执行 属性消费者 init 服务管理 启动 / 重启策略 SystemServer 读取启动状态 HAL / 驱动 硬件能力查询 应用框架 Build / SystemProperties 调试与诊断工具 属性 = 配置的运行时载体 连接编译期、启动期与运行期

四、典型应用场景

属性系统在 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、应用框架以及调试工具。属性系统本身不生产配置,而是配置的“搬运工”和“触发器”。

理解属性系统的生态位,有助于在排查问题时快速定位:如果一个配置在启动早期就需要被多个进程读取,或者需要触发 init 动作,那么属性系统通常是最合适的载体。

六、常见误区与复盘

  • 误区一:把属性当数据库用。属性值长度有限,且不适合频繁写入,大量数据应使用 Settings 或文件存储。
  • 误区二:忽略权限与 SELinux。属性读写受 property_contexts 和 SELinux 策略约束,普通应用无法随意设置系统属性。
  • 误区三:认为属性修改立即全局生效。属性写入后,其他进程需要重新读取才能获得新值;监听属性变化需要注册回调或依赖 init 触发。
  • 误区四:混淆 ro. 与 persist.。ro. 只读,persist. 可持久化,二者语义和生命周期完全不同。

掌握属性系统的定义、作用、与系统配置的关系以及典型场景,是后续深入学习属性读写接口、init 触发机制和 SELinux 属性标签的基础。在实际工程中,合理使用属性可以显著降低模块耦合,提高系统配置的灵活性和可维护性。