Android 14 系统启动流程深度解析:rc文件的语法、解析及常见语法详解
Android 14 系统启动流程深度解析:rc文件的语法解析及常见语法详解
一、Android启动流程全景剖析
1.1 系统启动的五个关键阶段
1.1.1 Boot ROM阶段
- 芯片上电执行固化在ROM中的代码
- 加载Bootloader到RAM
- 安全启动验证(Android Verified Boot 2.0)
1.1.2 Bootloader阶段
- 初始化基本硬件(时钟、内存控制器)
- 加载设备树(Device Tree Blob)
- 加载Linux内核和initramfs映像
- 解锁状态检查(boot state verification)
1.1.3 Linux内核阶段
- 初始化进程调度器、内存管理
- 挂载rootfs作为初始根文件系统
- 加载SELinux安全策略
- 启动第一个用户空间进程:init(PID=1)
1.2 Android 14启动优化特性
- 并行服务启动:使用
exec_start异步执行命令 - 延迟初始化:
lazy关键字减少启动时间 - 资源隔离:cgroup v2控制组精细化管理
- 启动时内存压缩:ZRAM早期初始化
- 预加载优化:类预加载减少50ms延迟
二、Init进程与rc文件体系
2.1 Init进程核心职责
// system/core/init/main.cpp
int main(int argc, char** argv) {// 1. 文件系统准备MountInitialFilesystems(); // 2. 解析启动参数ParseBootconfig();// 3. 初始化内核日志InitKernelLogging();// 4. 加载SELinux策略SelinuxSetup();// 5. 解析rc配置文件LoadBootScripts();// 6. 执行启动触发器ExecuteTrigger("early-init");
}
2.2 rc文件目录结构
| 路径 | 作用 | 加载顺序 |
|---|---|---|
/system/etc/init/ | 核心系统服务 | 1 |
/vendor/etc/init/ | 硬件厂商服务 | 2 |
/odm/etc/init/ | 设备制造商配置 | 3 |
/product/etc/init/ | 产品级配置 | 4 |
/data/etc/init/ | 运行时生成配置 | 5 |
2.3 Android 14新特性
- 条件导入:
import /path/if [condition] - 动态服务控制:
ctl.<interface>属性控制 - 资源限制:
cgroup指令精细控制CPU/IO - 服务依赖图:
required和wants声明依赖关系
三、rc文件语法深度解析
3.1 基础语法结构
# 注释以井号开头
on <trigger> # 触发器声明<command> # 执行命令service <name> <path> [<argument>]* # 服务定义<option> # 服务选项<option>
3.2 核心指令类型详解
3.2.1 Action块(触发器)
on early-init && property:ro.debuggable=1# 在early-init阶段且设备可调试时执行setprop service.adb.root 1start adbd
常见触发器类型:
boot:系统启动完成时early-init:初始化早期阶段property:<key>=<value>:属性变化时device-added-<path>:设备节点添加时post-fs-data:/data分区挂载后
3.2.2 Service块(服务定义)
service surfaceflinger /system/bin/surfaceflingerclass core animationuser systemgroup graphics drmrpccapabilities SYS_NICEonrestart restart zygotetask_profiles HighPerformancecgroup cpuset:/system/top-applazy # Android 14新增延迟启动
3.3 服务选项全解析
| 选项 | 说明 | 示例 |
|---|---|---|
class | 服务分类 | class main |
user | 运行用户 | user system |
group | 运行组 | group net_admin |
socket | 创建套接字 | socket zygote stream 660 root system |
oneshot | 单次执行 | oneshot |
disabled | 默认不启动 | disabled |
priority | 进程优先级 | priority -20 |
ioprio | I/O优先级 | ioprio rt 0 |
writepid | 写入PID文件 | writepid /dev/cpuset/foreground/tasks |
task_profiles | 任务配置文件 | task_profiles ProcessCapacityHigh |
cgroup | cgroup控制组 | cgroup cpuset:/system-background |
3.4 常用命令集
on boot# 1. 服务控制start servicemanagerstop thermal-engine# 2. 属性操作setprop sys.boot_completed 1setprop persist.sys.timezone GMT# 3. 文件系统操作mkdir /data/app 0771 system systemchmod 0660 /dev/graphics/fb0symlink /system/lib /vendor/lib# 4. 设备控制write /proc/sys/kernel/panic 0mount ext4 /dev/block/mmcblk0p1 /data# 5. 条件执行ifup eth0exec_start init_net# 6. 日志记录loglevel 3
四、rc文件解析机制
4.1 解析流程
4.2 核心数据结构
// Action结构定义
struct Action {std::string name_;std::vector<std::string> triggers_;std::vector<Command> commands_;bool (*func_)(const Action&);
};// Service结构定义
class Service {
public:const std::string& name() const { return name_; }Result<void> Start(); // 启动服务Result<void> Stop(); // 停止服务private:std::string name_;std::vector<std::string> args_;uid_t uid_;gid_t gid_;std::map<std::string, std::string> envs_;int priority_;
};
4.3 解析算法关键步骤
- 文件收集:递归扫描所有init目录
- 词法分析:正则匹配分割词素
- 识别关键字:service, on, import
- 识别字符串和路径
- 处理转义字符和注释
- 语法解析:构建抽象语法树
- 创建Action节点
- 创建Service节点
- 建立命令列表
- 依赖分析:
- 解析
class_start依赖关系 - 拓扑排序服务启动顺序
- 解析
- 事件绑定:
- 注册属性触发器
- 绑定设备事件
五、常见语法模式与最佳实践
5.1 服务管理模板
# 标准服务定义
service my_service /vendor/bin/my_daemonclass mainuser systemgroup systemsocket myservice stream 660 system systemdisabled # 默认不启动# 条件启动触发器
on property:persist.enable.my_service=1start my_service
5.2 属性联动控制
# 属性变化时重启服务
on property:config.my_service.timeout=*restart my_service# 多属性组合条件
on property:sys.boot_completed=1 && property:debug.my_service.enable=1setprop ctl.start my_service
5.3 设备节点管理
# 设备添加时执行
on device-added-/dev/block/mmcblk0p1mount ext4 /dev/block/mmcblk0p1 /data# 设备移除时执行
on device-removed-/sys/class/net/eth0ifdown eth0
5.4 资源限制配置
service cpu_intensive_service /system/bin/cpu_taskcgroup cpu:/system-backgroundcgroup cpuset:/system-backgroundioprio be 0task_profiles ProcessCapacityHigh
六、调试与问题排查指南
6.1 调试命令工具箱
# 查看init日志
adb logcat -s init# 检查服务状态
adb shell dumpsys activity services# 查看属性值
adb shell getprop | grep init# 追踪服务启动
adb shell strace -p $(pidof my_service)# SELinux权限检查
adb shell dmesg | grep avc
6.2 常见错误案例解析
案例1:权限拒绝
init: Could not start service 'vendor.foo': Failed to setgid to 1000: Operation not permitted
解决方案:
- 检查SELinux策略:
audit2allow -i avc.log - 确认服务配置的user/group是否存在
- 检查文件系统权限
案例2:服务重启循环
init: Service 'netd' (pid 1234) exited with status 1
init: Restarting service 'netd'...
解决方案:
- 检查服务依赖是否满足
- 分析服务崩溃日志
- 添加
restart_period限制重启频率
案例3:启动超时
init: Service 'bootanim' (pid 567) took 15 seconds; boot animation may be slow
解决方案:
- 使用
exec_start并行启动 - 延迟非关键服务启动
- 优化服务初始化逻辑
七、Android 14启动优化实践
7.1 延迟启动配置
service non_critical_service /vendor/bin/non_criticalclass late_startlazy # 按需启动task_profiles BatterySaver
7.2 并行启动优化
on late-init# 并行启动独立服务exec_start start_network_servicesexec_start start_media_servicesexec_start start_sensor_services
7.3 资源隔离配置
service background_service /system/bin/bg_taskcgroup cpuset:/system-backgroundioprio idle 7oom_score_adjust 1000
7.4 启动时间测量
# 使用bootchart工具
adb shell touch /data/bootchart/enabled
adb pull /data/bootchart/
八、附录:完整rc示例
# Android 14系统核心服务配置
on early-init# 初始化安全环境start ueventdload_persist_propsselinux_setupon init# 文件系统准备mkdir /data 0771 system systemmkdir /data/app 0771 system systemsymlink /system/etc /etc# 网络初始化setprop net.tcp.default_init_rwnd 60on boot# 启动核心服务class_start coreclass_start main# 设置完成标志setprop sys.boot_completed 1service servicemanager /system/bin/servicemanagerclass coreuser systemgroup systemcriticalonrestart restart healthdonrestart restart zygoteonrestart restart surfaceflinger
源码参考:
- Init进程主逻辑:
system/core/init/main.cpp- rc文件解析器:
system/core/init/parser.cpp- 服务管理实现:
system/core/init/service.cpp- Action执行引擎:
system/core/init/action.cpp
