android zygote 到launcher的启动关键点

来源:互联网 发布:淘宝图片保护怎么弄 编辑:程序博客网 时间:2024/05/16 17:09
zygote 启动:app_main.cpp main()
设置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",
0 0
原创粉丝点击