Android init进程是 Linux 内核启动后的第一个用户空间进程,PID 固定为 1,是所有其他用户进程的"鼻祖"。
一、init 进程的起源
启动链路:
电源键按下 → Boot ROM → BootLoader → Linux Kernel → init 进程 (PID=1)
Linux 内核完成初始化后,在系统文件中寻找 init 程序并执行它 。
内核启动参数中指定:init=/init,告诉内核启动完成后执行 /init 程序 。
二、init 进程的核心作用
2.1 创建和挂载文件系统
// init 第一阶段mkdir("/dev",0755);mkdir("/proc",0755);mkdir("/sys",0755);mount("tmpfs","/dev","tmpfs",MS_NOSUID,"mode=0755");mount("proc","/proc","proc",0,NULL);mount("sysfs","/sys","sysfs",0,NULL);创建并挂载系统运行必需的目录:
- /dev — 设备文件
- /proc — 进程信息
- /sys — 内核参数
- /data — 用户数据
- /system — 系统分区
2.2 初始化 SELinux 安全策略
// 初始化 SELinuxselinux_android_load_policy();selinux_restore_context("/dev");selinux_restore_context("/system");- 加载安全策略文件
- 为系统文件和目录设置安全上下文
- 确保后续进程运行在正确的安全域中
2.3 启动属性服务(Property Service)
// 创建 /dev/__properties__ 目录// 初始化属性存储区域start_property_service();- Android 系统的"全局变量"系统
- 所有进程通过 getprop/setprop 读写系统属性
- 例如:ro.product.model、persist.sys.locale 等
2.4 解析 rc 文件,启动系统服务
这是 init 进程最重要的职责:
// 解析 init.rc 及所有 *.rc 文件init_parse_config_file("/init.rc");// 执行 on early-init、on init、on late-init 等触发器// 启动 class main/core 的服务启动的核心服务包括:
| 服务 | 作用 |
|---|---|
| Zygote | 应用进程孵化器 |
| servicemanager | Binder 服务管理 |
| surfaceflinger | 图形合成 |
| media | 多媒体服务 |
| netd | 网络守护进程 |
| audioserver | 音频服务 |
三、init 进程的启动阶段
三阶段模型(Android 9.0+, system/core/init/ 目录下)
四、init 进程与 Zygote 的关系
init 进程通过 rc 文件定义Zygote 的启动方式,然后创建Zygote 进程,之后 Zygote 独立运行,但 init 仍然守护它(崩溃后自动重启)。
五、init 进程的特殊之处
| 特性 | 说明 |
|---|---|
| PID = 1 | Linux 用户空间的第一个进程 |
| 永不退出 | 进入主循环,持续监听事件 |
| 所有进程的父进程 | Zygote、SystemServer 等都是由它 fork 或启动 |
| 守护进程管理器 | 监控服务状态,崩溃自动重启 |
| 权限极高 | 以 root 运行,初始化阶段拥有最高权限 |
| 与内核紧密配合 | 内核启动完成后第一个执行的用户程序 |
六、init 进程 vs 其他进程
| 进程 | PID | 由谁启动 | 作用 |
|---|---|---|---|
| swapper/idle | 0 | 内核自动创建 | 内核空闲进程 |
| init | 1 | 内核启动 | 用户空间第一个进程,初始化系统 |
| kthreadd | 2 | 内核创建 | 内核线程管理 |
| Zygote | 不定 | init 启动 | 应用进程孵化器 |
| SystemServer | 不定 | Zygote fork | 管理系统服务 |
七、总结
init 进程是 Android 系统的"开机管家"—— 它由内核启动,负责搭建系统运行环境(文件系统、安全策略、属性服务),然后按照 rc 文件的"剧本"逐个启动Zygote、SystemServer 等核心服务,最后进入守护循环,确保系统服务稳定运行。没有 init,Android系统就无法从内核完成到用户空间的过渡。