感谢您的阅读与点赞!欢迎点击右上角关注:「大猫玩程序」
微信公众号:大猫玩程序
![28ddd9a148b473fb2c78ecad324f102e.png](https://i-blog.csdnimg.cn/blog_migrate/a3a6a573df5b0cce7c08d85f77001e79.jpeg)
前几节已经讲完了Android10.0的Init启动过程以及Zygote的架构。
Android 10.0系统源码取经之路——启动篇
Android系统架构浅析-「Android取经之路」
Android是怎么启动的-「Android取经之路」
Android 10.0系统启动之init进程(一)-「Android取经之路」
Android 10.0系统启动之init进程(二)-「Android取经之路」
Android 10.0系统启动之init进程(三)-「Android取经之路」
Android 10.0系统启动之init进程(四)-「Android取经之路」
Android 10.0系统启动之Zygote进程(一)-「Android取经之路」
这一节开始分析Zygote在Nativate-C空间的启动源码。
4. Zygote进程启动源码分析
我们主要是分析Android Q(10.0) 的Zygote启动的源码。
4.1 Nativate-C世界的Zygote启动要代码调用流程:
![9554a608fd91ef07e1db2bb56426e772.png](https://i-blog.csdnimg.cn/blog_migrate/6008180c7f576a6de06479c6f32e58d2.jpeg)
4.1.1 [app_main.cpp] main()
Zygote本身是一个Native的应用程序,刚开始的进程名称为“app_process”,运行过程中,通过调用setArgv0将名字改为zygote 或者 zygote64(根据操作系统而来),最后通过runtime的start()方法来真正的加载虚拟机并进入JAVA世界。
int main(int argc, char* const argv[]){ //zygote传入的参数argv为“-Xzygote /system/bin --zygote --start-system-server --socket-name=zygote” //zygote_secondary传入的参数argv为“-Xzygote /system/bin --zygote --socket-name=zygote_secondary” ... while (i < argc) { const char* arg = argv[i++]; if (strcmp(arg, "--zygote") == 0) { zygote = true; //对于64位系统nice_name为zygote64; 32位系统为zygote niceName = ZYGOTE_NICE_NAME; } else if (strcmp(arg, "--start-system-server") == 0) { //是否需要启动system server startSystemServer = true; } else if (strcmp(arg, "--application") == 0) { //启动进入独立的程序模式 application = true; } else if (strncmp(arg, "--nice-name=", 12) == 0) { //niceName 为当前进程别名,区别abi型号 niceName.setTo(arg + 12); } else if (strncmp(arg, "--", 2) != 0) { className.setTo(arg); break; } else { --i; break; } } .. if (!className.isEmpty()) { //className不为空,说明是application启动模式 ... } else { //进入zygote模式,新建Dalvik的缓存目录:/data/dalvik-cache maybeCreateDalvikCache(); if (startSystemServer) { //加入start-system-server参数 args.add(String8("start-system-server")); } String8 abiFlag("--abi-list="); abiFla