android 11 点击桌面图标到activity Oncreate 思维导图
问:activity的启动,启动进程在哪里进行的呢?
ActivityStackSupervisor.startSpecificActivity》ActivityTaskManagerService.startProcessAsync》ActivityManagerService.LocalService.startProcess》startProcessLocked》ProcessList.startProcessLocked》
》ProcessList.startProcess》ProcessList.createAppZygoteForProcessIfNeeded
到这里如果按照当前进程名字没找到相应AppZygote创建一个Zygote实例
AppZygote.getProcess》AppZygote.connectToZygoteIfNeededLocked》Process.ZYGOTE_PROCESS.startChildZygote new ChildZygoteProcess(new LocalSocketAddress(processClass + "/" + UUID.randomUUID().toString()))》ZygoteProcess.waitForConnectionToZygote》ZygoteState.connect(zygoteSocketAddress, null)
Process.start》ZygoteProcess.start》ZygoteProcess.start》ZygoteProcess.zygoteSendArgsAndGetResult》ZygoteProcess.attemptZygoteSendArgsAndGetResult
接下来看 zygote.init这个类,系统启动的时候会调用这个main函数
ZygoteInit.main
1、创建 ZygoteServer
new ZygoteServer()》createManagedSocketFromInitSocket》new LocalServerSocket(fd)
这个fd 是 相当于 key 为 “ANDROID_SOCKET_zygote”修饰的FileDescriptor
2、ZygoteInit.main》ZygoteServer.runSelectLoop》ZygoteConnection.processOneCommand》Zygote.forkAndSpecialize&&handleChildProc》ZygoteInit.zygoteInit》RuntimeInit.applicationInit
》RuntimeInit.findStaticMain》cl.getMethod("main", new Class[] { String[].class })
到这里启动了main方法,className,是再ProcessList.startProcessLocked里面传进来的
这里就是通过zygote fork新进程的全过程了。