1.0整体流程
1.1. 内核启动:内核完成系统启动,初始化系统服务和驱动。
1.2. Init进程启动:init
是用户空间的第一个进程(PID=1),解析 init.rc
脚本,管理服务生命周期。
- 挂载早期文件:如
/dev
、/proc
。 - 启动 ueventd 守护进程:创建设备节点并设置权限。
- 启动 logd 日志服务。
1.3. 核心服务启动:由 init.rc
触发。
- servicemanager:Binder 的核心组件,管理跨进程通信。
- healthd:电池状态监控。
- lmkd:内存不足时终止低优先级进程。
1.4. Zygote进程孵化:init.rc
中定义的 zygote-start
触发器启动 Zygote 进程。
- 预加载类和资源:如主题、布局,提升应用启动速度。
- 主 Zygote(app_process)和 WebView Zygote(专用于渲染 WebView)。
1.5. System Server 进程启动:由 Zygote fork 并执行 com.android.server.SystemServer
。
- 启动核心系统服务:
- 引导服务:ActivityManagerService(AMS):管理应用生命周期。
- PowerManagerService:电源管理。
- PackageManagerService(PMS):应用安装与权限控制。
- 核心服务:WindowManagerService(WMS):窗口管理。
- DisplayManagerService:显示设备管理。
- 其他服务:NotificationManagerService:通知系统。InputMethodManagerService:输入法管理。
1.6. 系统就绪与应用启动:SystemServer 完成服务启动后发送 BOOT_COMPLETED 广播。
- Launcher:桌面应用,由 AMS 启动。
- 系统应用:电话、短信等,通过 Intent.ACTION_BOOT_COMPLETED 启动。
- 后台服务:账户同步、推送服务等。
1.7. 守护进程与独立服务:独立进程。
- surfaceflinger:图形合成服务,由 init 直接启动。
- mediaserver:多媒体服务(音频、视频编解码)。
- 网络相关:
- netd:网络配置。
- rild:射频通信(电话模块)。
2.0 init的执行流程
2.1、init 进程入口
-
启动位置
- 内核完成初始化后,通过
kernel_init
启动/init
程序(位于system/core/init
) - PID=1,用户态第一个进程
- 内核完成初始化后,通过
-
入口函数
main()
函数位于system/core/init/init.cpp
2.2、执行流程分解
2.3、关键阶段详解
2.3.1. 早期初始化 (Early-init)
- 主要动作:
# init.rc 片段 on early-init start ueventd # 创建设备节点 mkdir /dev/memcg/memory 0700 root system mount tmpfs tmpfs /mnt mode=0755,uid=0,gid=1000
- 核心任务:
- 挂载
/dev
,/proc
,/sys
等临时文件系统 - 启动
ueventd
守护进程(设备节点管理)
- 挂载
2.3.2. 主初始化阶段 (Init)
- 触发条件:
on init && property:ro.bootmode=normal
- 关键操作:
- 属性服务初始化
property_init(); // 初始化属性存储区 property_load_boot_defaults(); // 加载/default.prop
- SELinux 策略加载
selinux_initialize(); // 加载/sepolicy
- 启动核心服务:
service console /system/bin/sh class core user shell group shell log
- 属性服务初始化
2.3.3. 后期初始化 (Late-init)
- 触发条件:
on late-init
- 核心任务:
- 触发
zygote-start
触发器:trigger zygote-start # 启动Zygote进程
- 启动
surfaceflinger
显示服务 - 发送
boot_progress
启动进度广播
- 触发
2.4、关键技术实现
2.4.1. 配置文件解析
- 文件结构:
/system/core/rootdir/init.rc # 主配置文件 /system/etc/init/ # 新增服务配置文件(Android 7.0特性)
- 语法规则:
- Action:由
on <trigger>
定义(如on boot
) - Service:由
service <name> <path>
定义 - Command:
start
,stop
,class_start
等
- Action:由
2.4.2. 属性服务(Property Service)
- 实现机制:
// 代码路径:system/core/init/property_service.cpp void property_init() { init_property_area(); // 共享内存区域(/dev/__properties__) }
- 重要属性:
ro.*
:只读属性(从/default.prop加载)persist.*
:持久化存储(在/data/property保存)sys.*
:系统运行时状态
2.4.3. 信号处理与进程管理
- 服务重启策略:
service zygote /system/bin/app_process class main socket zygote stream 660 root system onrestart restart surfaceflinger onrestart restart netd
- 关键信号:
SIGCHLD
:子进程终止时触发服务重启检查SIGTERM
:系统关机时终止所有服务
2.5、Android 7.0 新增特性
-
更严格的SELinux策略
- 所有系统服务默认运行在
enforcing
模式 - 新增
neverallow
规则限制权限扩散
- 所有系统服务默认运行在
-
并行启动优化
- 通过
class_start <classname>
并行启动同类服务 - 缩短开机时间(
system_server
与Zygote
并行初始化)
- 通过
-
服务监控增强
- 引入
seccomp
过滤器限制系统调用 - 增加
cgroup
内存控制(防止OOM)
- 引入
2.6、调试方法
- 查看启动日志:
adb logcat -b events | grep "boot_progress"
- 检查服务状态:
adb shell getprop | grep init.svc
- 追踪属性变更:
adb shell watchprops
**2.7、源码位置
- 主入口文件:
system/core/init/init.cpp # 核心逻辑(不同版本路径可能略有差异)
2.8、核心功能实现
2.8.1. 初始化阶段 (main()
函数)
int main(int argc, char** argv) {
// 1. 初始化内核日志(/dev/kmsg)
InitKernelLogging(argv);
// 2. 创建基础目录(/dev, /proc, /sys 等)
CreateEssentialDirectories();
// 3. 解析 init.rc 配置文件
LoadBootScripts();
// 4. 启动服务管理和属性系统
StartPropertyService();
ProcessKernelCmdline();
// 5. 进入事件循环
while (true) {
epoll_wait(...); // 监听事件(设备插拔、信号、属性变更等)
ExecuteCommands();// 执行触发动作
}
}
2.8.2. 解析 init.rc
文件
关键代码流程:
-
入口函数:
void LoadBootScripts() { Parser parser = CreateParser(); // 创建解析器对象 parser.ParseConfig("/init.rc"); // 解析主配置文件 parser.ParseConfigDir("/system/etc/init"); // 加载模块化配置 }
-
语法解析器 (
Parser
类):- 将
init.rc
中的service
、on
、import
等指令转换为内存中的数据结构:Action
:表示一组命令(如on early-init
)Service
:表示后台服务(如zygote
)
- 使用
SectionParser
处理不同段落的解析逻辑。
- 将
-
示例:解析
service
// system/core/init/service.cpp bool ServiceParser::ParseSection(const std::vector<std::string>& args, std::string* err) { // 创建 Service 对象 auto service = std::make_unique<Service>(args[1], args[2]); services_.emplace_back(std::move(service)); }
2.8.3. 服务管理 (Service
类)
关键逻辑:
-
启动服务:通过
fork()
创建子进程并执行二进制文件。void Service::Start() { pid_ = fork(); if (pid_ == 0) { execve(path_, args_, environ); // 执行服务程序 } }
-
服务重启策略:
restart_period
:定时重启onrestart
:定义服务退出时触发的其他动作
2.8.4. 属性系统 (PropertyService
)
实现细节:
- 共享内存机制:
- 属性通过
system_properties
共享内存区域存储,供所有进程读取。
- 属性通过
- 属性变更监听:
void PropertyService::Start() { // 创建 Socket 监听属性变更请求(setprop 命令) socket_ = socket_local_server(PROP_SERVICE_NAME, SOCK_STREAM, 0666); }
2.8.5. 触发器与动作执行
- 触发器类型:
boot
:系统启动时触发property:ro.debuggable=1
:属性条件触发
- 动作队列:
ActionManager::ExecuteOneCommand() { auto command = action->NextCommand(); // 从 Action 中取出命令 ExecuteCommand(command); // 执行命令(如 start servicename) }
2.9、关键数据结构
Action
类- 存储一组命令(如
mkdir /dev
)和触发条件。
- 存储一组命令(如
Service
类- 管理服务的启动参数、重启策略、SELinux 上下文等。
Parser
类- 实现
init.rc
语法的词法分析和语义分析。
- 实现
2.10、调试与扩展
2.10.1. 查看 init 日志
adb logcat | grep -i "init" # 过滤 init 进程的日志
2.10.2. 修改服务行为
- 在
Service::Start()
中添加日志输出:LOG(INFO) << "Starting service: " << name_;
2.10.3. 动态调试
adb shell stop # 停止大部分服务
adb shell start # 重新触发初始化流程
2.11、Android 版本差异
- Android 8.0+:引入
apexd
、hwservicemanager
等新服务,需在init.rc
中添加对应配置。 - Android 10+:强化
first_stage_init
和second_stage_init
的分阶段启动逻辑。
通过分析 init.cpp
的实现,可以深入理解 Android 启动流程的控制逻辑,并为定制系统行为(如添加新服务、修改启动顺序)提供技术基础。