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
相关推荐
shaominjin1236 小时前
Android Studio 代码注释模板设置指南
android
红宝村村长6 小时前
Golang交叉编译到Android上运行
android·开发语言·golang
游戏开发爱好者86 小时前
iOS 开发推送功能全流程详解 从 APNs 配置到上架发布的完整实践(含跨平台上传方案)
android·macos·ios·小程序·uni-app·cocoa·iphone
恋猫de小郭7 小时前
iOS 26 开始强制 UIScene ,你的 Flutter 插件准备好迁移支持了吗?
android·前端·flutter
杨筱毅7 小时前
【底层机制】【Android】【面试】Zygote 为什么使用 Socket 而不是 Binder?
android·1024程序员节·底层机制
快乐1017 小时前
Media3 ExoPlayer扩展FFmpeg音视频解码
android
zgyhc20507 小时前
【Android Audio】安卓音频中Surround mode切换流程
android·音视频
gfdgd xi9 小时前
Wine运行器3.4.0——虚拟机安装工具支持设置UEFI启动
android·windows·python·ubuntu·架构
shaominjin12310 小时前
OpenCV 4.1.2 SDK 静态库作用与功能详解
android·c++·人工智能·opencv·计算机视觉·中间件