+------------+ +-------+ +-----------+
|Linux Kernel+--> |init.rc+-> |app_process|
+------------+ +-------+ +-----------+
create and public
server socket
linux内核加载完成后,运行init.rc脚本
service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server socket zygote stream 666
- /system/bin/app_process Zygote服务启动的进程名
- –start-system-server 表明Zygote启动完成之后,要启动System进程。
- socket zygote stream 666 在Zygote启动时,创建一个权限为666的socket。此socket用来请求Zygote创建新进程。socket的fd保存在名称为“ANDROID_SOCKET_zygote”的环境变量中。
create rumtime
+-----------+ +----------+
|app_process+----------> |ZygoteInit|
+-----------+ +-----+----+
|
|
| registerZygoteSocket()
|
+------+ startSystemServer() |
|System| |ServerThread|
| +----+-------+
| |
| | AMS, PMS, WMS...
| |
| |
| |
v v
System进程是在ZygoteInit的handleSystemServerProcess中开始启动的。
- 首先,因为System进程是直接fork Zygote进程的,所以要先通过closeServerSocket方法关掉server socket。
- 调用RuntimeInit.zygoteInit方法进一步启动System进程。在zygoteInit中,通过commonInit方法设置时区和键盘布局等通用信息,然后通过zygoteInitNative方法启动了一个Binder线程池。最后通过invokeStaticMain方法调用SystemServer类的静态Main方法。
- SystemServer类的main通过JNI调用cpp实现的init1方法。在init1方法中,会启动各种以C++开发的系统服务(例如SurfaceFlinger和SensorService)。然后回调ServerServer类的init2方法来启动以Java开发的系统服务。
- 在init2方法中,首先会新建名为"android.server.ServerThread"的ServerThread线程,并调用其start方法。然后在该线程中启动各种Service(例如AMS,PMS,WMS等)。启动的方式是调用对应Service类的静态main方法。
- 首先,AMS会被创建,但未注册到ServerManager中。然后PMS被创建,AMS这时候才注册到ServerManager中。然后到ContentService、WMS等。 注册到ServerManager中时会制定Service的名字,其后其他进程可以通过这个名字来获取到Binder Proxy对象,以访问Service提供的服务。
- 执行到这里,System就将系统的关键服务启动起来了,这时候其他进程便可利用这些Service提供的基础服务了。
- 最后会调用ActivityManagerService的systemReady方法,在该方法里会启动系统界面以及Home程序。
##Android进程启动
+----------------------+ +-------+ +----------+ +----------------+ +-----------+
|ActivityManagerService| |Process| |ZygoteInit| |ZygoteConnection| |RuntimeInit|
+--------------+-------+ +---+---+ +-----+----+ +-----------+----+ +------+----+
| | | | |
| | | | |
startProcessLocked() | | | |
+---------------> | | | | |
| start() | | | |
| "android.app.ActivityThread" | | |
+-----------------> | | | |
| | | | |
| | | | |
| |openZygoteSocketIfNeeded() | |
| +------+ | | |
| | | | | |
| |
| | | | |("android.app.ActivityThread")
| | | | |
| | | | |
+ + + + +
- AMS向Zygote发起请求(通过之前保存的socket),携带各种参数,包括“android.app.ActivityThread”。
- Zygote进程fork自己,然后在新Zygote进程中调用RuntimeInit.zygoteInit方法进行一系列的初始化(commonInit、Binder线程池初始化等)。
- 新Zygote进程中调用ActivityThread的main函数,并启动消息循环。