Android 12 Activity启动过程
参考文献:
startActivity启动过程分析
Activity启动流程(Android 12)
概述
Activity启动发起后,是通过Binder最终交由system进程中的AMS来完成。
一、启动流程
frameworks/base/core/java/android/app/Activity.java
frameworks/base/core/java/android/app/Instrumentation.java
frameworks/base/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
frameworks/base/services/core/java/com/android/server/wm/ActivityStarter.java
frameworks/base/services/core/java/com/android/server/wm/RootWindowContainer.java
frameworks/base/services/core/java/com/android/server/wm/Task.java
frameworks/base/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java
frameworks/base/services/core/java/com/android/server/wm/ClientLifecycleManager.java
frameworks/base/core/java/android/app/servertransaction/ClientTransaction.java
frameworks/base/core/java/android/app/ActivityThread.java
frameworks/base/core/java/android/app/ClientTransactionHandler.java
frameworks/base/core/java/android/app/servertransaction/TransactionExecutor.java
frameworks/base/core/java/android/app/servertransaction/LaunchActivityItem.java
frameworks/base/core/java/android/app/Instrumentation.java
frameworks/base/core/java/android/app/Activity.java
frameworks/base/core/java/android/app/servertransaction/TransactionExecutorHelper.java
#Activity.java
├──startActivity(Intent intent)
└──startActivity(Intent intent, @Nullable Bundle options)
└──startActivityForResult(@RequiresPermission Intent intent, int requestCode,@Nullable Bundle options)
└──mInstrumentation.execStartActivity(this, mMainThread.getApplicationThread(), mToken, this, intent, requestCode, options);
#Instrumentation.java
├──execStartActivity(Context who, IBinder contextThread, IBinder token, Activity target,Intent intent, int requestCode, Bundle options)
└──int result = ActivityTaskManager.getService().startActivity(whoThread,who.getOpPackageName(), who.getAttributionTag(), intent,intent.resolveTypeIfNeeded(who.getContentResolver()), token,target != null ? target.mEmbeddedID : null, requestCode, 0, null, options);
#ActivityTaskManagerService.java
├──startActivity(IApplicationThread caller, String callingPackage,String callingFeatureId, Intent intent, String resolvedType, IBinder resultTo,String resultWho, int requestCode, int startFlags, ProfilerInfo profilerInfo,Bundle bOptions)
└──startActivityAsUser(IApplicationThread caller, String callingPackage,@Nullable String callingFeatureId, Intent intent, String resolvedType,IBinder resultTo, String resultWho, int requestCode, int startFlags,ProfilerInfo profilerInfo, Bundle bOptions, int userId, boolean validateIncomingUser)
└──return getActivityStartController().obtainStarter(intent, "startActivityAsUser")
| .setCaller(caller)
| .setCallingPackage(callingPackage)
| .setCallingFeatureId(callingFeatureId)
| .setResolvedType(resolvedType)
| .setResultTo(resultTo)
| .setResultWho(resultWho)
| .setRequestCode(requestCode)
| .setStartFlags(startFlags)
| .setProfilerInfo(profilerInfo)
| .setActivityOptions(bOptions)
| .setUserId(userId)
| .execute();
#ActivityStarter.java
├──execute()
└──res = executeRequest(mRequest);
└──executeRequest(Request request)
└──mLastStartActivityResult = startActivityUnchecked(r, sourceRecord, voiceSession,request.voiceInteractor, startFlags, true /* doResume */, checkedOptions, inTask,restrictedBgActivity, intentGrants);
└──result = startActivityInner(r, sourceRecord, voiceSession, voiceInteractor,startFlags, doResume, options, inTask, restrictedBgActivity, intentGrants);
└──mRootWindowContainer.resumeFocusedTasksTopActivities(mTargetRootTask, mStartActivity, mOptions, mTransientLaunch);
#Task.java
├──resumeTopActivityUncheckedLocked(ActivityRecord prev, ActivityOptions options,boolean deferPause)
└──someActivityResumed = resumeTopActivityInnerLocked(prev, options, deferPause);
#ActivityTaskSupervisor.java
├──startSpecificActivity(ActivityRecord r, boolean andResume, boolean checkConfig)
└──realStartActivityLocked(r, wpc, andResume, checkConfig);
└──mService.getLifecycleManager().scheduleTransaction(clientTransaction);
#ClientLifecycleManager.java
├──scheduleTransaction(ClientTransaction transaction) throws RemoteException
└──transaction.schedule();
#ClientTransaction.java
├──schedule() throws RemoteException
└──mClient.scheduleTransaction(this);
#ActivityThread.java
├──scheduleTransaction(ClientTransaction transaction)
└──sendMessage(ActivityThread.H.EXECUTE_TRANSACTION, transaction);
└──handleMessage(Message msg)
└──case EXECUTE_TRANSACTION:
└──mTransactionExecutor.execute(transaction);
#TransactionExecutor.java
├──execute(ClientTransaction transaction)
└──executeCallbacks(transaction);//执行LaunchActivityItem
| └──item.execute(mTransactionHandler, token, mPendingActions);
| #LaunchActivityItem.java
| ├──execute(ClientTransactionHandler client, IBinder token,PendingTransactionActions pendingActions)
| └──client.handleLaunchActivity(r, pendingActions, null /* customIntent */);
| #ActivityThread.java
| ├──handleLaunchActivity(ActivityClientRecord r,PendingTransactionActions pendingActions, Intent customIntent)
| └──final Activity a = performLaunchActivity(r, customIntent);
| └──if (r.isPersistable())//通过Instrumentation调用onCreate方法
| mInstrumentation.callActivityOnCreate(activity, r.state, r.persistentState);
| └──ielse
| mInstrumentation.callActivityOnCreate(activity, r.state);
| #Instrumentation.java
| ├──callActivityOnCreate(Activity activity, Bundle icicle)
| └──activity.performCreate(icicle);
| #Activity.java
| ├──performCreate(Bundle icicle)
| └──if (persistentState != null)
| onCreate(icicle, persistentState);
| └──else
| onCreate(icicle);
└──executeLifecycleState(transaction);//执行ResumeActivityItem
└──cycleToPath(r, lifecycleItem.getTargetState(), true /* excludeLastState */, transaction);
| └──final IntArray path = mHelper.getLifecyclePath(start, finish, excludeLastState);
| └──performLifecycleSequence(r, path, transaction);
└──lifecycleItem.execute(mTransactionHandler, token, mPendingActions);
1.系统进程
1.1#startActivity
<-Activity.java>
public void star