根Activity的启动过程

基于Android U

Activity的启动过程分为两种,一种是根Activity的启动过程,另一种是普通Activity的启动过程。根Activity指的是应用程序启动的第一个Activity,因此根Activity的启动过程一般情况下也可以理解为应用程序的启动过程。

原本四大组件的通信都是 AMS 来处理,后期AMS过于臃肿,将Activity相关工作转移到了ATMS中。

Launcher请求ATMS过程

Launcher启动后会将已安装应用程序的快捷图标显示到桌面上,这些应用程序的快捷图标就是启动根Activity的入口,当我们点击某个应用程序的快捷图标时,就会通过Launcher请求ATMS来启动该应用程序。

当我们点击应用程序的快捷图标时,就会调用Launcher#startActivitySafely()。

1
2
3
4
5
6
7
packages/apps/Launcher3/src/com/android/launcher3/Launcher.java        
public RunnableList startActivitySafely(View v, Intent intent, ItemInfo item) {
...
RunnableList result = super.startActivitySafely(v, intent, item);
...
return result;
}

调用了super.startActivitySafely()。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class Launcher extends StatefulActivity<LauncherState>
implements LauncherExterns, Callbacks, InvariantDeviceProfile.OnIDPChangeListener,
PluginListener<LauncherOverlayPlugin> {
}

public abstract class StatefulActivity<STATE_TYPE extends BaseState<STATE_TYPE>>
extends BaseDraggingActivity {
}

public abstract class BaseDraggingActivity extends BaseActivity
implements OnColorsChangedListener, DisplayInfoChangeListener {
}

public abstract class BaseActivity extends Activity implements ActivityContext {
}

由继承关系可知,调用的是ActivityContext#startActivitySafely()。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
packages/apps/Launcher3/src/com/android/launcher3/views/ActivityContext.java
default RunnableList startActivitySafely(
View v, Intent intent, @Nullable ItemInfo item) {
...
// Prepare intent
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // 1
...
try {
boolean isShortcut = (item instanceof WorkspaceItemInfo)
&& (item.itemType == LauncherSettings.Favorites.ITEM_TYPE_SHORTCUT
|| item.itemType == LauncherSettings.Favorites.ITEM_TYPE_DEEP_SHORTCUT)
&& !((WorkspaceItemInfo) item).isPromise();
if (isShortcut) {
// Shortcuts need some special checks due to legacy reasons.
startShortcutIntentSafely(intent, optsBundle, item);
} else if (user == null || user.equals(Process.myUserHandle())) {
// Could be launching some bookkeeping activity
context.startActivity(intent, optsBundle); // 2
} else {
context.getSystemService(LauncherApps.class).startMainActivity(
intent.getComponent(), user, intent.getSourceBounds(), optsBundle);
}
...
return options.onEndCallback;
} catch (NullPointerException | ActivityNotFoundException | SecurityException e) {
...
}
return null;
}

注释1处将Flag设置为Intent.FLAG_ACTIVITY_NEW_TASK,这样根Activity会在新的任务栈中启动;

注释2处会调用Context#startActivity(),Context是抽象类,其中定义了抽象方法startActivity(),在其子类Activity中实现。

1
2
3
4
5
6
7
8
9
10
11
frameworks/base/core/java/android/app/Activity.java
public void startActivity(Intent intent, @Nullable Bundle options) {
getAutofillClientController().onStartActivity(intent, mIntent);
if (options != null) {
startActivityForResult(intent, -1, options);
} else {
// Note we want to go through this call for compatibility with
// applications that may have overridden the method.
startActivityForResult(intent, -1);
}
}

在startActivity()中调用startActivityForResult(),它的第二个参数为-1,表示Launcher不需要知道Activity启动的结果。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
frameworks/base/core/java/android/app/Activity.java
public void startActivityForResult(@RequiresPermission Intent intent, int requestCode,
@Nullable Bundle options) {
if (mParent == null) { // 1
options = transferSpringboardActivityOptions(options);
Instrumentation.ActivityResult ar =
mInstrumentation.execStartActivity(
this, mMainThread.getApplicationThread(), mToken, this,
intent, requestCode, options);
...
} else {
...
}
}

注释1处的mParent是Activity类型的,表示当前Activity的父类。因为目前根Activity还没有创建出来,因此,mParent == null为true。接着调用Instrumentation#execStartActivity()。Instrumentation主要用来监控应用程序和系统的交互。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
frameworks/base/core/java/android/app/Instrumentation.java
public ActivityResult execStartActivity(
Context who, IBinder contextThread, IBinder token, Activity target,
Intent intent, int requestCode, Bundle options) {
...
try {
...
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);
...
} catch (RemoteException e) {
throw new RuntimeException("Failure from system", e);
}
return null;
}

首先调用ActivityTaskManager#getService()来获取ATMS的代理对象,接着调用startActivity()。

先来看一下ActivityTaskManager#getService()做了什么:

1
2
3
4
5
6
7
8
9
10
11
12
13
frameworks/base/core/java/android/app/ActivityTaskManager.java
public static IActivityTaskManager getService() {
return IActivityTaskManagerSingleton.get();
}

private static final Singleton<IActivityTaskManager> IActivityTaskManagerSingleton =
new Singleton<IActivityTaskManager>() {
@Override
protected IActivityTaskManager create() {
final IBinder b = ServiceManager.getService(Context.ACTIVITY_TASK_SERVICE); // 1
return IActivityTaskManager.Stub.asInterface(b); // 2
}
};

getService()调用了IActivityTaskManagerSingleton#get()。IActivityTaskManagerSingleton是一个Singleton类。在注释1处得到名为”activity_task”的Service引用,也就是IBinder类型的ATMS引用。接着在注释2处将它转换为IActivityTaskManager类型的对象。这段代码采用的是AIDL,IActivityTaskManager.java类是由AIDL工具在编译时自动生成的,IActivityTaskManager.aidl的文件路径是frameworks/base/core/java/android/app/IActivityTaskManager.aidl。要实现进程间通信,服务器端也就是ATMS只需要继承IActivityTaskManager.Stub类并实现相应的方法就可以了。

回到Instrumentation类的execStartActivity()方法中,从上面得知execStartActivity()最终调用的是ATMS的startActivity()方法。

ATMS到ApplicationThread的调用过程

Launcher请求ATMS之后,代码逻辑已经进入ATMS中,接着是ATMS到ApplicationThread的调用流程。

1
2
3
4
5
6
7
8
9
frameworks/base/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
public final int startActivity(IApplicationThread caller, String callingPackage,
String callingFeatureId, Intent intent, String resolvedType, IBinder resultTo,
String resultWho, int requestCode, int startFlags, ProfilerInfo profilerInfo,
Bundle bOptions) {
return startActivityAsUser(caller, callingPackage, callingFeatureId, intent, resolvedType,
resultTo, resultWho, requestCode, startFlags, profilerInfo, bOptions,
UserHandle.getCallingUserId());
}

在ATMS#startActivity()中返回了startActivityAsUser()方法,startActivityAsUser()比startActivity()多了一个参数UserHandle.getCallingUserId(),这个方法会获得调用者的UserId。ATMS根据这个UserId来确定调用者的权限。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
frameworks/base/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
public int startActivityAsUser(IApplicationThread caller, String callingPackage,
String callingFeatureId, Intent intent, String resolvedType, IBinder resultTo,
String resultWho, int requestCode, int startFlags, ProfilerInfo profilerInfo,
Bundle bOptions, int userId) {
return startActivityAsUser(caller, callingPackage, callingFeatureId, intent, resolvedType,
resultTo, resultWho, requestCode, startFlags, profilerInfo, bOptions, userId,
true /*validateIncomingUser*/);
}

private int 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) {

...
enforceNotIsolatedCaller("startActivityAsUser"); // 1

...

userId = getActivityStartController().checkTargetUser(userId, validateIncomingUser,
Binder.getCallingPid(), Binder.getCallingUid(), "startActivityAsUser"); // 2
// TODO: Switch to user app stacks here.
return getActivityStartController().obtainStarter(intent, "startActivityAsUser")
.setCaller(caller)
.setCallingPackage(callingPackage)
.setCallingFeatureId(callingFeatureId)
.setResolvedType(resolvedType)
.setResultTo(resultTo)
.setResultWho(resultWho)
.setRequestCode(requestCode)
.setStartFlags(startFlags)
.setProfilerInfo(profilerInfo)
.setActivityOptions(opts)
.setUserId(userId)
.execute(); // 3
}

注释1处判断调用者进程是否被隔离,如果被隔离则抛出SecurityException异常;

注释2处检查调用者是否有权限,如果没有权限也会抛出SecurityException异常;

注释3处通过ActivityStartController来获取一个ActivityStarter,并且配置了一些参数。

ActivityStarter是加载Activity的控制类,会收集所有的逻辑来决定如何将Intent和Flags转换为Activity,并将Activity和Task相关联。execute()根据请求参数解析信息,executeRequest()执行一系列权限检查,对于合法的请求才继续。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
frameworks/base/services/core/java/com/android/server/wm/ActivityStarter.java
int execute() {
...
res = executeRequest(mRequest);
}

private int executeRequest(Request request) {
...
final IApplicationThread caller = request.caller;
...
WindowProcessController callerApp = null;
if (caller != null) { // 1
callerApp = mService.getProcessController(caller); // 2
if (callerApp != null) {
callingPid = callerApp.getPid();
callingUid = callerApp.mInfo.uid;
} else {
...
}
}

final ActivityRecord r = new ActivityRecord.Builder(mService)
.setCaller(callerApp)
.setLaunchedFromPid(callingPid)
.setLaunchedFromUid(callingUid)
.setLaunchedFromPackage(callingPackage)
.setLaunchedFromFeature(callingFeatureId)
.setIntent(intent)
.setResolvedType(resolvedType)
.setActivityInfo(aInfo)
.setConfiguration(mService.getGlobalConfiguration())
.setResultTo(resultRecord)
.setResultWho(resultWho)
.setRequestCode(requestCode)
.setComponentSpecified(request.componentSpecified)
.setRootVoiceInteraction(voiceSession != null)
.setActivityOptions(checkedOptions)
.setSourceRecord(sourceRecord)
.build();

mLastStartActivityRecord = r;
...
mLastStartActivityResult = startActivityUnchecked(r, sourceRecord, voiceSession,
request.voiceInteractor, startFlags, checkedOptions,
inTask, inTaskFragment, balCode, intentGrants, realCallingUid); // 3
...
return mLastStartActivityResult;
}

该方法中会执行一些初步的检查。

注释1处判断IApplicationThread类型的caller是否为null,caller指向的是Launcher所在的应用程序进程的ApplicationThread对象;

注释2处ActivityTaskManagerService#getProcessController()得到WindowProcessController对象,进一步获取Launcher进程的pid和uid;

接下来创建ActivityRecord,用于描述将要启动的Activity,然后注释3处调用startActivityUnchecked()。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
frameworks/base/services/core/java/com/android/server/wm/ActivityStarter.java
private int startActivityUnchecked(final ActivityRecord r, ActivityRecord sourceRecord,
IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor,
int startFlags, ActivityOptions options, Task inTask,
TaskFragment inTaskFragment, @BalCode int balCode,
NeededUriGrants intentGrants, int realCallingUid) {
int result = START_CANCELED;
final Task startedActivityRootTask;
...
try {
result = startActivityInner(r, sourceRecord, voiceSession, voiceInteractor,
startFlags, options, inTask, inTaskFragment, balCode,
intentGrants, realCallingUid);
} finally {
...
}
...

return result;
}

调用startActivityUnchecked()时表示大部分初步的权限检查已经完成,执行Trace,以及异常处理。
接着调用startActivityInner()启动Activity,并更新全局的Task栈帧信息。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
frameworks/base/services/core/java/com/android/server/wm/ActivityStarter.java
int startActivityInner(final ActivityRecord r, ActivityRecord sourceRecord,
IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor,
int startFlags, ActivityOptions options, Task inTask,
TaskFragment inTaskFragment, @BalCode int balCode,
NeededUriGrants intentGrants, int realCallingUid) {
// 这里设置了一些属性,包括mDoResume
setInitialState(r, options, inTask, inTaskFragment, startFlags, sourceRecord,
voiceSession, voiceInteractor, balCode, realCallingUid);

...

if (mDoResume) {
final ActivityRecord topTaskActivity = startedTask.topRunningActivityLocked();
if (!mTargetRootTask.isTopActivityFocusable()
|| (topTaskActivity != null && topTaskActivity.isTaskOverlay()
&& mStartActivity != topTaskActivity)) {
...
} else {
if (!mAvoidMoveToFront && mTargetRootTask.isTopActivityFocusable()
&& !mRootWindowContainer.isTopDisplayFocusedRootTask(mTargetRootTask)) {
mTargetRootTask.moveToFront("startActivityInner");
}
mRootWindowContainer.resumeFocusedTasksTopActivities( // 1
mTargetRootTask, mStartActivity, mOptions, mTransientLaunch);
}
}
...

return START_SUCCESS;
}

startActivityInner()用于启动 Activity,并更新全局的task栈帧信息,如处理singleTop、singleInstance问题,计算Intent Flag,以及栈顶复用问题等。接着调用RootWindowContainer#resumeFocusedTasksTopActivities()。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
frameworks/base/services/core/java/com/android/server/wm/RootWindowContainer.java
boolean resumeFocusedTasksTopActivities(
Task targetRootTask, ActivityRecord target, ActivityOptions targetOptions,
boolean deferPause) {
...
boolean result = false;
if (targetRootTask != null && (targetRootTask.isTopRootTaskInDisplayArea()
|| getTopDisplayFocusedRootTask() == targetRootTask)) {
result = targetRootTask.resumeTopActivityUncheckedLocked(target, targetOptions,
deferPause);
}

for (int displayNdx = getChildCount() - 1; displayNdx >= 0; --displayNdx) {
...
if (!resumedOnDisplay[0]) {
...
final Task focusedRoot = display.getFocusedRootTask();
if (focusedRoot != null) {
result |= focusedRoot.resumeTopActivityUncheckedLocked(target, targetOptions);
} else if (targetRootTask == null) {
result |= resumeHomeActivity(null /* prev */, "no-focusable-task",
display.getDefaultTaskDisplayArea());
}
}
}
return result;
}

resumeFocusedTasksTopActivities()将所有聚焦的Task的所有Activity恢复运行,因为有些刚加入的Activity是处于暂停状态的。resumeFocusedTasksTopActivities()中主要是判断传入的targetRootTask是否等于当前栈顶的 Task,不管是否相等,后续都是调用栈顶Task的resumeTopActivityUncheckedLocked()方法,启动栈顶Activity。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
frameworks/base/services/core/java/com/android/server/wm/Task.java
boolean resumeTopActivityUncheckedLocked(ActivityRecord prev, ActivityOptions options) {
return resumeTopActivityUncheckedLocked(prev, options, false /* skipPause */);
}

boolean resumeTopActivityUncheckedLocked(ActivityRecord prev, ActivityOptions options,
boolean deferPause) {
if (mInResumeTopActivity) {
// Don't even start recursing.
return false;
}

boolean someActivityResumed = false;
try {
// 确保只有一个Activity执行该方法
mInResumeTopActivity = true;

if (isLeafTask()) { // 叶子节点
if (isFocusableAndVisible()) {
someActivityResumed = resumeTopActivityInnerLocked(prev, options, deferPause);
}
} else {
int idx = mChildren.size() - 1;
while (idx >= 0) {
final Task child = (Task) getChildAt(idx--);
...
someActivityResumed |= child.resumeTopActivityUncheckedLocked(prev, options,
deferPause); // 非叶子节点
if (idx >= mChildren.size()) {
idx = mChildren.size() - 1;
}
}
}
...
} finally {
mInResumeTopActivity = false;
}

return someActivityResumed;
}

resumeTopActivityUncheckedLocked()对 Task 进行了一次判断,如果是非叶子结点,则对所有子结点递归调用本方法,递归结束(即到达叶子结点)后才继续实际流程,然后进入到 resumeTopActivityInnerLocked()。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
frameworks/base/services/core/java/com/android/server/wm/Task.java
private boolean resumeTopActivityInnerLocked(ActivityRecord prev, ActivityOptions options,
boolean deferPause) {
...
final ActivityRecord topActivity = topRunningActivity(true /* focusableOnly */);
...
final boolean[] resumed = new boolean[1];
final TaskFragment topFragment = topActivity.getTaskFragment();
resumed[0] = topFragment.resumeTopActivity(prev, options, deferPause);
forAllLeafTaskFragments(f -> {
if (topFragment == f) {
return;
}
if (!f.canBeResumed(null /* starting */)) {
return;
}
resumed[0] |= f.resumeTopActivity(prev, options, deferPause);
}, true);
return resumed[0];
}

调用TaskFragment#resumeTopActivity()。该方法主要是寻找合适的 ActivityRecord、设置 resume 条件、准备启动目标 Activity。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
/frameworks/base/services/core/java/com/android/server/wm/TaskFragment.java
final boolean resumeTopActivity(ActivityRecord prev, ActivityOptions options,
boolean deferPause) {
ActivityRecord next = topRunningActivity(true /* focusableOnly */);
if (next == null || !next.canResumeByCompat()) {
return false;
}

next.delayedResume = false;
...
if (next.attachedToProcess()) { // Activity已经附加到进程,恢复页面并更新栈
...
try {
...
} catch (Exception e) {
// Whoops, need to restart this activity!
...
mTaskSupervisor.startSpecificActivity(next, true, false);
return true;
}
} else { // 栈顶Activity没有与已有的进程关联,需要启动目标Activity。
// Whoops, need to restart this activity!
...
mTaskSupervisor.startSpecificActivity(next, true, true);
}

return true;
}

调用 ActivityTaskSupervisor#startSpecificActivity()启动新进程。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/frameworks/base/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java
void startSpecificActivity(ActivityRecord r, boolean andResume, boolean checkConfig) {
// Is this activity's application already running?
final WindowProcessController wpc =
mService.getProcessController(r.processName, r.info.applicationInfo.uid);
...
if (wpc != null && wpc.hasThread()) {
try {
...
realStartActivityLocked(r, wpc, andResume, checkConfig);
return;
} catch (RemoteException e) {
...
}
...
}
...
mService.startProcessAsync(r, knownToBeDead, isTop,
isTop ? HostingRecord.HOSTING_TYPE_TOP_ACTIVITY
: HostingRecord.HOSTING_TYPE_ACTIVITY);
}

进程已存在时执行realStartActivityLocked(),进程不存在时执行ActivityTaskManagerService#startProcessAsync()。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
/frameworks/base/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java
boolean realStartActivityLocked(ActivityRecord r, WindowProcessController proc,
boolean andResume, boolean checkConfig) throws RemoteException {
...
try {
try {
...
// Create activity launch transaction.
final ClientTransaction clientTransaction = ClientTransaction.obtain(
proc.getThread(), r.token); // 1

final boolean isTransitionForward = r.isTransitionForward();
final IBinder fragmentToken = r.getTaskFragment().getFragmentToken();

final int deviceId = getDeviceIdForDisplayId(r.getDisplayId());
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(), deviceId,
r.getFilteredReferrer(r.launchedFromPackage), task.voiceInteractor,
proc.getReportedProcState(), r.getSavedState(), r.getPersistentSavedState(),
results, newIntents, r.takeOptions(), isTransitionForward,
proc.createProfilerInfoIfNeeded(), r.assistToken, activityClientController,
r.shareableActivityToken, r.getLaunchedFromBubble(), fragmentToken)); // 2

// Set desired final state.
final ActivityLifecycleItem lifecycleItem;
if (andResume) {
lifecycleItem = ResumeActivityItem.obtain(isTransitionForward,
r.shouldSendCompatFakeFocus()); // 3
} else {
lifecycleItem = PauseActivityItem.obtain();
}
clientTransaction.setLifecycleStateRequest(lifecycleItem);

// Schedule transaction.
mService.getLifecycleManager().scheduleTransaction(clientTransaction); // 4
...
} catch (RemoteException e) {
...
}
} finally {
...
}
...
return true;
}

注释1处创建一个启动Activity事务;

注释2处添加Callback,这里创建的是LaunchActivityItem;

注释3处设置此次事务应该执行的最终状态,此次流程会设置为resume,表示Activity应该执行到onResume状态。设置ResumeActivityItem到clientTransaction中。

注释4处执行事务。

Activity的启动会通过事务来完成,事务通过目标App的IApplicationThread远程发送到目标App中,然后通过ClientLifecycleManager来执行。至此ATMS中执行的逻辑就结束了,剩下的就是目标App的ApplicationThread来执行目标Activity的各个生命周期方法了。

ApplicationThread启动Activity的过程

1
2
3
4
5
6
7
8
9
10
11
frameworks/base/services/core/java/com/android/server/wm/ClientLifecycleManager.java
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();
}
}

执行ClientTransaction#schedule()。

1
2
3
4
frameworks/base/core/java/android/app/servertransaction/ClientTransaction.java
public void schedule() throws RemoteException {
mClient.scheduleTransaction(this);
}

执行ApplicationThread#scheduleTransaction()。

1
2
3
4
frameworks/base/core/java/android/app/ActivityThread$ApplicationThread
public void scheduleTransaction(ClientTransaction transaction) throws RemoteException {
ActivityThread.this.scheduleTransaction(transaction);
}

调用ActivityThread的scheduleTransaction()方法,ActivityThread继承自ClientTransactionHandler,实际调用的是ClientTransactionHandler的scheduleTransaction()方法,传入了创建好的transaction对象。

1
2
3
4
5
frameworks/base/core/java/android/app/ClientTransactionHandler.java
void scheduleTransaction(ClientTransaction transaction) {
transaction.preExecute(this);
sendMessage(ActivityThread.H.EXECUTE_TRANSACTION, transaction);
}

调用sendMessage()方法,这里通过Handler发送了一个EXECUTE_TRANSACTION消息,会交给ActivityThread的H类来处理。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
frameworks/base/core/java/android/app/ActivityThread.java

private final TransactionExecutor mTransactionExecutor = new TransactionExecutor(this);

class H extends Handler {
...
public void handleMessage(Message msg) {
...
switch (msg.what) {
...
case EXECUTE_TRANSACTION:
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;
}
...
}
}

在handleMessage()回调方法中执行EXECUTE_TRANSACTION对应的case。首先取出ClientTransaction对象,然后调用mTransactionExecutor的execute()方法,mTransactionExecutor是一个TransactionExecutor对象,是用来处理Transaction的。

1
2
3
4
5
6
7
8
9
10
11
frameworks/base/core/java/android/app/servertransaction/TransactionExecutor.java
public void execute(ClientTransaction transaction) {
...
final IBinder token = transaction.getActivityToken();
...
executeCallbacks(transaction);

executeLifecycleState(transaction);
mPendingActions.clear();
if (DEBUG_RESOLVER) Slog.d(TAG, tId(transaction) + "End resolving transaction");
}

顺序执行executeCallbacks()和executeLifecycleState()方法。

  1. executeCallbacks()

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    frameworks/base/core/java/android/app/servertransaction/TransactionExecutor.java
    public void executeCallbacks(ClientTransaction transaction) {
    final List<ClientTransactionItem> callbacks = transaction.getCallbacks();
    ...

    final int size = callbacks.size();
    for (int i = 0; i < size; ++i) {
    final ClientTransactionItem item = callbacks.get(i);
    ...

    item.execute(mTransactionHandler, token, mPendingActions);
    item.postExecute(mTransactionHandler, token, mPendingActions);
    ...
    }
    }

    首先从系统进程传来的ClientTransaction中得到mActivityCallbacks列表,里面保存了一个LaunchActivityItem。接着通过遍历取出这个LaunchActivityItem,接着调用它的execute()方法,传入的第一个参数是持有的ActivityThread对象,第二个参数token是从系统进程传来的activityToken。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    frameworks/base/core/java/android/app/servertransaction/LaunchActivityItem.java
    public void execute(ClientTransactionHandler client, IBinder token,
    PendingTransactionActions pendingActions) {
    ...
    ActivityClientRecord r = new ActivityClientRecord(token, mIntent, mIdent, mInfo,
    mOverrideConfig, mReferrer, mVoiceInteractor, mState, mPersistentState,
    mPendingResults, mPendingNewIntents, mActivityOptions, mIsForward, mProfilerInfo,
    client, mAssistToken, mShareableActivityToken, mLaunchedFromBubble,
    mTaskFragmentToken);
    client.handleLaunchActivity(r, pendingActions, mDeviceId, null /* customIntent */);
    ...
    }

    调用了ActivityThread类的handleLaunchActivity()方法。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    frameworks/base/core/java/android/app/ActivityThread.java
    public Activity handleLaunchActivity(ActivityClientRecord r,
    PendingTransactionActions pendingActions, int deviceId, Intent customIntent) {
    ...
    final Activity a = performLaunchActivity(r, customIntent);

    if (a != null) {
    r.createdConfig = new Configuration(mConfigurationController.getConfiguration());
    reportSizeConfigurations(r);
    if (!r.activity.mFinished && pendingActions != null) {
    pendingActions.setOldState(r.state);
    pendingActions.setRestoreInstanceState(true);
    pendingActions.setCallOnPostCreate(true);
    }
    } else {
    ...
    }

    return a;
    }

    继续调用performLaunchActivity()。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    frameworks/base/core/java/android/app/ActivityThread.java
    private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {
    ...

    ContextImpl appContext = createBaseContextForActivity(r);
    Activity activity = null;
    try {
    java.lang.ClassLoader cl = appContext.getClassLoader();
    activity = mInstrumentation.newActivity(
    cl, component.getClassName(), r.intent); // 1
    StrictMode.incrementExpectedActivityCount(activity.getClass());
    r.intent.setExtrasClassLoader(cl);
    r.intent.prepareToEnterProcess(isProtectedComponent(r.activityInfo),
    appContext.getAttributionSource());
    if (r.state != null) {
    r.state.setClassLoader(cl);
    }
    } catch (Exception e) {
    ...
    }

    try {
    Application app = r.packageInfo.makeApplicationInner(false, mInstrumentation); // 2
    ...
    if (activity != null) {
    ...
    activity.attach(appContext, this, getInstrumentation(), r.token,
    r.ident, app, r.intent, r.activityInfo, title, r.parent,
    r.embeddedID, r.lastNonConfigurationInstances, config,
    r.referrer, r.voiceInteractor, window, r.activityConfigCallback,
    r.assistToken, r.shareableActivityToken); // 3
    ...
    // 4
    if (r.isPersistable()) {
    mInstrumentation.callActivityOnCreate(activity, r.state, r.persistentState);
    } else {
    mInstrumentation.callActivityOnCreate(activity, r.state);
    }
    ...
    }
    ...
    } catch (SuperNotCalledException e) {
    ...
    } catch (Exception e) {
    ...
    }

    return activity;
    }

    注释1处创建Activity实例,这里的Activity指的是我们要启动的新的XXXActivity。调用了Instrumentation类的newActivity()方法;

    注释2处尝试创建Application,r.packageInfo返回的是LoadedApk对象,调用了LoadApk的makeApplicationInner()方法。如果之前在bindApplication的时候已经创建了Application,这里直接返回之前创建的Application。

    注释3处创建Activity的PhoneWindow,并将当前线程设置成主线程。我们在这个fork出来的新进程中还没有创建其他线程,这个Activity也是该App启动的第一个Activity,所以这个Activity就是在主线程中运行的。

    注释4处调用了Instrumentation的callActivityOnCreate(),执行新Activity的onCreate生命周期。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    frameworks/base/core/java/android/app/Instrumentation.java
    public void callActivityOnCreate(Activity activity, Bundle icicle) {
    prePerformCreate(activity);
    activity.performCreate(icicle);
    postPerformCreate(activity);
    }

    frameworks/base/core/java/android/app/Activity.java
    final void performCreate(Bundle icicle) {
    performCreate(icicle, null);
    }

    final void performCreate(Bundle icicle, PersistableBundle persistentState) {
    ...
    dispatchActivityPreCreated(icicle);
    mCanEnterPictureInPicture = true;
    ...
    restoreHasCurrentPermissionRequest(icicle);
    final long startTime = SystemClock.uptimeMillis();
    if (persistentState != null) {
    onCreate(icicle, persistentState);
    } else {
    onCreate(icicle);
    }
    ...
    }
  2. executeLifecycleState()

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    frameworks/base/core/java/android/app/servertransaction/TransactionExecutor.java
    private void executeLifecycleState(ClientTransaction transaction) {
    final ActivityLifecycleItem lifecycleItem = transaction.getLifecycleStateRequest(); // 1
    if (lifecycleItem == null) {
    // No lifecycle request, return early.
    return;
    }

    final IBinder token = transaction.getActivityToken();
    final ActivityClientRecord r = mTransactionHandler.getActivityClient(token);
    if (DEBUG_RESOLVER) {
    Slog.d(TAG, tId(transaction) + "Resolving lifecycle state: "
    + lifecycleItem + " for activity: "
    + getShortActivityName(token, mTransactionHandler));
    }

    if (r == null) {
    // Ignore requests for non-existent client records for now.
    return;
    }

    // Cycle to the state right before the final requested state.
    cycleToPath(r, lifecycleItem.getTargetState(), true /* excludeLastState */, transaction); // 2

    // Execute the final transition with proper parameters.
    lifecycleItem.execute(mTransactionHandler, token, mPendingActions); // 3
    lifecycleItem.postExecute(mTransactionHandler, token, mPendingActions);
    }

    注释1处获取的是之前添加的ResumeActivityItem;

    注释2处cycleToPath()非常重要,其中的lifecycleItem.getTargetState()返回值是ON_RESUME;

    注释3处执行ResumeActivityItem的execute()。

    1. 1 onStart()阶段

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      42
      43
      frameworks/base/core/java/android/app/servertransaction/TransactionExecutor.java
      private void cycleToPath(ActivityClientRecord r, int finish, boolean excludeLastState,
      ClientTransaction transaction) {
      final int start = r.getLifecycleState(); // 1
      ...
      final IntArray path = mHelper.getLifecyclePath(start, finish, excludeLastState); // 2
      performLifecycleSequence(r, path, transaction); // 3
      }

      frameworks/base/core/java/android/app/servertransaction/TransactionExecutorHelper.java
      public IntArray getLifecyclePath(int start, int finish, boolean excludeLastState) {
      if (start == UNDEFINED || finish == UNDEFINED) {
      throw new IllegalArgumentException("Can't resolve lifecycle path for undefined state");
      }
      if (start == ON_RESTART || finish == ON_RESTART) {
      throw new IllegalArgumentException(
      "Can't start or finish in intermittent RESTART state");
      }
      if (finish == PRE_ON_CREATE && start != finish) {
      throw new IllegalArgumentException("Can only start in pre-onCreate state");
      }

      mLifecycleSequence.clear();
      if (finish >= start) {
      if (start == ON_START && finish == ON_STOP) {
      ...
      } else {
      // just go there
      for (int i = start + 1; i <= finish; i++) { // 4
      mLifecycleSequence.add(i);
      }
      }
      } else { // finish < start, can't just cycle down
      ...
      }

      // Remove last transition in case we want to perform it with some specific params.
      if (excludeLastState && mLifecycleSequence.size() != 0) { // 5
      mLifecycleSequence.remove(mLifecycleSequence.size() - 1);
      }

      return mLifecycleSequence;
      }

      注释1处的start是ON_CREATE;

      注释2处finish是ON_RESUME,path是ON_START,这里是Activity执行onStart()函数的关键所在;

      注释3处执行path中的相关的生命周期函数;

      注释4处把ON_START和ON_RESUME添加到mLifecycleSequence中;

      注释5处因为excludeLastState为true,所以删除掉ON_RESUME状态,只保留了ON_START。

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      42
      43
      44
      45
      46
      47
      48
      49
      frameworks/base/core/java/android/app/servertransaction/TransactionExecutor.java
      private void performLifecycleSequence(ActivityClientRecord r, IntArray path,
      ClientTransaction transaction) {
      final int size = path.size();
      for (int i = 0, state; i < size; i++) {
      state = path.get(i);
      if (DEBUG_RESOLVER) {
      Slog.d(TAG, tId(transaction) + "Transitioning activity: "
      + getShortActivityName(r.token, mTransactionHandler)
      + " to state: " + getStateName(state));
      }
      switch (state) {
      case ON_CREATE:
      mTransactionHandler.handleLaunchActivity(r, mPendingActions,
      Context.DEVICE_ID_INVALID, null /* customIntent */);
      break;
      case ON_START:
      mTransactionHandler.handleStartActivity(r, mPendingActions,
      null /* activityOptions */);
      break;
      case ON_RESUME:
      mTransactionHandler.handleResumeActivity(r, false /* finalStateRequest */,
      r.isForward, false /* shouldSendCompatFakeFocus */,
      "LIFECYCLER_RESUME_ACTIVITY");
      break;
      case ON_PAUSE:
      mTransactionHandler.handlePauseActivity(r, false /* finished */,
      false /* userLeaving */, 0 /* configChanges */,
      false /* autoEnteringPip */, mPendingActions,
      "LIFECYCLER_PAUSE_ACTIVITY");
      break;
      case ON_STOP:
      mTransactionHandler.handleStopActivity(r, 0 /* configChanges */,
      mPendingActions, false /* finalStateRequest */,
      "LIFECYCLER_STOP_ACTIVITY");
      break;
      case ON_DESTROY:
      mTransactionHandler.handleDestroyActivity(r, false /* finishing */,
      0 /* configChanges */, false /* getNonConfigInstance */,
      "performLifecycleSequence. cycling to:" + path.get(size - 1));
      break;
      case ON_RESTART:
      mTransactionHandler.performRestartActivity(r, false /* start */);
      break;
      default:
      throw new IllegalArgumentException("Unexpected lifecycle state: " + state);
      }
      }
      }

      state为ON_START,执行ActivityThread#handleStartActivity()。

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      frameworks/base/core/java/android/app/ActivityThread.java
      public void handleStartActivity(ActivityClientRecord r,
      PendingTransactionActions pendingActions, ActivityOptions activityOptions) {
      ...
      // Start
      activity.performStart("handleStartActivity");
      r.setState(ON_START);
      ...
      }

      frameworks/base/core/java/android/app/Activity.java
      final void performStart(String reason) {
      ...
      mInstrumentation.callActivityOnStart(this);
      ...
      }

      frameworks/base/core/java/android/app/Instrumentation.java
      public void callActivityOnStart(Activity activity) {
      activity.onStart();
      }

      最终调用了Acitvity#onStart()。

      1. 2 onResume()阶段

        1
        2
        3
        4
        5
        6
        7
        8
        frameworks/base/core/java/android/app/servertransaction/ResumeActivityItem.java
        public void execute(ClientTransactionHandler client, ActivityClientRecord r,
        PendingTransactionActions pendingActions) {
        Trace.traceBegin(TRACE_TAG_ACTIVITY_MANAGER, "activityResume");
        client.handleResumeActivity(r, true /* finalStateRequest */, mIsForward,
        mShouldSendCompatFakeFocus, "RESUME_ACTIVITY");
        Trace.traceEnd(TRACE_TAG_ACTIVITY_MANAGER);
        }

        执行ActivityThread#handleStartActivity()。

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        18
        19
        20
        21
        22
        23
        24
        25
        26
        27
        28
        29
        30
        31
        32
        33
        34
        35
        36
        frameworks/base/core/java/android/app/ActivityThread.java
        public void handleResumeActivity(ActivityClientRecord r, boolean finalStateRequest,
        boolean isForward, boolean shouldSendCompatFakeFocus, String reason) {
        ...
        if (!performResumeActivity(r, finalStateRequest, reason)) {
        return;
        }
        ...
        }

        public boolean performResumeActivity(ActivityClientRecord r, boolean finalStateRequest,
        String reason) {
        ...
        try {
        ...
        r.activity.performResume(r.startsNotResumed, reason);
        ...
        } catch (Exception e) {
        ...
        }
        return true;
        }

        frameworks/base/core/java/android/app/Activity.java
        final void performResume(boolean followedByPause, String reason) {
        ...
        mInstrumentation.callActivityOnResume(this);
        ...
        }

        frameworks/base/core/java/android/app/Instrumentation.java
        public void callActivityOnResume(Activity activity) {
        activity.mResumed = true;
        activity.onResume();
        ...
        }

        最终调用了Acitvity#onResume()。


根Activity的启动过程
https://citrus-maxima.github.io/2024/03/10/根Activity的启动过程/
作者
柚子树
发布于
2024年3月10日
许可协议