配套系列教学视频链接:
安卓系列教程之ROM系统开发-百问100ask
说明
系统:Android10.0
设备: FireFly RK3399 (ROC-RK3399-PC-PLUS)
前言
本文简单描述一下android init祖先进程启动的基本执行流程,让大家有一个整体认识,由浅入深, 后面再展开详细说明。
整体逻辑:
主要分成三个部分:
1, 第一阶段: 执行在 ramdisk 中, 主要创建必须的文件夹, 挂载虚拟文件系统, 挂载 system,vendor 分区。
2, selinux 初始化: 第一阶段的 selinux 初始化, 完成策略二进制文件的加载, 并设置默认 selinux 模式。
3, 第二阶段: 重点完成属性初始化, 启动 rc 脚本的解析和执行, 建立 epoll 机制监控各种事项。、
代码如下: system/core/init/main.cpp
int main(int argc, char** argv) {
#if __has_feature(address_sanitizer)
__asan_set_error_report_callback(AsanReportCallback);
#endif
//init和ueventd共享同一套代码, 该进程负责和内核进行通信, 监控所有设备的增加和删除,修改
//并创建设备,设置对应的设备权限
if (!strcmp(basename(argv[0]), "ueventd")) {
return ueventd_main(argc, argv);
}
if (argc > 1) {
// /system/bin/init subcontex
if (!strcmp(argv[1], "subcontext")) {
android::base::InitLogging(argv, &android::base::KernelLogger);
const BuiltinFunctionMap function_map;
//读取所有安全上下文文件内容, 并用一个句柄来表示。
// 当需要设置文件的安全上下文时, 内核就可以通过这个句柄来配置context
//并进入一个死循环-接受socket的命令,并做响应
return SubcontextMain(argc, argv, &function_map);
}
///system/bin/init selinux_setup 第一阶段完成之后,就直接跳到该阶段
if (!strcmp(argv[1], "selinux_setup")) {
return SetupSelinux(argv);
}
//
///system/bin/init second_stage ,selinux_setup结束之后就进入第二阶段
if (!strcmp(argv[1], "second_stage")) {
return SecondStageMain(argc, argv);
}
}
// 第一阶段代码
return FirstStageMain(argc, argv);
}