1. 课程导入

在Android系统开发中,属性系统(Property System)是贯穿启动、配置、调试与定制全流程的基础设施。它既不是简单的键值存储,也不是普通的配置文件,而是一套带有权限控制、触发机制、持久化策略和跨进程可见性的系统级通信与配置总线。无论是修改ro.build.type、调试persist.sys.usb.config,还是通过ctl.start控制服务启停,属性系统都在背后承担着关键角色。本课程的目标,是帮助学习者从“会看属性”进阶到“会设计属性、会治理配置、会排查属性相关问题”。

学习目标:从使用者到系统配置工程师

本课程围绕四个层次展开。第一层是认知层:理解属性系统的设计动机、命名空间、类型语义和生命周期。第二层是操作层:熟练使用getprop、setprop、watchprops以及代码中的__system_property_get等接口。第三层是工程层:掌握build.prop、default.prop、system.prop、prop.default等配置文件的生成与加载顺序。第四层是治理层:能够设计属性命名规范、权限策略、持久化方案和OTA兼容策略,避免属性冲突与配置漂移。

核心判断:一个合格的Android系统配置工程师,不是记住多少属性名,而是能说清“这个属性由谁定义、何时加载、谁能修改、修改后影响谁、重启后是否保留”。

核心概念:属性系统的五个关键词

  • 键值对与命名空间:属性以key=value形式存在,前缀如ro.、persist.、sys.、ctl.、service.具有不同语义。
  • 只读与可写:ro.开头通常只读,写入后不可变更;persist.可持久化到/data/property;sys.多为运行时状态。
  • 权限与SELinux:属性访问受property_contexts和SELinux策略约束,普通应用无法随意写入系统属性。
  • 触发与监听:属性变化可触发init执行动作,如启动服务、执行命令,也可被watchprops或代码监听。
  • 加载顺序:不同属性文件按优先级合并,后加载者可能覆盖先加载者,理解顺序是排障关键。

整体知识框架:从启动到应用的全链路

属性系统不是孤立模块,而是与init、Zygote、SystemServer、Binder、SELinux和OTA机制紧密耦合。下图展示了属性系统在Android启动与配置工程中的位置关系,以及本课程后续章节将展开的核心对象。

Android属性系统全链路知识框架 Bootloader / Kernel cmdline · androidboot.* init 进程 解析 .rc · 加载属性 属性服务 共享内存 · 触发动作 SELinux property_contexts 属性配置文件 build.prop · default.prop system.prop · prop.default 持久化属性 /data/property persist.* 读写 属性上下文 property_contexts 类型与权限映射 Native / JNI 接口 __system_property_get/set SystemProperties.java 系统服务 SystemServer · Zygote 服务启动条件判断 应用与调试 getprop · setprop · watchprops adb shell · 日志排查 实战路线图:认知 → 操作 → 配置 → 治理 → 排障 属性命名规范 · 权限策略 · 持久化设计 · OTA兼容 · 启动优化 · 问题定位

方法流程:属性问题的标准分析路径

面对一个属性相关需求或故障,建议按以下流程推进,避免“盲改属性”导致系统不稳定。

  1. 定位属性名:确认是ro.、persist.还是sys.,判断其生命周期和可写性。
  2. 查找定义位置:在build.prop、system.prop、prop.default或.rc文件中搜索。
  3. 确认加载顺序:不同分区和文件加载优先级不同,后加载可能覆盖先加载。
  4. 检查权限与SELinux:确认调用者是否有权限写入,SELinux是否允许。
  5. 验证运行时行为:使用getprop、watchprops观察变化,结合logcat定位触发动作。
  6. 评估持久化与OTA影响:persist.属性在OTA后是否保留,是否需要迁移策略。

案例场景:一个属性引发的启动异常

某设备在OTA后无法启动某个系统服务。排查发现,服务启动条件依赖ro.boot.some_feature=1,但OTA后该属性被新的build.prop覆盖为0。进一步分析发现,旧版本通过persist.sys.some_feature做了兼容,但新版本未同步读取。最终解决方案是:在init.rc中增加兼容判断,并统一属性命名规范,避免ro.与persist.语义混用。

常见误区:把ro.属性当作可写属性反复setprop,或把persist.属性用于临时状态。前者会导致写入失败,后者会造成/data/property膨胀和OTA残留。

核心清单:属性系统学习检查表

检查项 关键问题 常用工具/文件
属性命名 前缀语义是否正确?是否冲突? getprop、命名规范文档
加载顺序 哪个文件最后生效? build.prop、prop.default
权限控制 谁可以读写?SELinux是否放行? property_contexts、dmesg
持久化 重启后是否保留?OTA后是否残留? /data/property、persist.*
触发动作 属性变化后触发了什么? init.rc、watchprops
调试手段 如何快速定位属性来源? logcat、adb shell getprop

实战路线图:30章学习路径

本课程后续将按“基础认知—配置加载—权限与SELinux—持久化与OTA—调试与排障—工程治理”六段推进。第1章建立全局框架后,第2至6章深入属性系统原理与接口,第7至12章聚焦配置文件与加载顺序,第13至18章讲解权限、SELinux与安全策略,第19至24章覆盖持久化、OTA与兼容性,第25至30章进入调试、排障与工程治理实战。每一章都会围绕真实属性、真实配置和真实故障展开,确保学完即可用于Android系统定制与配置工程。

建议在学习过程中准备一台可adb root的设备或模拟器,边学边执行getprop、setprop、watchprops,并尝试修改build.prop后观察启动行为。属性系统的很多细节,只有亲手验证过才会真正理解。

属性系统是Android系统配置工程的“神经中枢”。掌握它,意味着你能够以更低的成本完成系统定制、更准确地定位启动问题、更安全地设计配置策略。从本章开始,我们将逐层拆解这套看似简单、实则精密的系统。