ActivityManagerService分析之Activity的启动流程

以下主要分析启动一个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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值