+------------+ +-------+ +-----------+ |Linux Kernel+--> |init.rc+-> |app_process| +------------+ +-------+ +-----------+ create and public server socket
linuz内核加载完成后,运行init.rc脚本:android
service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server socket zygote stream 666
这里要注意两点:app
create rumtime +-----------+ +----------+ |app_process+----------> |ZygoteInit| +-----------+ +-----+----+ | | | registerZygoteSocket() | +------+ startSystemServer() | |System| <-------+ | +------+ fork | runSelectLoopMode() | v
/system/bin/app_process 启动时建立了一个AppRuntime对象。经过AppRuntime对象的start方法,经过JNI调用建立了一个虚拟机实例,而后运行com.android.internal.os.ZygoteInit类的静态main方法,传递true(boolean startSystemServer)参数。socket
ZygoteInit类的main方法运行时,会经过registerZygoteSocket方法建立一个供ActivityManagerService使用的server socket。而后经过调用startSystemServer方法来启动System进程。最后经过runSelectLoopMode来等待AMS的新建进程请求。函数
在registerZygoteSocket方法中,经过名为ANDROID_SOCKET_zygote的环境获取到zygote启动时建立的socket的fd,而后以此来建立server socket。oop
在startSystemServer方法中,经过Zygote.forkSystemServer方法建立了一个子进程,并将其用户和用户组的ID设置为1000。布局
在runSelectLoopMode方法中,会将以前创建的server socket保存起来。而后进入一个无限循环,在其中经过selectReadable方法,监听socket是否有数据可读。有数据则说明接收到了一个请求。
selectReadable方法会返回一个整数值index。若是index为0,则说明这个是AMS发过来的链接请求。这时会与AMS创建一个新的socket链接,并包装成ZygoteConnection对象保存起来。若是index大于0,则说明这是AMS发过来的一个建立新进程的请求。此时会取出以前保存的ZygoteConnection对象,调用其中的runOnce方法建立新进程。调用完成后将connection删除。
这就是Zygote处理一次AMS请求的过程。线程
+ | | v fork() +--------------+ |System Process| +------+-------+ | | RuntimeInit.zygoteInit() commonInit, zygoteInitNative | init1() SurfaceFlinger, SensorServic... | | | init2() +------------+ +-------> |ServerThread| | +----+-------+ | | | | AMS, PMS, WMS... | | | | | | v v
System进程是在ZygoteInit的handleSystemServerProcess中开始启动的。code
首先,由于System进程是直接fork Zygote进程的,因此要先经过closeServerSocket方法关掉server socket。server
调用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程序。
+----------------------+ +-------+ +----------+ +----------------+ +-----------+ |ActivityManagerService| |Process| |ZygoteInit| |ZygoteConnection| |RuntimeInit| +--------------+-------+ +---+---+ +-----+----+ +-----------+----+ +------+----+ | | | | | | | | | | startProcessLocked() | | | | +---------------> | | | | | | start() | | | | | "android.app.ActivityThread" | | | +-----------------> | | | | | | | | | | | | | | | |openZygoteSocketIfNeeded() | | | +------+ | | | | | | | | | | | <----+ | | | | | | | | | |sZygoteWriter.write(arg) | | | +------+ | | | | | | | | | | | | | | | | | <----+ | | | | | | | | | +--------------> | | | | | | | | | | |runSelectLoopMode() | | | | +-----------------+ | | | | | | | | | | | <---------------+ | | | | | acceptCommandPeer() | | | | | | | | | | | | | | runOnce() | | | | +------------------> | | | | | |forkAndSpecialize() | | | +-------------+ | | | | | | | | | | | <-----------+ | | | | | handleChildProc() | | | | | | | | | | | | | | | | | | | zygoteInit() | | | | +-------------> | | | | | | | | | | |in^okeStaticMain() | | | | +----------------> | | | | |("android.app.ActivityThread") | | | | | | | | | | + + + + +