設置process name爲zygote,
AppRuntime->start(), 有可能爲com.android.internal.os.ZygoteInit(開機爲此case) 或者 RuntimeInit.
startVm(): 通過property等加載各項dalvik 參數並啓動VM。
startReg():註冊各項native jni, 如media/graphic/os/view/opengl/hardware/database/...
找到java 類並call對應類中的main方法,開機對應到ZygoteInit裏的main();
ZygoteInit: main()
registerZygoteSocket(): 創建一個socket 接收zygote命令。
preload():加載classes, resources,opengl.
startSystemServer():
Zygote.forkSystemServer()
Zygote類是vm中native定義的類,
fork啓動SystemServer
子進程進入handleSystemServerProcess()----------->下面繼續
runSelectLoop():父進程繼續執行
while循環accept zygote server socket
有新的需求後,ZygoteConnection.runOnce
forkAndSpecialize();
子進程:handleChildProc()
invokeStaticMain()啓動new request的main函數。
主要的實現方式是通過拋出異常,MethodAndArgsCaller,然後回到ZygoteInit: main()有catch到而繼續執行,MethodAndArgsCaller.run。
父進程: handleParentProc():會做一些清理工作,如果需求繼續處理,並不會remove當前request。
closeServerSocket():父進程close server socket
子進程進入handleSystemServerProcess:
RuntimeInit.zygoteInit()
RuntimeInit.applicationInit()
invokeStaticMain: SystemServer.main()
ServerThread()
:initAndLoop啓動各個framework service: AMS/WMS/PMS/....
ActivityManagerService.main() 中AMS systemready時會啓動launcher。
Launcher啓動:
Launcher的intent-filter會有HOME標籤。
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.HOME" />
AMS.startRunning();
AMS.systemReady();
resumeTopActivitiesLocked();
resumeTopActivityLocked();
ActivityStackSupervisor.resumeHomeActivity();
AMS.startHomeActivityLocked(Home intent:category.HOME);
System_server啓動參數。
String args[] = {
"--setuid=1000",
"--setgid=1000",
"--setgroups=1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1018,1032,3001,3002,3003,3006,3007",
"--capabilities=" + capabilities + "," + capabilities,
"--runtime-init",
"--nice-name=system_server",
"com.android.server.SystemServer",