Android 14 系统启动流程深度解析:rc文件的语法、解析及常见语法详解

Android 14 系统启动流程深度解析:rc文件的语法解析及常见语法详解

一、Android启动流程全景剖析

1.1 系统启动的五个关键阶段

Boot ROM Bootloader Linux Kernel Init Process Zygote System Server

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进程核心职责

cpp 复制代码
// 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
  • 服务依赖图requiredwants声明依赖关系

三、rc文件语法深度解析

3.1 基础语法结构

rc 复制代码
# 注释以井号开头
on <trigger>   # 触发器声明
    <command>  # 执行命令

service <name> <path> [<argument>]*  # 服务定义
    <option>   # 服务选项
    <option>

3.2 核心指令类型详解

3.2.1 Action块(触发器)
rc 复制代码
on early-init && property:ro.debuggable=1
    # 在early-init阶段且设备可调试时执行
    setprop service.adb.root 1
    start adbd

常见触发器类型

  • boot:系统启动完成时
  • early-init:初始化早期阶段
  • property:<key>=<value>:属性变化时
  • device-added-<path>:设备节点添加时
  • post-fs-data:/data分区挂载后
3.2.2 Service块(服务定义)
rc 复制代码
service surfaceflinger /system/bin/surfaceflinger
    class core animation
    user system
    group graphics drmrpc
    capabilities SYS_NICE
    onrestart restart zygote
    task_profiles HighPerformance
    cgroup cpuset:/system/top-app
    lazy  # 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 常用命令集

rc 复制代码
on boot
    # 1. 服务控制
    start servicemanager
    stop thermal-engine
    
    # 2. 属性操作
    setprop sys.boot_completed 1
    setprop persist.sys.timezone GMT
    
    # 3. 文件系统操作
    mkdir /data/app 0771 system system
    chmod 0660 /dev/graphics/fb0
    symlink /system/lib /vendor/lib
    
    # 4. 设备控制
    write /proc/sys/kernel/panic 0
    mount ext4 /dev/block/mmcblk0p1 /data
    
    # 5. 条件执行
    ifup eth0
    exec_start init_net
    
    # 6. 日志记录
    loglevel 3

四、rc文件解析机制

4.1 解析流程

Init进程 文件系统 词法分析器 语法解析器 对象树 依赖分析 执行引擎 触发器 扫描/etc/init目录 分割token 生成token流 构建Action/Service 拓扑排序 生成执行队列 绑定事件 Init进程 文件系统 词法分析器 语法解析器 对象树 依赖分析 执行引擎 触发器

4.2 核心数据结构

cpp 复制代码
// 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 解析算法关键步骤

  1. 文件收集:递归扫描所有init目录
  2. 词法分析 :正则匹配分割词素
    • 识别关键字:service, on, import
    • 识别字符串和路径
    • 处理转义字符和注释
  3. 语法解析 :构建抽象语法树
    • 创建Action节点
    • 创建Service节点
    • 建立命令列表
  4. 依赖分析
    • 解析class_start依赖关系
    • 拓扑排序服务启动顺序
  5. 事件绑定
    • 注册属性触发器
    • 绑定设备事件

五、常见语法模式与最佳实践

5.1 服务管理模板

rc 复制代码
# 标准服务定义
service my_service /vendor/bin/my_daemon
    class main
    user system
    group system
    socket myservice stream 660 system system
    disabled  # 默认不启动
    
# 条件启动触发器
on property:persist.enable.my_service=1
    start my_service

5.2 属性联动控制

rc 复制代码
# 属性变化时重启服务
on property:config.my_service.timeout=*
    restart my_service

# 多属性组合条件
on property:sys.boot_completed=1 && property:debug.my_service.enable=1
    setprop ctl.start my_service

5.3 设备节点管理

rc 复制代码
# 设备添加时执行
on device-added-/dev/block/mmcblk0p1
    mount ext4 /dev/block/mmcblk0p1 /data
    
# 设备移除时执行
on device-removed-/sys/class/net/eth0
    ifdown eth0

5.4 资源限制配置

rc 复制代码
service cpu_intensive_service /system/bin/cpu_task
    cgroup cpu:/system-background
    cgroup cpuset:/system-background
    ioprio be 0
    task_profiles ProcessCapacityHigh

六、调试与问题排查指南

6.1 调试命令工具箱

bash 复制代码
# 查看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:权限拒绝
log 复制代码
init: Could not start service 'vendor.foo': 
       Failed to setgid to 1000: Operation not permitted

解决方案

  1. 检查SELinux策略:audit2allow -i avc.log
  2. 确认服务配置的user/group是否存在
  3. 检查文件系统权限
案例2:服务重启循环
log 复制代码
init: Service 'netd' (pid 1234) exited with status 1
init: Restarting service 'netd'...

解决方案

  1. 检查服务依赖是否满足
  2. 分析服务崩溃日志
  3. 添加restart_period限制重启频率
案例3:启动超时
log 复制代码
init: Service 'bootanim' (pid 567) took 15 seconds; 
       boot animation may be slow

解决方案

  1. 使用exec_start并行启动
  2. 延迟非关键服务启动
  3. 优化服务初始化逻辑

七、Android 14启动优化实践

7.1 延迟启动配置

rc 复制代码
service non_critical_service /vendor/bin/non_critical
    class late_start
    lazy  # 按需启动
    task_profiles BatterySaver

7.2 并行启动优化

rc 复制代码
on late-init
    # 并行启动独立服务
    exec_start start_network_services
    exec_start start_media_services
    exec_start start_sensor_services

7.3 资源隔离配置

rc 复制代码
service background_service /system/bin/bg_task
    cgroup cpuset:/system-background
    ioprio idle 7
    oom_score_adjust 1000

7.4 启动时间测量

bash 复制代码
# 使用bootchart工具
adb shell touch /data/bootchart/enabled
adb pull /data/bootchart/

八、附录:完整rc示例

rc 复制代码
# Android 14系统核心服务配置
on early-init
    # 初始化安全环境
    start ueventd
    load_persist_props
    selinux_setup

on init
    # 文件系统准备
    mkdir /data 0771 system system
    mkdir /data/app 0771 system system
    symlink /system/etc /etc
    
    # 网络初始化
    setprop net.tcp.default_init_rwnd 60

on boot
    # 启动核心服务
    class_start core
    class_start main
    
    # 设置完成标志
    setprop sys.boot_completed 1

service servicemanager /system/bin/servicemanager
    class core
    user system
    group system
    critical
    onrestart restart healthd
    onrestart restart zygote
    onrestart 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
相关推荐
CIb0la16 小时前
安卓16系统升级后(Google pixel 8/8pro 9/9pro xl 10/10pro xl)救砖及Root方法
android·运维·生活
Ya-Jun17 小时前
项目实战Now in Android:项目模块说明
android·架构·kotlin
@Aurora.18 小时前
【MySQL】基础
android
ooooooctober18 小时前
PHP代码审计框架性思维的建立
android·开发语言·php
q***829119 小时前
图文详述:MySQL的下载、安装、配置、使用
android·mysql·adb
沐怡旸19 小时前
【底层机制】Ashmem匿名共享内存:原理与应用深度解析
android·面试
用户20187928316720 小时前
Activity结束动画与System.exit(0)的黑屏之谜
android
Proud lion21 小时前
Apipost 脚本高频场景最佳实践:搞定接口签名验证、登录令牌刷新、动态参数生成等
android
介一安全21 小时前
【Frida Android】实战篇5:SSL Pinning 证书绑定绕过 Hook 教程(二)
android·网络安全·逆向·安全性测试·frida
2501_9371931421 小时前
PLB-TV 影视!无广告 + 4K 高清
android·源码·源代码管理·机顶盒