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 进程被杀死;
0 条评论