再不学习我们就老了
0. Zygote有什么卵用?
Zygote是进程孵化器,Android系统中其他服务进程都是拷贝于它。Zygote在设计模式中对应于prototype
,这样做的好处是可以通过拷贝Zygote来快速创建一个进程。
1. Zygote脚本启动
在开机时,init进程会调用如下脚本启动进程。
system/core/rootdir/init.zygote32_64.rc :
service
表明该进程是作为一个服务来启动的,--start-system-server
指明了该进程启动后,需要启动system服务。该进程对应的端口权限660,名字为zygote,其它进程可以通过该端口和它进行通信。
1.1 init进程创建新的app_process
在init进程中,启动service进程的过程如下。
system/core/init/init.cpp :
1.2 socket创建和发布
下面主要分析一下create_socket
和publish_socket
两个函数,来说明zygote的socket如何创建的。
创建socket。
system/core/init/util.cpp :
发布socket。
2. Zygote进程启动过程
Zygote 进程的启动从app_process的main函数开始。
2.1 app_process.main
判断需要启动的进程的种类。
frameworks/base/cmds/app_process/app_main.cpp :
2.2 AndroidRuntime.start
创建虚拟机,运行java函数。
frameworks/base/core/jni/AndroidRuntime.cpp :
2.3 ZygoteInit.main
frameworks/base/core/java/com/android/internal/os/Zygoteinit.java :
2.4 ZygoteInit.registerZygoteSocket
创建了zygote socket的server端。
|
|
2.5 ZygoteInit.startSystemServer
从zygote中fork一个新的进程来单独处理system server。
|
|
2.6 ZygoteInit.runSelectLoop
Zygote启动无限循环,等待请求。
3. System进程的启动
接着2.5,Zygote fork出一个新的进程来启动System server。接下来看在这个新进程中如何启动的System server。
3.1 ZygoteInit.handleSystemServerProcess
frameworks/base/core/java/com/android/internal/os/ZygoteInit.java :
3.2 RuntimeInit.zygoteInit
frameworks/base/core/java/com/android/internal/os/RuntimeInit.java :
3.3 RuntimeInit.applicationInit
这一步开始调用SystemServer的main函数。
frameworks/base/core/java/com/android/internal/os/RuntimeInit.java :
3.4 SystemServer.main
这里直接new了一个SystemServer,然后调用它的run函数。
3.5 SystemService.run
这一步开始依次启动各种service。
frameworks/base/services/java/com/android/server/SystemServer.java :
3.6 各种service启动
startBootstrapServices
这里面启动的服务有:Installer
,ActivityManagerService
,PowerManagerService
,LightsService
,DisplayManagerService
,PackageManagerService
,SensorService
(非具体)。
这些service有的会创建自己独立的ServiceThread,是HandlerThread的子类,它们有着自己的looper循环。startService
函数将所有的service的启动过程统一管理,抽象为注册、启动两步骤。
frameworks/base/services/java/com/android/server/SystemServer.java :
startCoreServices
这一步启动的serivce有:BatteryService,UsageStatsService,WebViewUpdateService。
startOtherService
这一步启动service又多又杂,主要有如下这些,其它还有不再一一列举。
|
|
4. 总结
写到这里,有点凌乱,太多的进程和线程在这一过程中被创建。我用下图来梳理这部分进程之间的关系,希望让你一目了然吧。