0
点赞
收藏
分享

微信扫一扫

Android系统10 RK3399 init进程启动(四十七) Android init 进程整体代码逻辑简述


配套系列教学视频链接:

安卓系列教程之ROM系统开发-百问100ask

说明

系统:Android10.0

设备: FireFly RK3399 (ROC-RK3399-PC-PLUS)

前言

本文简单描述一下android init祖先进程启动的基本执行流程,让大家有一个整体认识,由浅入深, 后面再展开详细说明。

整体逻辑:



Android系统10 RK3399 init进程启动(四十七) Android init 进程整体代码逻辑简述_init.rc语法


主要分成三个部分:

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);
}

详细的图如下所示:



Android系统10 RK3399 init进程启动(四十七) Android init 进程整体代码逻辑简述_Android ROM开发_02


举报

相关推荐

0 条评论