Androidd zygote启动分析
程序员文章站
2024-03-15 14:32:29
...
1 Zygote简介
1 Zygote是由init进程通过解析init.zygote32.rc或init.zygote64.rc文件 fork生成的,zygote所对应的可执行程序app_process
Zygote.rc文件如下
// 将进程名app_process64改为zygote, 添加启动system-server参数
service zygote /system/bin/app_process64 -Xzygote /system/bin --zygote --start-system-server
class main
priority -20
user root
group root readproc
// 通过init进程创建socket
socket zygote stream 660 root system
onrestart write /sys/android_power/request_state wake
onrestart write /sys/power/state on
onrestart restart audioserver
onrestart restart cameraserver
onrestart restart media
onrestart restart netd
onrestart restart wificond
writepid /dev/cpuset/foreground/tasks
2 Zygote启动过程分析
1 创建AppRuntime,并调用start函数
2 startVm 启动虚拟机
JNI_CreateJavaVM
3 startReg(env) JNI函数注册
4 registerServerSocket 为zygote进程注册监听socket
5 preload
// 加载"/system/etc/preloaded-classes"下的class
preloadClasses();
// private static final String PRELOADED_CLASSES = "/system/etc/preloaded-classes";
android.R$styleable
android.accessibilityservice.AccessibilityServiceInfo$1
android.accounts.Account
android.accounts.Account$1
android.accounts.AccountManager
// 加载资源文件
preloadResources();
// 加载openGL
preloadOpenGL();
// 加载公共libraries
preloadSharedLibraries();
System.loadLibrary("android");
System.loadLibrary("compiler_rt");
System.loadLibrary("jnigraphics");
// 加载字体多国语言资源
preloadTextResources();
6 startSystemServer
// fork SystermServer进程
Zygote.forkSystemServer
// 关闭socket
zygoteServer.closeServerSocket();
// 通过 throw new MethodAndArgsCaller 最终调用SystemServer的main函数在run函数中的Looper.loop();中死循环
handleSystemServerProcess
7 zygoteServer.runSelectLoop(abiList); //等待ActivityManagerService向Zygote发起启动应用程序的消息
boolean done = peers.get(i).runOnce(this);
// fork app进程
Zygote.forkAndSpecialize
// 通过 throw new Zygote.MethodAndArgsCaller(m, argv);异常,最终调用ActivityThread的main函数
handleChildProc
3 Zygote启动过程时序图如下:
4 COW机制
父进程和子进程共享同一个拷贝。只有在需要写入的时候,数据才会被复制,从而使各个进程拥有各自的拷贝。也就是说,资源的复制只有在需要写入的时候才进行,在此之前,只是以只读方式共享。这种技术使地址空间上的页的拷贝被推迟到实际发生写入的时候。Zygote通过fork启动APP进程(采用用了COW机制)避免启动APP加载资源速度慢,节省内存,当APP进程被kill时,也不会影响父进程
推荐阅读
-
Androidd zygote启动分析
-
DA14580 启动过程分析
-
Tomcat启动分析(我们为什么要配置CATALINA_HOME环境变量)
-
Tomcat启动分析(我们为什么要配置CATALINA_HOME环境变量)
-
[debezium 源码分析] MySqlConnectorTask 启动和拉取数据过程分析
-
java启动线程的3种方式对比分析
-
java启动线程的3种方式对比分析
-
分析Android中应用的启动流程
-
Android系统进程间通信(IPC)机制Binder中的Server启动过程源代码分析
-
Android系统进程间通信(IPC)机制Binder中的Server启动过程源代码分析