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新进程的全过程了。