https://blog.csdn.net/cw102055234/article/details/104988604/
https://blog.csdn.net/qingdaohaishanhu/article/details/87528613

功能

  • 启动SystemServer.java
    1)调用AndroidRuntime.cpp类,创建Android虚拟机
    2)调用Android虚拟机env指针,反射执行ZygoteInit.java的main方法(已经从C层过渡到了Java层)
    3)ZygoteInit.java创建system_server子进程,并通过反射获取SystemServer.java类的main方法。

编译

源码位置:frameworks/base/cmds/app_process
rc配置文件位置:system/core/rootdir/

main函数

位置:frameworks/base/cmds/app_process/app_main.cpp

1.定义AppRuntime类,继承自AndroidRuntime类,frameworks/base/core/jni/AndroidRuntime.cpp
2.解析参数,是否是zygote,是否开启System Server.
3.调用AndroidRuntime的start函数

357     if (zygote) {
358         runtime.start("com.android.internal.os.ZygoteInit", args, zygote);
359     } else if (className) {
360         runtime.start("com.android.internal.os.RuntimeInit", args, zygote);
361     } else {
362         fprintf(stderr, "Error: no class name or --zygote supplied.\n");
363         app_usage();
364         LOG_ALWAYS_FATAL("app_process: no class name or --zygote supplied.");
365     }

runtime.start的实现见http://xinyiworld.top/wordpress_it/?p=13945
对于zygote,执行的就是
runtime.start("com.android.internal.os.ZygoteInit", args, zygote);
ZygoteInit会创建system_server进程

zygote重启的几种情况

  • (onresart) Zygote 进程被杀;
  • (oneshot = false) system_server 进程被杀死;
  • ServiceManager 进程被杀死,这是因为 ServiceManager 先启动,然后 Zygote 进程后启动,最后是 system_server 进程启动,启动的顺序决定了依赖性。system_server 中的 Service 都需要和 ServiceManager 进行通讯,因此,当 ServiceManager 进程被杀死的时候,system_server 将杀死自身,从而导致 Zygote 进程被杀死;
  • (onresart) SurfaceFlinger 进程被杀死;
分类: zygote

0 条评论

发表回复

您的电子邮箱地址不会被公开。