type
status
date
slug
summary
tags
category
icon
password
zygote是通过app_process或者app_process64命令行程序启动的.
先来看下app_process的流程:
app_process
strdup():返回一个字符串指针,指向新复制的字符串int strncmp ( const char * str1, const char * str2, size_t n ): 比较两个字符串的前n个字符,如果相等,则返回0
app_process 根据传入参数不同分为两种模式:
- zygote模式,用于启动zygote进程 传入--zygote
- 非zygote模式,用于启动普通的java程序 比如常用的adb shell 下的命令,如am,monkey,appwidget等:
系统启动的时候,我们分析zygote模式.
实际上不管哪个模式,都会执行
AndroidRuntime::start()
方法,区别是传入的启动类不同:AndroidRuntime
AndroidRuntime启动过程主要做了三件事:
- 启动Android虚拟机,即ART Runtime
- 注册一些内置的Native方法(JNI)
- 通过JNI调用执行
ZygoteInit
的main()
方法
虚拟机是如何启动的,Native方法是如何注册的,这里暂时不分析,重点关注Zygote进程的启动.
ZygoteInit#main()
这里主要做以下几件事:
- 创建ZygoteServer,利用local socket + file descriptor 机制响应应用的fork请求
- 预加载一些jar包中的class,classloader,一诶Android资源,共享库,图形驱动等
- 启动完之后运行几次GC清理下资源
- 从Zygote进程中使用fork方式创建system server进程
Local socket + fd 这一套机制暂时还不熟悉,后面再总结一下.
预加载的有以下内容:
- /system/etc/preloaded-classes 文件中记录的类
包括Android Framework中的类,通过
Class.forName(className,true,null)
加载- 缓存一些非启动类的classloader
比如HIDL和Android test相关的
- 公共资源,让所有进程可以共享
- com.android.internal.R.array.preloaded_drawables 中的内容
- com.android.internal.R.array.preloaded_color_state_lists
- com.android.internal.R.bool.config_freeformWindowManagement
- HAL库
- 图像库驱动,比如OpenGL 或者 Vulkan驱动
- 加载共享的动态库
- libandroid.so
- libcompiler_rt.so
- libjnigraphics.so
- TextView的字体资源
- WebView相关的so库,libwebviewchromium_loader.so
创建system_server进程
在ZygoteInit##forSystemServer方法中:
可以看到首先会初始化一些参数,比如uid,gid等.然后从Zygote进程利用fork方式创建system_server进程:
其中的native方式是一个JNI调用,源码在
frameworks/base/core/jni/com_android_internal_os_Zygote.cpp
中,所使用的还是localsocket + fd的那一套机制.在system_server 创建成功之后,会执行
handleSystemServerProcess
方法:这里会设置进程的名字,dex opt 一些system_server相关的jar,并设置PathClassLoader,最终会执行到RuntimeInit中,并找到
SystemServer.java的main方法,并执行:
到这个时候system_server进程已经创建完毕,后面开始执行SystemServer中的一序列操作了.
总结
- Zygote进程的入口其实在ZygoteInit中;
- Zygote进程是通过app_process进程启动的
- zygote fork出其他进程依赖了localsocket + fd的机制
- 在启动Zygote进程之前,会先启动虚拟机,然后注册一些Native/JNI方法
- Android中每个进程都只有一个虚拟机,每个线程代表了着一个JNIEnv
- Zygote可以说是第一个Java进程
- system_server进程严格意义上并不是zygote主动启动的,而是创建zygote进程的过程中,一起fork出来的,只不过是zygote fork的.
- 作者:姜康
- 链接:https://jiangkang.tech/article/741e98ba-82e4-4ef4-9de5-d7926176019b
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。