Zygote
Zygote启动流程¶
在Android系统中,应用程序进程以及运行系统的关键服务的SystemServer
进程都是由Zygote
进程来创建的,我们也将它称为孵化器。它通过fork
(复制进程)的形式来创建应用程序进程和SystemServer
进程。
Zygote进程是在init进程启动时创建的,起初Zygote进程的名称并不是叫“zygote”,而是叫“app_process”,这个名称是在Android.mk中定义的,Zygote进程启动后,Linux系统下的pctrl系统会调用app_process,将其名称换成了“zygote”。
sequenceDiagram
init.rc->>init.zygote32.rc:调用
init.zygote32.rc->>app_main.cpp:main()
app_main.cpp->>AndroidRuntime:start()
AndroidRuntime->>ZygoteInit:main()
在init.rc
文件中采用了import
引入Zygote
启动脚本。
可以看出init.rc
不会直接引入一个固定的文件,而是根据属性ro.zygote的内容来引入不同的文件。
从Android 5.0
开始,Android开始支持64位程序,Zygote也就有了32位和64位的区别,所以在这里用ro.zygote
属性来控制使用不同的Zygote
启动脚本,从而也就启动了不同版本的Zygote
进程,ro.zygote
属性的取值有以下4种:
-
init.zygote32.rc
-
init.zygote32_64.rc
-
init.zygote64.rc
-
init.zygote64_32.rc
main()¶
app_main.cpp
的main
方法会接收传进的来参数,并根据传进来的参数调用AndroidRuntime
的start
方法。
start()¶
AndroidRuntime
的start
方法负责启动虚拟机,并根据传进来的类名,获取到对应的类,并执行该类的main
方法。在app_main.cpp
的main
方法中,我们传进来的是ZygoteInit
类,
所以执行的就是ZygoteInit
的main
方法。
main()¶
在ZygoteInit
的main
方法中,主要做了四件事情:
-
注册一个Socket
-
预加载各种资源
-
启动SystemServer
-
进入循环,等待AMS请求创建新的进程
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 |
|
注册Socket¶
ZygoteServer构造函数¶
创建Socket¶
Zygote的createManagedSocketFromInitSocket方法负责创建Socket
启动SystemServer¶
forkSystemServer()¶
forkSystemServer()会调用Zygote的forkSystemServer()方法fork一个SystemServer进程。并调用handleSystemServerProcess去启动SystemServer类。
forkSystemServer()¶
handleSystemServerProcess()¶
handleSystemServerProcess()会调用ZygoteInit的zygoteInit方法
zygoteInit()¶
ZygoteInit的zygoteInit()负责调用指定类的main方法。
nativeZygoteInit()¶
onZygoteInit()¶
applicationInit()¶
invokeStaticMain()¶
进入等待状态¶
runSelectLoop()¶
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 |
|
接收数据¶
acceptCommandPeer()¶
ZygoteConnection构造函数¶
processCommand()¶
processCommand负责从socket读取数据,并调用Zygote的forkAndSpecialize方法创建新进程。
zygote
需要为每个新启动的应用程序生成该自己独立的进程。不过runOnce
并没有直接使用fork来完成这一工作,而是调用了forkAndSpecialize
。另外,新创建的进程中一定需要运行应用程序本身的代码,这一部分工作是在handleChildProc
中展开的。
执行完上述的任务后,父进程还需要做一些清尾工作才算“大功告成”。包括:将子进程加入进程组;正确关闭文件;调用方返回结果值等。
handleChildProc()¶
zygoteInit()¶
ZygoteInit的zygoteInit()方法和RuntimeInit的zygoteInit方法差不多。
fork进程分析¶
forkAndSpecialize()¶
forkAndSpecialize的处理分为3个阶段,即preFork、nativeForkAndSpecialize以及postForkCommon。
nativeForkAndSpecialize()¶
nativeForkAndSpecialize()
是一个native方法。
preFork()¶
ForkAndSpecializeCommon¶
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 |
|