废话不多说,先上图,不清楚的可以在评论区留言。
kernel/common/init/main.c --> kernel_init
try_to_run_init_process("/bin/init") // kernel启动init 进程入口函数
/system/core/init/main.cpp#main()
-》FirstStageMain
1、挂载创建文件
2、重定向输入输出到/dev/null:Make stdin/stdout/stderr all point to /dev/null.
3、初始化内核的日志打印
4、启动SetupSelinux
-》SetupSelinux
1.linux 的安全策略 --Android权限–最小权限原则
2.启动SecondStageMain
-》SecondStageMain
1.PropertyInit(); --初始化属性域build.prop、default.prop、prop.default等等
2.处理子进程终止信号 – 僵尸进程
InstallSignalFdHandler(&epoll);
InstallInitNotifier(&epoll);
StartPropertyService(&property_fd);
3.GetBuiltinFunctionMap() --匹配命令和函数之间的关系
例如:mkdir – 函数匹配
4.LoadBootScripts(am, sm);–解析init.rc
-》CreateParser
//system/core/init/action_parser.cpp、 import_parser.cpp 解析各种属性脚本
parser.AddSectionParser("service", std::make_unique(&service_list, GetSubcontext(), std::nullopt));
parser.AddSectionParser("on", std::make_unique(&action_manager, GetSubcontext()));
parser.AddSectionParser("import", std::make_unique(&parser));
//解析init
-》parser.ParseConfig("/system/etc/init/hw/init.rc");
-》 ParseConfigDir -> ParseConfigFile
-》ParseData
-》解析init文件 -- 二进制
5.循环处理脚本 – 启动zygote
6.进入while循环 — 等待
auto pending_functions = epoll.Wait(epoll_timeout);
笔记:所有的进程都需要进入while循环,不然函数执行完成后就被清除掉了。类似looper.loop()
/system/core/init/main.cpp#main()
1.挂载文件
2.设置selinux – 安全策略
3.开启属性服务,注册到epoll中
4.解析init.rc
5.循环处理脚本 – 启动zygote
6.循环等待
=========================================================================
32位系统
64位系统
启动zygote
/system/core/rootdir/init.rc
->init.zygote64_32.rc
//启动zygote传入的参数
->service zygote /system/bin/app_process64 -Xzygote /system/bin --zygote --start-system-server --socket-name=zygote
/frameworks/base/cmds/app_process/Android.bp
name: "app_process",
srcs: ["app_main.cpp"],
frameworks/base/cmds/app_process/app_main.cpp#main()
问题:
init.rc 怎么定位到init.zygote64_32.rc?
init.rc中会import /init.${ro.zygote}.rc 而ro.zygote属性可以在后台获取到:getprop ro.zygote
app_main.cpp#main()#AppRuntime runtime();怎么进入的AndroidRuntime.cpp的start?
main函数下面会调用此方法runtime.start
=======================================================================
frameworks/base/cmds/app_process/app_main.cpp#main()
zygote = true;
startSystemServer = true;
runtime.start("com.android.internal.os.ZygoteInit", args, zygote);
->startVm 启动虚拟机
->startReg 注册jni
->register_jni_procs(gRegJNI,...)
->array[i].mProc(env)
->env->CallStaticVoidMethod(startClass, startMeth, strArray) -->startClass = com.android.internal.os.ZygoteInit执行main@ZygoteInit.java
其中,
static const RegJNIRec gRegJNI[] = {
REG_JNI(register_com_android_internal_os_RuntimeInit),
REG_JNI(register_com_android_internal_os_ZygoteInit_nativeZygoteInit),
struct RegJNIRec {
int (*mProc)(JNIEnv*);
};
=======================================================================
1.frameworks/base/core/java/com/android/internal/os/ZygoteInit.java#main()
2.preload(bootTimingsTraceLog); //预加载,加快进程启动
3.zygoteServer = new ZygoteServer(isPrimaryZygote); //创建socket
4.Runnable r = forkSystemServer //启动systemserver进程 AMS等
5.caller = zygoteServer.runSelectLoop(abiList); //开启循环,接收AMS发送过来的消息
=======================================================================
native
1.启动虚拟机jvm Android的虚拟机 AndroidRuntime ART
2.注册jni
3.调用Zygoteinit#main
java
1.预加载,加快进程启动
2.创建socket
3.启动systemserver进程
4.开启循环,接收AMS发送过来的消息
=========================================================================
init进程总结
/system/core/init/main.cpp#main()
1.挂载文件
2.设置selinux – 安全策略
3.开启属性服务,注册到epoll中
4.解析init.rc
5.循环处理脚本 – 启动zygote
6.循环等待
zygote总结:
/system/core/rootdir/init.rc
->init.zygote64_32.rc
//启动zygote传入的参数
->service zygote /system/bin/app_process64 -Xzygote /system/bin --zygote --start-system-server --socket-name=zygote
/frameworks/base/cmds/app_process/Android.bp
name: "app_process",
srcs: ["app_main.cpp"],
frameworks/base/cmds/app_process/app_main.cpp#main()
zygote启动之native
1.启动虚拟机
2.注册jni
3.调用Zygoteinit#main
env->CallStaticVoidMethod(startClass, startMeth, strArray) -->startClass = com.android.internal.os.ZygoteInit执行main@ZygoteInit.java
zygote启动之java
1.预加载,加快进程启动
2.创建socket
3.启动systemserver进程
4.开启循环,接收AMS发送过来的消息