以下主要分析启动一个Activity时是如何启动这个Activity所在的进程的。
以下是当第一次启动某个应用的Activity时 system server 进程中的方法的执行流程:
ActivityManagerService#startActivity ----- >>>
ActivityTaskManagerService#startActivityAsUser() ----- >>>
ActivityStarter#execute ----- >>>
ActivityStarter#executeRequest ----- >>>
ActivityStartController#doPendingActivityLaunches ----- >>>
ActivityStarter#startResolvedActivity ----- >>>
ActivityStarter#startActivityUnchecked ----- >>>
ActivityStarter# startActivityInner ----- >>>
ActivityTaskManagerService#startProcessAsync ----- >>>
ActivityManagerService.LocalService#startProcess ----- >>>
ActivityManagerService#startProcessLocked ----- >>>
ProcessList.startProcessLocked ----- >>>
Process.start 。
当一个进程创建成功之后的处理函数是:
com.android.server.am.ProcessList#handleProcessStartedLocked(com.android.server.am.ProcessRecord, int, boolean, long, boolean)
ActivityManagerService:
知道了进程的pid ,需要获取这个pid对应的 ProcessRecord ,可以使用
ProcessRecord pr = mPidsSelfLocked.get(pid);
知道了进程的name和uid,需要获取这个name对应的 ProcessRecord ,可以使用
final ProcessRecord proc= mProcessList.mProcessNames.get(args[1], Integer.parseInt(args[2]));
何时创建一个ProcessRecord ? :
com.android.server.am.ProcessRecord.<init>(ProcessRecord.java:641)
com.android.server.am.ProcessList.newProcessRecordLocked(ProcessList.java:2877)
com.android.server.am.ProcessList.startProcessLocked(ProcessList.java:2406)
com.android.server.am.ActivityManagerService.startProcessLocked(ActivityManagerService.java:3342
创建好之后把这个ProcessRecord 放哪里了?:
ProcessList.mProcessNames
mService.addPidLocked(app);
mWindowProcessController :
com.android.server.wm.WindowProcessController#mActivities : 保存了一个进程所有的 Activities 。
ActivityRecord :
何时创建:
com.android.server.wm.WindowProcessController.addActivityIfNeeded(WindowProcessController.java:598)
com.android.server.wm.ActivityRecord.setProcess(ActivityRecord.java:1725)
com.android.server.wm.ActivityStackSupervisor.realStartActivityLocked(ActivityStackSupervisor.java:752)
com.android.server.wm.RootWindowContainer.startActivityForAttachedApplicationIfNeeded(RootWindowContainer.java:2005)
com.android.server.wm.RootWindowContainer.lambda$5fbF65VSmaJkPHxEhceOGTat7JE(Unknown Source:0)
com.android.server.wm.-$$Lambda$RootWindowContainer$5fbF65VSmaJkPHxEhceOGTat7JE.apply(Unknown Source:8)
com.android.internal.util.function.pooled.PooledLambdaImpl.doInvoke(PooledLambdaImpl.java:315)
com.android.internal.util.function.pooled.PooledLambdaImpl.invoke(PooledLambdaImpl.java:201)
com.android.internal.util.function.pooled.OmniFunction.apply(OmniFunction.java:78)
com.android.server.wm.ActivityRecord.forAllActivities(ActivityRecord.java:3642)
com.android.server.wm.WindowContainer.forAllActivities(WindowContainer.java:1335)
com.android.server.wm.WindowContainer.forAllActivities(WindowContainer.java:1325)
com.android.server.wm.RootWindowContainer.attachApplication(RootWindowContainer.java:1958)
com.android.server.wm.ActivityTaskManagerService$LocalService.attachApplication(ActivityTaskManagerService.java:6915)
com.android.server.am.ActivityManagerService.attachApplicationLocked(ActivityManagerService.java:5576)
com.android.server.am.ActivityManagerService.attachApplication(ActivityManagerService.java:5665)
android.app.IActivityManager$Stub.onTransact(IActivityManager.java:2336)
com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:3075)