当前位置: 首页 > news >正文

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

// 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 基础语法结构

# 注释以井号开头
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
ioprioI/O优先级ioprio rt 0
writepid写入PID文件writepid /dev/cpuset/foreground/tasks
task_profiles任务配置文件task_profiles ProcessCapacityHigh
cgroupcgroup控制组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 解析流程

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

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 解析算法关键步骤

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

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

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

解决方案

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

解决方案

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

解决方案

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

七、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
http://www.dtcms.com/a/536153.html

相关文章:

  • 商城网站的seo优化改怎么做软件公司 网站建设费分录
  • 免费做淘宝客网站有哪些石家庄网站优化推广
  • 【瑆箫】正式入驻爱发电平台
  • 第三十三篇:贪心算法(二):区间调度与跳跃游戏
  • 美颜SDK跨平台适配实战解析:让AI美颜功能在iOS与Android都丝滑运行
  • 条款24:区分通用引用和右值引用
  • zookeeper + kafka
  • 旅游网站建设与规划网站可以做被告嘛
  • 医护上门系统开发的关键技术解析与实践指南
  • 大模型-模型压缩:量化、剪枝、蒸馏、二值化 (3
  • Win10结束支持后,Linux发行版ZorinOS下载量两天破10w?怎么安装?
  • php和mysql做租车网站平台广告投放
  • Spring Boot3零基础教程,KafkaTemplate 发送消息,笔记77
  • 强化学习2.3 MDP价值迭代和策略迭代收敛证明
  • 网站建设公司相关资质重养网站建设
  • Android 中 RecyclerView 控件实现局部刷新而非整行刷新
  • STM32学习路线!软硬件兼修:裸机+RTOS+LVGL+硬件设计+项目实战 (STM32多核心开发板)
  • iOS 26 文件导出与数据分析,多工具组合下的开发者实践指南
  • Gradle 与 CI/CD 集成:Jenkins/GitHub Actions 自动化构建配置
  • STM32——IWDG
  • 一般的网站开发语言用什么免费网页制作
  • 浅述视频汇聚平台EasyCVR视频编解码与转码技术如何成就视频体验
  • 站长工具seo域名解析不了腾讯微信小程序公众号
  • cms网站访问人数网站主机多大
  • 基于线性预测算法的PON系统动态资源调度matlab仿真
  • 10月27日
  • 系规案例模拟题分享
  • flink实验三:实时数据流处理(踩坑记录)
  • Milvus简介
  • 高并发内存池 - 开发记录08,09