1. Android init进程深度解析:从内核到用户态的第一道关卡
作为一名在Android系统开发领域摸爬滚打多年的老手,我始终认为理解init进程是掌握Android系统启动流程的钥匙。每次系统启动时,这个默默无闻的"排头兵"都在背后完成了大量基础工作。今天,我就带大家深入源码层面,看看这个PID=1的特殊进程究竟如何运作。
Android的init进程不同于Linux传统init,它经过深度定制,主要承担四大核心职责:
- 系统配置解析(init.rc等文件)
- 核心服务生命周期管理(zygote、servicemanager等)
- 属性服务维护(property_service)
- 子进程监控与回收
在Android 11的架构中,init进程的代码主要分布在system/core/init目录下。这个目录结构设计得非常清晰,每个核心功能都有对应的模块化实现:
code复制system/core/init/
├── first_stage_init.cpp # Android 10新增的第一阶段初始化
├── init.cpp # 主入口和事件循环
├── service.cpp # Service管理(start/stop/restart)
├── action.cpp # Action和Trigger处理
├── property_service.cpp # 属性服务实现
├── subcontext.cpp # 安全上下文处理
├── selinux.cpp # SELinux策略加载
└── reboot.cpp # 重启相关逻辑
提示:从Android 10开始,init进程被拆分为两个阶段(first_stage_init和main_init),这是为了支持动态分区等新特性。我们后续会详细讲解这个变化。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. init进程启动全流程拆解
2.1 从内核到init的过渡
当内核完成初始化后,会通过kernel_init()函数尝试执行用户空间的init程序。这个过程有几个关键点需要注意:
- 内核通过
do_execve系统调用执行/init程序 - 如果执行失败,会尝试
/sbin/init等备用路径 - Android的init程序是静态链接的,不依赖动态库
在Android设备上,我们通常可以在boot.img的ramdisk中找到这个init程序。通过file命令查看其属性:
bash复制$ file init
init: ELF executable, ARM, static pie executable, stripped
2.2 第一阶段初始化(first_stage_init)
Android 10引入的两阶段初始化是个重大变化。第一阶段主要完成以下工作:
- 挂载必要的tmpfs文件系统(/dev、/proc等)
- 创建设备节点(/dev/kmsg、/dev/random等)
- 加载初始SELinux策略
- 准备第二阶段init所需的文件系统环境
这个阶段的代码逻辑集中在first_stage_init.cpp中,核心函数调用链如下:
cpp复制// system/core/init/first_stage_init.cpp
int FirstStageMain(int argc, char** argv) {
// 1. 初始化内核日志输出
InitKerne
