frameworks 之 AMS與ActivityThread交互
- 1. 類關系
- 2. 流程
- 2.1 AMS流程
- 2.1 ActivityThread流程
- 3. 堆棧
講解AMS 如何和 ActivityThread 生命周期調用流程
涉及到的類如下
- frameworks/base/core/java/android/app/servertransaction/ResumeActivityItem.java
- frameworks/base/core/java/android/app/Activity.java
- frameworks/base/core/java/android/app/ActivityThread.java
- frameworks/base/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java
- frameworks/base/core/java/android/app/servertransaction/ClientTransaction.java
- frameworks/base/core/java/android/app/ClientTransactionHandler.java
1. 類關系
- TransactionItem** 以及其子類都為 具體執行的對象
- ClientTransaction 作為 AMS 和 ActivityThread 交互的對象,里面包含 ActivityLifecycleItem 的 mLifecycleStateRequest 和 List<ClientTransactionItem> mActivityCallbacks 成員變量。
- ActivityThread 繼承自 ClientTransactionHandler,里面包含了內部類 ApplicationThread 該類實現了 IApplicationThread.AIDL 方法。當服務端調用該AIDL方法執行app邏輯, 該內容類又會調用 ActivityThread 下的方法,部分方法實現 在 ClientTransactionHandler 中
@Overridepublic void scheduleTransaction(ClientTransaction transaction) throws RemoteException {//在父類 ClientTransactionHandlerActivityThread.this.scheduleTransaction(transaction);}
2. 流程
2.1 AMS流程
startActivity 最后會調用到 realStartActivityLocked 方法。
- 構建 ClientTransaction 負責傳遞給 界面端調用,第一個參數為客戶端IApplicationThread AIDL傳遞給變量mClient
- 通過 addCallback添加對應的執行對象
- // 將 生命周期要執行的狀態 lifecycleItem 傳遞給對應的 mLifecycleStateRequest 屬性
- 調用 scheduleTransaction 方法,里面會調用 clientTransaction 的schedule 方法,schedule方法又會調用 mClient 的scheduleTransaction,這時候調用到客戶端
// 構建 ClientTransaction 負責傳遞給 界面端調用,第一個參數為客戶端IApplicationThread AIDL傳遞給變量mClientfinal ClientTransaction clientTransaction = ClientTransaction.obtain(proc.getThread(), r.appToken);final boolean isTransitionForward = r.isTransitionForward();// 添加對應執行的LaunchActivityItem對象,用于給客戶端執行clientTransaction.addCallback(LaunchActivityItem.obtain(new Intent(r.intent),System.identityHashCode(r), r.info,// TODO: Have this take the merged configuration instead of separate global// and override configs.mergedConfiguration.getGlobalConfiguration(),mergedConfiguration.getOverrideConfiguration(), r.compat,r.getFilteredReferrer(r.launchedFromPackage), task.voiceInteractor,proc.getReportedProcState(), r.getSavedState(), r.getPersistentSavedState(),results, newIntents, r.takeOptions(), isTransitionForward,proc.createProfilerInfoIfNeeded(), r.assistToken, activityClientController,r.createFixedRotationAdjustmentsIfNeeded(), r.shareableActivityToken,r.getLaunchedFromBubble()));// Set desired final state.final ActivityLifecycleItem lifecycleItem;// 設置對應的狀態if (andResume) {lifecycleItem = ResumeActivityItem.obtain(isTransitionForward);} else {lifecycleItem = PauseActivityItem.obtain();}// 將 生命周期要執行的狀態 lifecycleItem 傳遞給對應的 mLifecycleStateRequest 屬性clientTransaction.setLifecycleStateRequest(lifecycleItem);// Schedule transaction.// 里面會調用 clientTransaction 的schedule 方法,schedule方法又會調用 mClient 的scheduleTransactionmService.getLifecycleManager().scheduleTransaction(clientTransaction);
void scheduleTransaction(ClientTransaction transaction) throws RemoteException {final IApplicationThread client = transaction.getClient();transaction.schedule();if (!(client instanceof Binder)) {// If client is not an instance of Binder - it's a remote call and at this point it is// safe to recycle the object. All objects used for local calls will be recycled after// the transaction is executed on client in ActivityThread.transaction.recycle();}}public void schedule() throws RemoteException {mClient.scheduleTransaction(this);}
2.1 ActivityThread流程
調用了 scheduleTransaction aidl 方法后,就到了 客戶端ApplicationThread 執行的方法, 該方法又會調用 scheduleTransaction,該方法在 ClientTransactionHandler 中
private class ApplicationThread extends IApplicationThread.Stub {@Overridepublic void scheduleTransaction(ClientTransaction transaction) throws RemoteException {// 在父類 ClientTransactionHandlerActivityThread.this.scheduleTransaction(transaction);}
}
查看 ClientTransactionHandler 的 scheduleTransaction 方法。
- 執行對應的 preExecute并將對應的 ActvityThread傳遞進去
- 發送了對應 handler 消息,該消息的接收在 ActvityThread
void scheduleTransaction(ClientTransaction transaction) {// 執行對應的 preExecute并將對應的 ActvityThread傳遞進去transaction.preExecute(this);// 發送消息sendMessage(ActivityThread.H.EXECUTE_TRANSACTION, transaction);}
收到消息后,執行對應的 TransactionExecutor 的 execute 方法,并和咨詢
case EXECUTE_TRANSACTION:// 該回調在其父類觸發 scheduleTransaction 發送消息final ClientTransaction transaction = (ClientTransaction) msg.obj;mTransactionExecutor.execute(transaction);if (isSystem()) {// Client transactions inside system process are recycled on the client side// instead of ClientLifecycleManager to avoid being cleared before this// message is handled.transaction.recycle();}// TODO(lifecycler): Recycle locally scheduled transactions.break;
該方法 會通過 executeCallbacks, executeLifecycleState 依次調用 服務端賦值給對應的執行實現類 。
public void execute(ClientTransaction transaction) {...executeCallbacks(transaction);// 調用對應的生命周期回調executeLifecycleState(transaction);mPendingActions.clear();if (DEBUG_RESOLVER) Slog.d(TAG, tId(transaction) + "End resolving transaction");}
onResume 對應的是 executeLifecycleState 方法,該方法會又會調用 對應 實現類的 **execute 和 postExecute ** 方法。從服務端知道 onResume 實現類為 ResumeActivityItem。
private void executeLifecycleState(ClientTransaction transaction) {....// Execute the final transition with proper parameters.lifecycleItem.execute(mTransactionHandler, token, mPendingActions);lifecycleItem.postExecute(mTransactionHandler, token, mPendingActions);}
ResumeActivityItem 的 execute 會執行 ActivityThread 的 handleResumeActivity 方法,開始進行對應 activity的 onResume 回調
@Overridepublic void execute(ClientTransactionHandler client, ActivityClientRecord r,PendingTransactionActions pendingActions) {Trace.traceBegin(TRACE_TAG_ACTIVITY_MANAGER, "activityResume");// 執行 ActivityThread 的 handleResumeActivityclient.handleResumeActivity(r, true /* finalStateRequest */, mIsForward,"RESUME_ACTIVITY");Trace.traceEnd(TRACE_TAG_ACTIVITY_MANAGER);}
handleResumeActivity 方法又會調用對應的 performResumeActivity方法,這樣就開始了 onResume回調的觸發
@Overridepublic void handleResumeActivity(ActivityClientRecord r, boolean finalStateRequest,boolean isForward, String reason) {// If we are getting ready to gc after going to the background, well// we are back active so skip it.unscheduleGcIdler();mSomeActivitiesChanged = true;// TODO Push resumeArgs into the activity for consideration// skip below steps for double-resume and r.mFinish = true case.if (!performResumeActivity(r, finalStateRequest, reason)) {return;}...}
3. 堆棧
追蹤Activity 生命周期調用 如 onResume 可以在 Activity 添加堆棧
01-16 06:26:45.387 1265 1265 E traceResume: traceResume
01-16 06:26:45.387 1265 1265 E traceResume: java.lang.NullPointerException
01-16 06:26:45.387 1265 1265 E traceResume: at android.app.Activity.onResume(Activity.java:1951)
01-16 06:26:45.387 1265 1265 E traceResume: at com.android.launcher3.BaseActivity.onResume(BaseActivity.java:182)
01-16 06:26:45.387 1265 1265 E traceResume: at com.android.launcher3.BaseDraggingActivity.onResume(BaseDraggingActivity.java:114)
01-16 06:26:45.387 1265 1265 E traceResume: at com.android.launcher3.statemanager.StatefulActivity.onResume(StatefulActivity.java:175)
01-16 06:26:45.387 1265 1265 E traceResume: at com.android.launcher3.Launcher.onResume(Launcher.java:1133)
01-16 06:26:45.387 1265 1265 E traceResume: at com.android.launcher3.BaseQuickstepLauncher.onResume(BaseQuickstepLauncher.java:133)
01-16 06:26:45.387 1265 1265 E traceResume: at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1488)
01-16 06:26:45.387 1265 1265 E traceResume: at android.app.Activity.performResume(Activity.java:8196)
01-16 06:26:45.387 1265 1265 E traceResume: at android.app.ActivityThread.performResumeActivity(ActivityThread.java:4814)
01-16 06:26:45.387 1265 1265 E traceResume: at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:4857)
01-16 06:26:45.387 1265 1265 E traceResume: at android.app.servertransaction.ResumeActivityItem.execute(ResumeActivityItem.java:54)
01-16 06:26:45.387 1265 1265 E traceResume: at android.app.servertransaction.ActivityTransactionItem.execute(ActivityTransactionItem.java:45)
01-16 06:26:45.387 1265 1265 E traceResume: at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:176)
01-16 06:26:45.387 1265 1265 E traceResume: at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:97)
01-16 06:26:45.387 1265 1265 E traceResume: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2253)
01-16 06:26:45.387 1265 1265 E traceResume: at android.os.Handler.dispatchMessage(Handler.java:106)
01-16 06:26:45.387 1265 1265 E traceResume: at android.os.Looper.loopOnce(Looper.java:201)
01-16 06:26:45.387 1265 1265 E traceResume: at android.os.Looper.loop(Looper.java:288)
01-16 06:26:45.387 1265 1265 E traceResume: at android.app.ActivityThread.main(ActivityThread.java:7870)
01-16 06:26:45.387 1265 1265 E traceResume: at java.lang.reflect.Method.invoke(Native Method)
01-16 06:26:45.387 1265 1265 E traceResume: at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
01-16 06:26:45.387 1265 1265 E traceResume: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)
onResume 的時候 執行 IApplicationThread.aidl 的 scheduleTransaction 堆棧
01-16 07:37:38.101 576 1055 E traceReumeService: traceReumeServiceResumeActivityItem{procState=-1,updateProcState=false,isForward=true}
01-16 07:37:38.101 576 1055 E traceReumeService: java.lang.NullPointerException
01-16 07:37:38.101 576 1055 E traceReumeService: at com.android.server.wm.ActivityTaskSupervisor.realStartActivityLocked(ActivityTaskSupervisor.java:878)
01-16 07:37:38.101 576 1055 E traceReumeService: at com.android.server.wm.RootWindowContainer.startActivityForAttachedApplicationIfNeeded(RootWindowContainer.java:2013)
01-16 07:37:38.101 576 1055 E traceReumeService: at com.android.server.wm.RootWindowContainer.$r8$lambda$auelgeOhCvbItmS_07q5VFEb1ac(Unknown Source:0)
01-16 07:37:38.101 576 1055 E traceReumeService: at com.android.server.wm.RootWindowContainer$$ExternalSyntheticLambda2.apply(Unknown Source:8)
01-16 07:37:38.101 576 1055 E traceReumeService: at com.android.internal.util.function.pooled.PooledLambdaImpl.doInvoke(PooledLambdaImpl.java:318)
01-16 07:37:38.101 576 1055 E traceReumeService: at com.android.internal.util.function.pooled.PooledLambdaImpl.invoke(PooledLambdaImpl.java:204)
01-16 07:37:38.101 576 1055 E traceReumeService: at com.android.internal.util.function.pooled.OmniFunction.apply(OmniFunction.java:78)
01-16 07:37:38.101 576 1055 E traceReumeService: at com.android.server.wm.ActivityRecord.forAllActivities(ActivityRecord.java:4260)
01-16 07:37:38.101 576 1055 E traceReumeService: at com.android.server.wm.WindowContainer.forAllActivities(WindowContainer.java:1449)
01-16 07:37:38.101 576 1055 E traceReumeService: at com.android.server.wm.WindowContainer.forAllActivities(WindowContainer.java:1442)
01-16 07:37:38.101 576 1055 E traceReumeService: at com.android.server.wm.RootWindowContainer.lambda$attachApplication$15$RootWindowContainer(RootWindowContainer.java:1991)
01-16 07:37:38.101 576 1055 E traceReumeService: at com.android.server.wm.RootWindowContainer$$ExternalSyntheticLambda20.accept(Unknown Source:6)
01-16 07:37:38.101 576 1055 E traceReumeService: at com.android.server.wm.Task.forAllRootTasks(Task.java:3197)
01-16 07:37:38.101 576 1055 E traceReumeService: at com.android.server.wm.WindowContainer.forAllRootTasks(WindowContainer.java:1825)
01-16 07:37:38.101 576 1055 E traceReumeService: at com.android.server.wm.WindowContainer.forAllRootTasks(WindowContainer.java:1825)
01-16 07:37:38.101 576 1055 E traceReumeService: at com.android.server.wm.WindowContainer.forAllRootTasks(WindowContainer.java:1825)
01-16 07:37:38.101 576 1055 E traceReumeService: at com.android.server.wm.WindowContainer.forAllRootTasks(WindowContainer.java:1825)
01-16 07:37:38.101 576 1055 E traceReumeService: at com.android.server.wm.WindowContainer.forAllRootTasks(WindowContainer.java:1825)
01-16 07:37:38.101 576 1055 E traceReumeService: at com.android.server.wm.WindowContainer.forAllRootTasks(WindowContainer.java:1825)
01-16 07:37:38.101 576 1055 E traceReumeService: at com.android.server.wm.WindowContainer.forAllRootTasks(WindowContainer.java:1818)
01-16 07:37:38.101 576 1055 E traceReumeService: at com.android.server.wm.RootWindowContainer.attachApplication(RootWindowContainer.java:1977)
01-16 07:37:38.101 576 1055 E traceReumeService: at com.android.server.wm.ActivityTaskManagerService$LocalService.attachApplication(ActivityTaskManagerService.java:6032)
01-16 07:37:38.101 576 1055 E traceReumeService: at com.android.server.am.ActivityManagerService.attachApplicationLocked(ActivityManagerService.java:4591)
01-16 07:37:38.101 576 1055 E traceReumeService: at com.android.server.am.ActivityManagerService.attachApplication(ActivityManagerService.java:4672)
01-16 07:37:38.101 576 1055 E traceReumeService: at android.app.IActivityManager$Stub.onTransact(IActivityManager.java:2404)
01-16 07:37:38.101 576 1055 E traceReumeService: at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:2518)
01-16 07:37:38.101 576 1055 E traceReumeService: at android.os.Binder.execTransactInternal(Binder.java:1179)
01-16 07:37:38.101 576 1055 E traceReumeService: at android.os.Binder.execTransact(Binder.java:1143)