应用的启动:Launcher应用点击桌面应用,应用启动。
启动一个Activity我们很熟悉,就是startActivity:
- public void startActivity(Intent intent, @Nullable Bundle options) {
- 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);
- }
- }
-
- public void startActivityForResult(@RequiresPermission Intent intent, int requestCode) {
- startActivityForResult(intent, requestCode, null);
- }
-
- public void startActivityForResult(@RequiresPermission Intent intent, int requestCode, @Nullable Bundle options) {
- ....
- Instrumentation.ActivityResult ar =
- mInstrumentation.execStartActivity(
- this, mMainThread.getApplicationThread(), mToken, this,
- intent, requestCode, options);
- ....
- }
看execStartActivity方法的参数,mToken是一个IBinder,与mInstrumentation和mMainThread都在调用activity的attach方法时赋的值。
接下来继续跟进execStartActivity
- public ActivityResult execStartActivity(
- Context who, IBinder contextThread, IBinder token, Activity target,
- Intent intent, int requestCode, Bundle options) {
- ....
- try {
- intent.migrateExtraStreamToClipData();
- intent.prepareToLeaveProcess(who);
- int result = ActivityTaskManager.getService()
- .startActivity(whoThread, who.getBasePackageName(), intent,
- intent.resolveTypeIfNeeded(who.getContentResolver()),
- token, target != null ? target.mEmbeddedID : null,
- requestCode, 0, null, options);
- checkStartActivityResult(result, intent);
- } catch (RemoteException e) {
- throw new RuntimeException("Failure from system", e);
- }
- return null;
- }
这里调用了ActivityTaskManager.getService().startActivity()这个方法进行了跳转。
我们先看ActivityTaskManager.getService()
- public static IActivityTaskManager getService() {
- return IActivityTaskManagerSingleton.get();
- }
-
- public final T get() {
- synchronized (this) {
- if (mInstance == null) {
- mInstance = create();
- }
- return mInstance;
- }
- }
-
- @UnsupportedAppUsage(trackingBug = 129726065)
- private static final Singleton
IActivityTaskManagerSingleton = - new Singleton
() { - @Override
- protected IActivityTaskManager create() {
- final IBinder b = ServiceManager.getService(Context.ACTIVITY_TASK_SERVICE);
- return IActivityTaskManager.Stub.asInterface(b);
- }
- };
ActivityTaskManager.getService()中先用ServiceManager.getService(Context.ACTIVITY_TASK_SERVICE)获取了IBinder对象,按照之前分析Binder,我们知道这里可能是一个BPBinder。
然后我们将这个BPBinder再转化为IActivityTaskManager接口对象。
我们可以继续看下ServiceManager.getService(Context.ACTIVITY_TASK_SERVICE);
- public static IBinder getService(String name) {
- try {
- IBinder service = sCache.get(name);
- if (service != null) {
- return service;
- } else {
- return Binder.allowBlocking(rawGetService(name));
- }
- } catch (RemoteException e) {
- Log.e(TAG, "error in getService", e);
- }
- return null;
- }
-
- private static IBinder rawGetService(String name) throws RemoteException {
- final IBinder binder = getIServiceManager().getService(name);
- ....
- return binder;
- }
-
- private static IServiceManager getIServiceManager() {
- if (sServiceManager != null) {
- return sServiceManager;
- }
-
- // Find the service manager
- sServiceManager = ServiceManagerNative
- .asInterface(Binder.allowBlocking(BinderInternal.getContextObject()));
- return sServiceManager;
- }
-
getIServiceManager()我们之前分析过了,就是获取ServiceManagerProxy,ServiceManagerProxy是用BinderProxy封装成的,BinderProxy里面有Native的BPBinder的弱引用对象,所以ServiceManager.getService(Context.ACTIVITY_TASK_SERVICE);最后就是向BnServiceManager获取到该服务对象。
回到ActivityTaskManager.getService(Context.ACTIVITY_TASK_SERVICE).startActivity()
现在我们知道了ActivityTaskManager.getService(Context.ACTIVITY_TASK_SERVICE)是获取IActivityTaskManager对应的服务,那么我们应该怎么找到对应的服务实体?
我们全局找一下ACTIVITY_TASK_SERVICE或者IActivityTaskManager.Stub
- public class ActivityTaskManagerService extends IActivityTaskManager.Stub
-
- public static final class Lifecycle extends SystemService {
- private final ActivityTaskManagerService mService;
-
- public Lifecycle(Context context) {
- super(context);
- mService = new ActivityTaskManagerService(context);
- }
-
- @Override
- public void onStart() {
- publishBinderService(Context.ACTIVITY_TASK_SERVICE, mService);
- mService.start();
- }
- ....
- }
找到了一块熟悉的代码,Lifecycle是ATMS的内部类,这里我们之前分析过,publishBinderService就是向ServiceManager添加该服务,因为ATMS使用了AIDL,所以onTransact方法在ATMS的Stub类里面,我们这里直接看ATMS的startActivity方法
- public final int startActivity(IApplicationThread caller, String callingPackage,
- Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode,
- int startFlags, ProfilerInfo profilerInfo, Bundle bOptions) {
- return startActivityAsUser(caller, callingPackage, intent, resolvedType, resultTo,
- resultWho, requestCode, startFlags, profilerInfo, bOptions,
- UserHandle.getCallingUserId());
- }
-
- @Override
- public int startActivityAsUser(IApplicationThread caller, String callingPackage,
- Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode,
- int startFlags, ProfilerInfo profilerInfo, Bundle bOptions, int userId) {
- return startActivityAsUser(caller, callingPackage, intent, resolvedType, resultTo,
- resultWho, requestCode, startFlags, profilerInfo, bOptions, userId,
- true /*validateIncomingUser*/);
- }
-
- int startActivityAsUser(IApplicationThread caller, String callingPackage,
- Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode,
- int startFlags, ProfilerInfo profilerInfo, Bundle bOptions, int userId,
- boolean validateIncomingUser) {
- enforceNotIsolatedCaller("startActivityAsUser");
-
- userId = getActivityStartController().checkTargetUser(userId, validateIncomingUser,
- Binder.getCallingPid(), Binder.getCallingUid(), "startActivityAsUser");
-
- // TODO: Switch to user app stacks here.
- return getActivityStartController().obtainStarter(intent, "startActivityAsUser")
- .setCaller(caller)
- .setCallingPackage(callingPackage)
- .setResolvedType(resolvedType)
- .setResultTo(resultTo)
- .setResultWho(resultWho)
- .setRequestCode(requestCode)
- .setStartFlags(startFlags)
- .setProfilerInfo(profilerInfo)
- .setActivityOptions(bOptions)
- .setMayWait(userId)
- .execute();
-
- }
obtainStarter返回的是ActivityStarter对象,这里set了很多参数最后执行execute方法,这里注意调用setMayWait。
- ActivityStarter setMayWait(int userId) {
- mRequest.mayWait = true;
- mRequest.userId = userId;
-
- return this;
- }
-
- int execute() {
- try {
- // TODO(b/64750076): Look into passing request directly to these methods to allow
- // for transactional diffs and preprocessing.
- if (mRequest.mayWait) {
- return startActivityMayWait(mRequest.caller, mRequest.callingUid,
- mRequest.callingPackage, mRequest.realCallingPid, mRequest.realCallingUid,
- mRequest.intent, mRequest.resolvedType,
- mRequest.voiceSession, mRequest.voiceInteractor, mRequest.resultTo,
- mRequest.resultWho, mRequest.requestCode, mRequest.startFlags,
- mRequest.profilerInfo, mRequest.waitResult, mRequest.globalConfig,
- mRequest.activityOptions, mRequest.ignoreTargetSecurity, mRequest.userId,
- mRequest.inTask, mRequest.reason,
- mRequest.allowPendingRemoteAnimationRegistryLookup,
- mRequest.originatingPendingIntent, mRequest.allowBackgroundActivityStart);
- } else {
- return startActivity(mRequest.caller, mRequest.intent, mRequest.ephemeralIntent,
- mRequest.resolvedType, mRequest.activityInfo, mRequest.resolveInfo,
- mRequest.voiceSession, mRequest.voiceInteractor, mRequest.resultTo,
- mRequest.resultWho, mRequest.requestCode, mRequest.callingPid,
- mRequest.callingUid, mRequest.callingPackage, mRequest.realCallingPid,
- mRequest.realCallingUid, mRequest.startFlags, mRequest.activityOptions,
- mRequest.ignoreTargetSecurity, mRequest.componentSpecified,
- mRequest.outActivity, mRequest.inTask, mRequest.reason,
- mRequest.allowPendingRemoteAnimationRegistryLookup,
- mRequest.originatingPendingIntent, mRequest.allowBackgroundActivityStart);
- }
- } finally {
- onExecutionComplete();
- }
- }
mRequest.mayWait为true,走startActivityMayWait
- private int startActivityMayWait(IApplicationThread caller,....) {
- ....
- ResolveInfo rInfo = mSupervisor.resolveIntent(intent, resolvedType, userId,
- ....
- // Collect information about the target of the Intent.
- ActivityInfo aInfo = mSupervisor.resolveActivity(intent, rInfo, startFlags, profilerInfo);
- synchronized (mService.mGlobalLock) {
- .....
- final ActivityRecord[] outRecord = new ActivityRecord[1];
- int res = startActivity(caller, intent, ephemeralIntent, resolvedType, aInfo, rInfo,
- voiceSession, voiceInteractor, resultTo, resultWho, requestCode, callingPid,
- callingUid, callingPackage, realCallingPid, realCallingUid, startFlags, options,
- ignoreTargetSecurity, componentSpecified, outRecord, inTask, reason,
- allowPendingRemoteAnimationRegistryLookup, originatingPendingIntent,
- allowBackgroundActivityStart);
- ....
- if (outResult != null) {
- outResult.result = res;
- final ActivityRecord r = outRecord[0];
- switch(res) {
- case START_SUCCESS: {
- mSupervisor.mWaitingActivityLaunched.add(outResult);
- do {
- try {
- mService.mGlobalLock.wait();
- } catch (InterruptedException e) {
- }
- } while (outResult.result != START_TASK_TO_FRONT
- && !outResult.timeout && outResult.who == null);
- if (outResult.result == START_TASK_TO_FRONT) {
- res = START_TASK_TO_FRONT;
- }
- break;
- }
- case START_DELIVERED_TO_TOP: {
- outResult.timeout = false;
- outResult.who = r.mActivityComponent;
- outResult.totalTime = 0;
- break;
- }
- case START_TASK_TO_FRONT: {
- .....
- break;
- }
- }
- }
- return res;
- }
- }
-
- private int startActivity(IApplicationThread caller, Intent intent, ....) {
- if (TextUtils.isEmpty(reason)) {
- throw new IllegalArgumentException("Need to specify a reason.");
- }
- mLastStartReason = reason;
- mLastStartActivityTimeMs = System.currentTimeMillis();
- mLastStartActivityRecord[0] = null;
-
- mLastStartActivityResult = startActivity(caller, intent, ephemeralIntent, resolvedType,
- aInfo, rInfo, voiceSession, voiceInteractor, resultTo, resultWho, requestCode,
- callingPid, callingUid, callingPackage, realCallingPid, realCallingUid, startFlags,
- options, ignoreTargetSecurity, componentSpecified, mLastStartActivityRecord,
- inTask, allowPendingRemoteAnimationRegistryLookup, originatingPendingIntent,
- allowBackgroundActivityStart);
-
- if (outActivity != null) {
- // mLastStartActivityRecord[0] is set in the call to startActivity above.
- outActivity[0] = mLastStartActivityRecord[0];
- }
-
- return getExternalResult(mLastStartActivityResult);
- }
-
- private int startActivity(IApplicationThread caller, Intent intent, ....) {
- .....
- final int res = startActivity(r, sourceRecord, voiceSession, voiceInteractor, startFlags,
- true /* doResume */, checkedOptions, inTask, outActivity, restrictedBgActivity);
- mSupervisor.getActivityMetricsLogger().notifyActivityLaunched(res, outActivity[0]);
- return res;
- }
-
- private int startActivity(final ActivityRecord r, .....) {
- int result = START_CANCELED;
- final ActivityStack startedActivityStack;
- try {
- mService.mWindowManager.deferSurfaceLayout();
- result = startActivityUnchecked(r, sourceRecord, voiceSession, voiceInteractor,
- startFlags, doResume, options, inTask, outActivity, restrictedBgActivity);
- }
- ......
-
- return result;
- }
-
- private int startActivityUnchecked(final ActivityRecord r, ....) {
- .....
- mTargetStack.startActivityLocked(mStartActivity, topFocused, newTask, mKeepCurTransition,
- mOptions);
- if (mDoResume) {
- final ActivityRecord topTaskActivity =
- mStartActivity.getTaskRecord().topRunningActivityLocked();
- if (!mTargetStack.isFocusable()
- || (topTaskActivity != null && topTaskActivity.mTaskOverlay
- && mStartActivity != topTaskActivity)) {
- // If the activity is not focusable, we can't resume it, but still would like to
- // make sure it becomes visible as it starts (this will also trigger entry
- // animation). An example of this are PIP activities.
- // Also, we don't want to resume activities in a task that currently has an overlay
- // as the starting activity just needs to be in the visible paused state until the
- // over is removed.
- mTargetStack.ensureActivitiesVisibleLocked(mStartActivity, 0, !PRESERVE_WINDOWS);
- // Go ahead and tell window manager to execute app transition for this activity
- // since the app transition will not be triggered through the resume channel.
- mTargetStack.getDisplay().mDisplayContent.executeAppTransition();
- } else {
- // If the target stack was not previously focusable (previous top running activity
- // on that stack was not visible) then any prior calls to move the stack to the
- // will not update the focused stack. If starting the new activity now allows the
- // task stack to be focusable, then ensure that we now update the focused stack
- // accordingly.
- if (mTargetStack.isFocusable()
- && !mRootActivityContainer.isTopDisplayFocusedStack(mTargetStack)) {
- mTargetStack.moveToFront("startActivityUnchecked");
- }
- mRootActivityContainer.resumeFocusedStacksTopActivities(
- mTargetStack, mStartActivity, mOptions);
- }
- } else if (mStartActivity != null) {
- mSupervisor.mRecentTasks.add(mStartActivity.getTaskRecord());
- }
- mRootActivityContainer.updateUserStack(mStartActivity.mUserId, mTargetStack);
-
- mSupervisor.handleNonResizableTaskIfNeeded(mStartActivity.getTaskRecord(),
- preferredWindowingMode, mPreferredDisplayId, mTargetStack);
-
- return START_SUCCESS;
- }
-
startActivityUnchecked()调用了mTargetStack.startActivityLocked(),这个方法比较重要。
- void startActivityLocked(ActivityRecord r, ActivityRecord focusedTopActivity,
- boolean newTask, boolean keepCurTransition, ActivityOptions options) {
- TaskRecord rTask = r.getTaskRecord();
- final int taskId = rTask.taskId;
- final boolean allowMoveToFront = options == null || !options.getAvoidMoveToFront();
- // mLaunchTaskBehind tasks get placed at the back of the task stack.
- if (!r.mLaunchTaskBehind && allowMoveToFront
- && (taskForIdLocked(taskId) == null || newTask)) {
- // Last activity in task had been removed or ActivityManagerService is reusing task.
- // Insert or replace.
- // Might not even be in.
- insertTaskAtTop(rTask, r);
- }
- TaskRecord task = null;
- if (!newTask) {
- // If starting in an existing task, find where that is...
- boolean startIt = true;
- for (int taskNdx = mTaskHistory.size() - 1; taskNdx >= 0; --taskNdx) {
- task = mTaskHistory.get(taskNdx);
- if (task.getTopActivity() == null) {
- // All activities in task are finishing.
- continue;
- }
- if (task == rTask) {
- // Here it is! Now, if this is not yet visible to the
- // user, then just add it without starting; it will
- // get started when the user navigates back to it.
- if (!startIt) {
- if (DEBUG_ADD_REMOVE) Slog.i(TAG, "Adding activity " + r + " to task "
- + task, new RuntimeException("here").fillInStackTrace());
- r.createAppWindowToken();
- ActivityOptions.abort(options);
- return;
- }
- break;
- } else if (task.numFullscreen > 0) {
- startIt = false;
- }
- }
- }
startActivityLocked方法就是找到要启动的Activity的TaskRecord,并将activity插入到合适位置。 这样activity对应ActivityRecord就加入到对应ActivityStack中的对应的TaskRecord中了。
mRootActivityContainer.resumeFocusedStacksTopActivities(mTargetStack, mStartActivity, mOptions);
- boolean resumeFocusedStacksTopActivities(
- ActivityStack targetStack, ActivityRecord target, ActivityOptions targetOptions) {
- ....
- if (targetStack != null && (targetStack.isTopStackOnDisplay()
- || getTopDisplayFocusedStack() == targetStack)) {
- result = targetStack.resumeTopActivityUncheckedLocked(target, targetOptions);
- }
- ....
- return result;
- }
-
- boolean resumeTopActivityUncheckedLocked(ActivityRecord prev, ActivityOptions options) {
- ....
- result = resumeTopActivityInnerLocked(prev, options);
- ....
- return result;
- }
-
- private boolean resumeTopActivityInnerLocked(ActivityRecord prev, ActivityOptions options) {
- ActivityRecord next = topRunningActivityLocked(true /* focusableOnly */);
- ....
- if (next.attachedToProcess()) {
- .....
- } else {
- .....
- mStackSupervisor.startSpecificActivityLocked(next, true, true);
- }
- return true;
- }
-
- void startSpecificActivityLocked(ActivityRecord r, boolean andResume, boolean checkConfig) {
- // Is this activity's application already running?
- final WindowProcessController wpc =
- mService.getProcessController(r.processName, r.info.applicationInfo.uid);
-
- boolean knownToBeDead = false;
- if (wpc != null && wpc.hasThread()) {
- ....
- realStartActivityLocked(r, wpc, andResume, checkConfig);
- return;
- ....
- }
- // Post message to start process to avoid possible deadlock of calling into AMS with the ATMS lock held.
- final Message msg = PooledLambda.obtainMessage(
- ActivityManagerInternal::startProcess, mService.mAmInternal, r.processName,
- r.info.applicationInfo, knownToBeDead, "activity", r.intent.getComponent());
- mService.mH.sendMessage(msg);
- ....
- }
显然应用还没启动,所以会走到下面的sendMessage,我们可以看到参数里ActivityManagerInternal::startProcess方法,ActivityManagerInternal是个抽象类。
mService.mH是什么呢
final ActivityTaskManagerService mService;
H mH;
所以mService.mH.sendMessage(msg);发送到了ATMS的Handler。
AMS中有的内部类LocalService继承了ActivityManagerInternal,
public final class LocalService extends ActivityManagerInternal
- public void startProcess(String processName, ApplicationInfo info,
- boolean knownToBeDead, String hostingType, ComponentName hostingName) {
- synchronized (ActivityManagerService.this) {
- startProcessLocked(processName, info, knownToBeDead, 0 /* intentFlags */,
- new HostingRecord(hostingType, hostingName),
- false /* allowWhileBooting */, false /* isolated */,
- true /* keepIfLarge */);
- }
- }
-
- final ProcessRecord startProcessLocked(String processName,
- ApplicationInfo info, boolean knownToBeDead, int intentFlags,
- HostingRecord hostingRecord, boolean allowWhileBooting,
- boolean isolated, boolean keepIfLarge) {
- return mProcessList.startProcessLocked(processName, info, knownToBeDead, intentFlags,
- hostingRecord, allowWhileBooting, isolated, 0 /* isolatedUid */, keepIfLarge,
- null /* ABI override */, null /* entryPoint */, null /* entryPointArgs */,
- null /* crashHandler */);
- }
- final ProcessRecord startProcessLocked(String processName, ApplicationInfo info,...) {
- ProcessRecord app;
- if (app == null) {
- app = newProcessRecordLocked(info, processName, isolated, isolatedUid, hostingRecord);
- .....
- } else {
- // If this is a new package in the process, add the package to the list
- app.addPackage(info.packageName, info.longVersionCode, mService.mProcessStats);
- }
- final boolean success = startProcessLocked(app, hostingRecord, abiOverride);
- return success ? app : null;
- }
-
- final boolean startProcessLocked(ProcessRecord app, HostingRecord hostingRecord,
- String abiOverride) {
- return startProcessLocked(app, hostingRecord,
- false /* disableHiddenApiChecks */, false /* mountExtStorageFull */, abiOverride);
- }
-
- boolean startProcessLocked(ProcessRecord app, HostingRecord hostingRecord,
- boolean disableHiddenApiChecks, boolean mountExtStorageFull,
- String abiOverride) {
- AppGlobals.getPackageManager().checkPackageStartable(app.info.packageName, userId);
- ....
- // Start the process. It will either succeed and return a result containing
- // the PID of the new process, or else throw a RuntimeException.
- final String entryPoint = "android.app.ActivityThread";
- return startProcessLocked(hostingRecord, entryPoint, app, uid, gids,
- runtimeFlags, mountExternal, seInfo, requiredAbi, instructionSet, invokeWith,
- startTime);
- } catch (RuntimeException e) {
- mService.forceStopPackageLocked(app.info.packageName, UserHandle.getAppId(app.uid),
- false, false, true, false, false, app.userId, "start failure");
- return false;
- }
- }
-
- boolean startProcessLocked(HostingRecord hostingRecord, ....) {
- ....
- final Process.ProcessStartResult startResult = startProcess(hostingRecord,
- entryPoint, app,
- uid, gids, runtimeFlags, mountExternal, seInfo, requiredAbi, instructionSet,
- invokeWith, startTime);
- handleProcessStartedLocked(app, startResult.pid, startResult.usingWrapper,
- startSeq, false);
- return app.pid > 0;
- }
-
- private Process.ProcessStartResult startProcess(HostingRecord hostingRecord, ....) {
- try {
- final Process.ProcessStartResult startResult;
- if (hostingRecord.usesWebviewZygote()) {
- startResult = startWebView(entryPoint,
- app.processName, uid, uid, gids, runtimeFlags, mountExternal,
- app.info.targetSdkVersion, seInfo, requiredAbi, instructionSet,
- app.info.dataDir, null, app.info.packageName,
- new String[] {PROC_START_SEQ_IDENT + app.startSeq});
- } else if (hostingRecord.usesAppZygote()) {
- final AppZygote appZygote = createAppZygoteForProcessIfNeeded(app);
-
- startResult = appZygote.getProcess().start(entryPoint,
- app.processName, uid, uid, gids, runtimeFlags, mountExternal,
- app.info.targetSdkVersion, seInfo, requiredAbi, instructionSet,
- app.info.dataDir, null, app.info.packageName,
- /*useUsapPool=*/ false,
- new String[] {PROC_START_SEQ_IDENT + app.startSeq});
- } else {
- startResult = Process.start(entryPoint,
- app.processName, uid, uid, gids, runtimeFlags, mountExternal,
- app.info.targetSdkVersion, seInfo, requiredAbi, instructionSet,
- app.info.dataDir, invokeWith, app.info.packageName,
- new String[] {PROC_START_SEQ_IDENT + app.startSeq});
- }
- return startResult;
- } finally {
- Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
- }
- }
- public static ProcessStartResult start(@NonNull final String processClass,
- @Nullable final String niceName,
- int uid, int gid, @Nullable int[] gids,
- int runtimeFlags,
- int mountExternal,
- int targetSdkVersion,
- @Nullable String seInfo,
- @NonNull String abi,
- @Nullable String instructionSet,
- @Nullable String appDataDir,
- @Nullable String invokeWith,
- @Nullable String packageName,
- @Nullable String[] zygoteArgs) {
- return ZYGOTE_PROCESS.start(processClass, niceName, uid, gid, gids,
- runtimeFlags, mountExternal, targetSdkVersion, seInfo,
- abi, instructionSet, appDataDir, invokeWith, packageName,
- /*useUsapPool=*/ true, zygoteArgs);
- }
- public final Process.ProcessStartResult start(@NonNull final String processClass,
- final String niceName,
- int uid, int gid, @Nullable int[] gids,
- int runtimeFlags, int mountExternal,
- int targetSdkVersion,
- @Nullable String seInfo,
- @NonNull String abi,
- @Nullable String instructionSet,
- @Nullable String appDataDir,
- @Nullable String invokeWith,
- @Nullable String packageName,
- boolean useUsapPool,
- @Nullable String[] zygoteArgs) {
- // TODO (chriswailes): Is there a better place to check this value?
- if (fetchUsapPoolEnabledPropWithMinInterval()) {
- informZygotesOfUsapPoolStatus();
- }
-
- try {
- return startViaZygote(processClass, niceName, uid, gid, gids,
- runtimeFlags, mountExternal, targetSdkVersion, seInfo,
- abi, instructionSet, appDataDir, invokeWith, /*startChildZygote=*/ false,
- packageName, useUsapPool, zygoteArgs);
- } catch (ZygoteStartFailedEx ex) {
- Log.e(LOG_TAG,
- "Starting VM process through Zygote failed");
- }
- }
-
- private Process.ProcessStartResult startViaZygote(@NonNull final String processClass,
- @Nullable final String niceName,
- final int uid, final int gid,
- @Nullable final int[] gids,
- int runtimeFlags, int mountExternal,
- int targetSdkVersion,
- @Nullable String seInfo,
- @NonNull String abi,
- @Nullable String instructionSet,
- @Nullable String appDataDir,
- @Nullable String invokeWith,
- boolean startChildZygote,
- @Nullable String packageName,
- boolean useUsapPool,
- @Nullable String[] extraArgs)
- throws ZygoteStartFailedEx {
- ArrayList
argsForZygote = new ArrayList<>(); -
- // --runtime-args, --setuid=, --setgid=,
- // and --setgroups= must go first
- argsForZygote.add("--runtime-args");
- argsForZygote.add("--setuid=" + uid);
- argsForZygote.add("--setgid=" + gid);
- argsForZygote.add("--runtime-flags=" + runtimeFlags);
- if (mountExternal == Zygote.MOUNT_EXTERNAL_DEFAULT) {
- argsForZygote.add("--mount-external-default");
- } else if (mountExternal == Zygote.MOUNT_EXTERNAL_READ) {
- argsForZygote.add("--mount-external-read");
- } else if (mountExternal == Zygote.MOUNT_EXTERNAL_WRITE) {
- argsForZygote.add("--mount-external-write");
- } else if (mountExternal == Zygote.MOUNT_EXTERNAL_FULL) {
- argsForZygote.add("--mount-external-full");
- } else if (mountExternal == Zygote.MOUNT_EXTERNAL_INSTALLER) {
- argsForZygote.add("--mount-external-installer");
- } else if (mountExternal == Zygote.MOUNT_EXTERNAL_LEGACY) {
- argsForZygote.add("--mount-external-legacy");
- }
-
- argsForZygote.add("--target-sdk-version=" + targetSdkVersion);
-
- // --setgroups is a comma-separated list
- if (gids != null && gids.length > 0) {
- StringBuilder sb = new StringBuilder();
- sb.append("--setgroups=");
-
- int sz = gids.length;
- for (int i = 0; i < sz; i++) {
- if (i != 0) {
- sb.append(',');
- }
- sb.append(gids[i]);
- }
-
- argsForZygote.add(sb.toString());
- }
-
- if (niceName != null) {
- argsForZygote.add("--nice-name=" + niceName);
- }
-
- if (seInfo != null) {
- argsForZygote.add("--seinfo=" + seInfo);
- }
-
- if (instructionSet != null) {
- argsForZygote.add("--instruction-set=" + instructionSet);
- }
-
- if (appDataDir != null) {
- argsForZygote.add("--app-data-dir=" + appDataDir);
- }
-
- if (invokeWith != null) {
- argsForZygote.add("--invoke-with");
- argsForZygote.add(invokeWith);
- }
-
- if (startChildZygote) {
- argsForZygote.add("--start-child-zygote");
- }
-
- if (packageName != null) {
- argsForZygote.add("--package-name=" + packageName);
- }
-
- argsForZygote.add(processClass);
-
- if (extraArgs != null) {
- Collections.addAll(argsForZygote, extraArgs);
- }
-
- synchronized(mLock) {
- // The USAP pool can not be used if the application will not use the systems graphics
- // driver. If that driver is requested use the Zygote application start path.
- return zygoteSendArgsAndGetResult(openZygoteSocketIfNeeded(abi),
- useUsapPool,
- argsForZygote);
- }
- }
-
- private Process.ProcessStartResult zygoteSendArgsAndGetResult(
- ZygoteState zygoteState, boolean useUsapPool, @NonNull ArrayList
args) - throws ZygoteStartFailedEx {
- ....
- return attemptZygoteSendArgsAndGetResult(zygoteState, msgStr);
- }
-
- private Process.ProcessStartResult attemptZygoteSendArgsAndGetResult(
- ZygoteState zygoteState, String msgStr) throws ZygoteStartFailedEx {
- try {
- final BufferedWriter zygoteWriter = zygoteState.mZygoteOutputWriter;
- final DataInputStream zygoteInputStream = zygoteState.mZygoteInputStream;
-
- zygoteWriter.write(msgStr);
- zygoteWriter.flush();
-
- // Always read the entire result from the input stream to avoid leaving
- // bytes in the stream for future process starts to accidentally stumble
- // upon.
- Process.ProcessStartResult result = new Process.ProcessStartResult();
- result.pid = zygoteInputStream.readInt();
- result.usingWrapper = zygoteInputStream.readBoolean();
-
- if (result.pid < 0) {
- throw new ZygoteStartFailedEx("fork() failed");
- }
-
- return result;
- } catch (IOException ex) {
- zygoteState.close();
- Log.e(LOG_TAG, "IO Exception while communicating with Zygote - "
- + ex.toString());
- throw new ZygoteStartFailedEx(ex);
- }
- }
终于来到与Zygote相关的了,在这前面就是各种判断和配置参数,我们先看openZygoteSocketIfNeeded(abi)
- private ZygoteState openZygoteSocketIfNeeded(String abi) throws ZygoteStartFailedEx {
- try {
- attemptConnectionToPrimaryZygote();
-
- if (primaryZygoteState.matches(abi)) {
- return primaryZygoteState;
- }
-
- if (mZygoteSecondarySocketAddress != null) {
- // The primary zygote didn't match. Try the secondary.
- attemptConnectionToSecondaryZygote();
-
- if (secondaryZygoteState.matches(abi)) {
- return secondaryZygoteState;
- }
- }
- } catch (IOException ioe) {
- throw new ZygoteStartFailedEx("Error connecting to zygote", ioe);
- }
-
- throw new ZygoteStartFailedEx("Unsupported zygote ABI: " + abi);
- }
-
- private void attemptConnectionToPrimaryZygote() throws IOException {
- if (primaryZygoteState == null || primaryZygoteState.isClosed()) {
- primaryZygoteState =
- ZygoteState.connect(mZygoteSocketAddress, mUsapPoolSocketAddress);
-
- maybeSetApiBlacklistExemptions(primaryZygoteState, false);
- maybeSetHiddenApiAccessLogSampleRate(primaryZygoteState);
- maybeSetHiddenApiAccessStatslogSampleRate(primaryZygoteState);
- }
- }
-
- static ZygoteState connect(@NonNull LocalSocketAddress zygoteSocketAddress,
- @Nullable LocalSocketAddress usapSocketAddress)
- throws IOException {
-
- DataInputStream zygoteInputStream;
- BufferedWriter zygoteOutputWriter;
- final LocalSocket zygoteSessionSocket = new LocalSocket();
-
- if (zygoteSocketAddress == null) {
- throw new IllegalArgumentException("zygoteSocketAddress can't be null");
- }
-
- try {
- zygoteSessionSocket.connect(zygoteSocketAddress);
- zygoteInputStream = new DataInputStream(zygoteSessionSocket.getInputStream());
- zygoteOutputWriter =
- new BufferedWriter(
- new OutputStreamWriter(zygoteSessionSocket.getOutputStream()),
- Zygote.SOCKET_BUFFER_SIZE);
- } catch (IOException ex) {
- try {
- zygoteSessionSocket.close();
- } catch (IOException ignore) { }
-
- throw ex;
- }
-
- return new ZygoteState(zygoteSocketAddress, usapSocketAddress,
- zygoteSessionSocket, zygoteInputStream, zygoteOutputWriter,
- getAbiList(zygoteOutputWriter, zygoteInputStream));
- }
openZygoteSocketIfNeeded方法中连接了Zygote线程的socket,并获取输入输出流对象。
zygoteSessionSocket.connect(zygoteSocketAddress);
zygoteSocketAddress是方法参数,是attemptConnectionToPrimaryZygote方法传进来的,参数是mZygoteSocketAddress,mZygoteSocketAddress是ZygoteProcess类的成员变量。
/**
* The name of the socket used to communicate with the primary zygote.
*/
private final LocalSocketAddress mZygoteSocketAddress;
找一下那里赋值的,
- public ZygoteProcess() {
- mZygoteSocketAddress =
- new LocalSocketAddress(Zygote.PRIMARY_SOCKET_NAME,
- LocalSocketAddress.Namespace.RESERVED);
- mZygoteSecondarySocketAddress =
- new LocalSocketAddress(Zygote.SECONDARY_SOCKET_NAME,
- LocalSocketAddress.Namespace.RESERVED);
-
- mUsapPoolSocketAddress =
- new LocalSocketAddress(Zygote.USAP_POOL_PRIMARY_SOCKET_NAME,
- LocalSocketAddress.Namespace.RESERVED);
- mUsapPoolSecondarySocketAddress =
- new LocalSocketAddress(Zygote.USAP_POOL_SECONDARY_SOCKET_NAME,
- LocalSocketAddress.Namespace.RESERVED);
- }
- public static final String PRIMARY_SOCKET_NAME = "zygote";
- public static final String SECONDARY_SOCKET_NAME = "zygote_secondary";
所以zygoteSessionSocket.connect(zygoteSocketAddress)相当于
zygoteSessionSocket.connect("zygote");这个值有点熟悉,我们回到ZygoteInit的main函数看下。
- public static void main(String argv[]) {
- ZygoteServer zygoteServer = null
- Runnable caller;
- try {
- ....
- String zygoteSocketName = "zygote";
- final boolean isPrimaryZygote = zygoteSocketName.equals(Zygote.PRIMARY_SOCKET_NAME);
- ....
- zygoteServer = new ZygoteServer(isPrimaryZygote);
- Log.i(TAG, "Accepting command socket connections");
- // The select loop returns early in the child process after a fork and
- // loops forever in the zygote.
- caller = zygoteServer.runSelectLoop(abiList);
- } catch (Throwable ex) {
- Log.e(TAG, "System zygote died with exception", ex);
- throw ex;
- } finally {
- if (zygoteServer != null) {
- zygoteServer.closeServerSocket();
- }
- }
- if (caller != null) {
- caller.run();
- }
- }
-
- ZygoteServer(boolean isPrimaryZygote) {
- mUsapPoolEventFD = Zygote.getUsapPoolEventFD();
-
- if (isPrimaryZygote) {
- mZygoteSocket = Zygote.createManagedSocketFromInitSocket(Zygote.PRIMARY_SOCKET_NAME);
- mUsapPoolSocket =
- Zygote.createManagedSocketFromInitSocket(
- Zygote.USAP_POOL_PRIMARY_SOCKET_NAME);
- } else {
- mZygoteSocket = Zygote.createManagedSocketFromInitSocket(Zygote.SECONDARY_SOCKET_NAME);
- mUsapPoolSocket =
- Zygote.createManagedSocketFromInitSocket(
- Zygote.USAP_POOL_SECONDARY_SOCKET_NAME);
- }
-
- fetchUsapPoolPolicyProps();
-
- mUsapPoolSupported = true;
- }
main里面创建了ZygoteServer,这里的isPrimaryZygote为true,我们看到了熟悉的常量Zygote.PRIMARY_SOCKET_NAME,所以这里用“zyogte”创建了Socket服务器,如果isPrimaryZygote为false的话就是第二个socket地址。我们在连接的时候连不上第一个socket服务器也会去尝试连接第二个。
main最后
caller = zygoteServer.runSelectLoop(abiList);
caller.run();
是开启了Socket轮询,对于请求的处理在之前的文章已经分析过了。
就是接收到socket连接的时候会去调用native层的fork方法创建一个新的进程。
我们在ProcessList.java的startProcessLocked方法中将
final String entryPoint = "android.app.ActivityThread";
作为参数最后传到socket,socket收到请求数据后,在ZygoteConnection的processOneCommand方法中会用反射执行ActivityThread的main函数。
- protected static Runnable findStaticMain(String className, String[] argv,
- ClassLoader classLoader) {
- Class> cl;
-
- try {
- cl = Class.forName(className, true, classLoader);
- } catch (ClassNotFoundException ex) {
- throw new RuntimeException(
- "Missing class when invoking static main " + className,
- ex);
- }
-
- Method m;
- try {
- m = cl.getMethod("main", new Class[] { String[].class });
- } catch (NoSuchMethodException ex) {
- throw new RuntimeException(
- "Missing static main on " + className, ex);
- } catch (SecurityException ex) {
- throw new RuntimeException(
- "Problem getting static main on " + className, ex);
- }
-
- int modifiers = m.getModifiers();
- if (! (Modifier.isStatic(modifiers) && Modifier.isPublic(modifiers))) {
- throw new RuntimeException(
- "Main method is not public and static on " + className);
- }
-
- /*
- * This throw gets caught in ZygoteInit.main(), which responds
- * by invoking the exception's run() method. This arrangement
- * clears up all the stack frames that were required in setting
- * up the process.
- */
- return new MethodAndArgsCaller(m, argv);
- }
我们看ActivityThread的main方法
- public static void main(String[] args) {
- ...
- Looper.prepareMainLooper();
- ...
- ActivityThread thread = new ActivityThread();
- thread.attach(false, startSeq);
- ...
- Looper.loop();
- }
main中先去创建主线程的Looper然后去生成ActivityThread对象然后调用attach方法,最后去开启轮询。
- @UnsupportedAppUsage
- private void attach(boolean system, long startSeq) {
- sCurrentActivityThread = this;
- mSystemThread = system;
- if (!system) {
- ....
- final IActivityManager mgr = ActivityManager.getService();
- try {
- mgr.attachApplication(mAppThread, startSeq);
- } catch (RemoteException ex) {
- throw ex.rethrowFromSystemServer();
- }
- // Watch for getting close to heap limit.
- BinderInternal.addGcWatcher(new Runnable() {
- @Override public void run() {
- ....
- });
- } else {
- ...
- }
-
- ViewRootImpl.ConfigChangedCallback configChangedCallback
- = (Configuration globalConfig) -> {
- synchronized (mResourcesManager) {
- ....
- };
- ViewRootImpl.addConfigCallback(configChangedCallback);
- }
attach里面如果是systemServer的进程就走else,IActivityManager对应的是AMS,我们直接看AMS的attachApplication方法
- @Override
- public final void attachApplication(IApplicationThread thread, long startSeq) {
- synchronized (this) {
- ...
- attachApplicationLocked(thread, callingPid, callingUid, startSeq);
- Binder.restoreCallingIdentity(origId);
- }
- }
-
- private final boolean attachApplicationLocked(IApplicationThread thread,
- int pid, int callingUid, long startSeq) {
- ProcessRecord app;
- long startTime = SystemClock.uptimeMillis();
- long bindApplicationTimeMillis;
- ....
- app = mPidsSelfLocked.get(pid);
- // If this application record is still attached to a previous
- // process, clean it up now.
- if (app.thread != null) {
- handleAppDiedLocked(app, true, true);
- }
- app.makeActive(thread, mProcessStats);
- //mProcessesReady这个变量在AMS的 systemReady 中被赋值为true,
- //所以这里的normalMode也为true
- boolean normalMode = mProcessesReady || isAllowedWhileBooting(app.info);
- if (normalMode) {
- try {
- didSomething = mAtmInternal.attachApplication(app.getWindowProcessController());
- } catch (Exception e) {
- Slog.wtf(TAG, "Exception thrown launching activities in " + app, e);
- badApp = true;
- }
- }
- return true;
- }
这里的mAtmInternal是ActivityTaskManagerInternal对象。我们知道ATMS有个内部类LocalService继承了该类。
- public boolean attachApplication(WindowProcessController wpc) throws RemoteException {
- synchronized (mGlobalLockWithoutBoost) {
- return mRootActivityContainer.attachApplication(wpc);
- }
- }
- boolean attachApplication(WindowProcessController app) throws RemoteException {
- final String processName = app.mName;
- boolean didSomething = false;
- for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
- final ActivityDisplay display = mActivityDisplays.get(displayNdx);
- final ActivityStack stack = display.getFocusedStack();
- if (stack != null) {
- stack.getAllRunningVisibleActivitiesLocked(mTmpActivityList);
- final ActivityRecord top = stack.topRunningActivityLocked();
- final int size = mTmpActivityList.size();
- for (int i = 0; i < size; i++) {
- final ActivityRecord activity = mTmpActivityList.get(i);
- if (activity.app == null && app.mUid == activity.info.applicationInfo.uid
- && processName.equals(activity.processName)) {
- try {
- if (mStackSupervisor.realStartActivityLocked(activity, app,
- top == activity /* andResume */, true /* checkConfig */)) {
- didSomething = true;
- }
- } catch (RemoteException e) {
- Slog.w(TAG, "Exception in new application when starting activity "
- + top.intent.getComponent().flattenToShortString(), e);
- throw e;
- }
- }
- }
- }
- }
- if (!didSomething) {
- ensureActivitiesVisible(null, 0, false /* preserve_windows */);
- }
- return didSomething;
- }
这里取了所有可见的activity,循环作为realStartActivityLocked方法参数
- boolean realStartActivityLocked(ActivityRecord r, WindowProcessController proc,
- boolean andResume, boolean checkConfig) throws RemoteException {
- // 直到所有的 onPause() 执行结束才会去启动新的 activity
- if (!mRootActivityContainer.allPausedActivitiesComplete()) {
- return false;
- }
- try {
- // Create activity launch transaction.
- final ClientTransaction clientTransaction = ClientTransaction.obtain(
- proc.getThread(), r.appToken);
- 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.launchedFromPackage, task.voiceInteractor, proc.getReportedProcState(),
- r.icicle, r.persistentState, results, newIntents,
- dc.isNextTransitionForward(), proc.createProfilerInfoIfNeeded(),
- r.assistToken));
- // Set desired final state.
- final ActivityLifecycleItem lifecycleItem;
- if (andResume) {
- lifecycleItem = ResumeActivityItem.obtain(dc.isNextTransitionForward());
- } else {
- lifecycleItem = PauseActivityItem.obtain();
- }
- clientTransaction.setLifecycleStateRequest(lifecycleItem);
- // Schedule transaction.
- mService.getLifecycleManager().scheduleTransaction(clientTransaction);
- .....
- } catch (RemoteException e) {
- ...
- }
- } finally {
- endDeferResume();
- }
- .....
- return true;
- }
final ClientTransaction clientTransaction = ClientTransaction.obtain( proc.getThread(), r.appToken);
clientTransaction.addCallback(LaunchActivityItem.obtain(...));
重点:这里获取了一个ClientTransaction对象,然后调用addCallback添加了LaunchActivityItem对象。
mService.getLifecycleManager().scheduleTransaction(clientTransaction);
scheduleTransaction使用到了该对象,我们先看scheduleTransaction方法
frameworks\base\services\core\java\com\android\server\wm\ClientLifecycleManager.java:
- void scheduleTransaction(ClientTransaction transaction) throws RemoteException {
- final IApplicationThread client = transaction.getClient();
- transaction.schedule();
- ....
- }
- public void schedule() throws RemoteException {
- mClient.scheduleTransaction(this);
- }
-
- public static ClientTransaction obtain(IApplicationThread client, IBinder activityToken) {
- ClientTransaction instance = ObjectPool.obtain(ClientTransaction.class);
- if (instance == null) {
- instance = new ClientTransaction();
- }
- instance.mClient = client;
- instance.mActivityToken = activityToken;
-
- return instance;
- }
结合final ClientTransaction clientTransaction = ClientTransaction.obtain(proc.getThread(), r.appToken);
所以mService.getLifecycleManager().scheduleTransaction(clientTransaction);就是调用了proc.getThread()的scheduleTransaction方法。
但是proc.getThread()是什么呢?
我们回头到AMS的attachApplicationLocked方法,
- private final boolean attachApplicationLocked(IApplicationThread thread,
- int pid, int callingUid, long startSeq) {
- ProcessRecord app;
- long startTime = SystemClock.uptimeMillis();
- long bindApplicationTimeMillis;
- ....
- app = mPidsSelfLocked.get(pid);
- // If this application record is still attached to a previous
- // process, clean it up now.
- if (app.thread != null) {
- handleAppDiedLocked(app, true, true);
- }
- app.makeActive(thread, mProcessStats);
- //mProcessesReady这个变量在AMS的 systemReady 中被赋值为true,
- //所以这里的normalMode也为true
- boolean normalMode = mProcessesReady || isAllowedWhileBooting(app.info);
- if (normalMode) {
- try {
- didSomething = mAtmInternal.attachApplication(app.getWindowProcessController());
- } catch (Exception e) {
- Slog.wtf(TAG, "Exception thrown launching activities in " + app, e);
- badApp = true;
- }
- }
- return true;
- }
发现proc.getThread()是app.getWindowProcessController(),意思就是app.getWindowProcessController().getTread()
- WindowProcessController getWindowProcessController() {
- return mWindowProcessController;
- }
-
- public void makeActive(IApplicationThread _thread, ProcessStatsService tracker) {
- ....
- thread = _thread;
- mWindowProcessController.setThread(thread);
- }
我们发现它是在makeActive方法中赋值的,回到AMS的attachApplicationLocked方法,我们可以找到该方法,我们看下传进去的thread是谁。
最后发现是一开始ActivityThread的attach方法传进来的
- private void attach(boolean system, long startSeq) {
- ....
- mgr.attachApplication(mAppThread, startSeq);
- ....
- }
-
- final ApplicationThread mAppThread = new ApplicationThread();
所以最终mService.getLifecycleManager().scheduleTransaction(clientTransaction);就是调用了ApplicationThread的scheduleTransaction方法,ApplicationThread是ActivityThread的内部类,所以饶了一大圈最终又回到了ActivityThread。
- public void scheduleTransaction(ClientTransaction transaction) throws RemoteException {
- ActivityThread.this.scheduleTransaction(transaction);
- }
这里调用了ActivityThread的scheduleTransaction,ActivityThread继承了ClientTransactionHandler,scheduleTransaction在ClientTransactionHandler类中。
- void scheduleTransaction(ClientTransaction transaction) {
- transaction.preExecute(this);
- sendMessage(ActivityThread.H.EXECUTE_TRANSACTION, transaction);
- }
这里把信息发送到ActivityThread的内部类H里面
- case EXECUTE_TRANSACTION:
- final ClientTransaction transaction = (ClientTransaction) msg.obj;
- mTransactionExecutor.execute(transaction);
- break;
- public void execute(ClientTransaction transaction) {
- ...
- executeCallbacks(transaction);
- executeLifecycleState(transaction);
- ...
- }
-
- public void executeCallbacks(ClientTransaction transaction) {
- final List
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);
- ....
- }
- }
这里拿出了ClientTransaction的callbacks,然后调用callback的execute。
记得在ActivityStackSupervisor类的realStartActivityLocked方法中
clientTransaction.addCallback(LaunchActivityItem.obtain(new Intent(r.intent),.....);
我们回去看一下LaunchActivityItem的obtain
- public static LaunchActivityItem obtain(Intent intent, int ident, ActivityInfo info,
- Configuration curConfig, Configuration overrideConfig, CompatibilityInfo compatInfo,
- String referrer, IVoiceInteractor voiceInteractor, int procState, Bundle state,
- PersistableBundle persistentState, List
pendingResults, - List
pendingNewIntents, boolean isForward, ProfilerInfo profilerInfo, - IBinder assistToken) {
- LaunchActivityItem instance = ObjectPool.obtain(LaunchActivityItem.class);
- if (instance == null) {
- instance = new LaunchActivityItem();
- }
- setValues(instance, intent, ident, info, curConfig, overrideConfig, compatInfo, referrer,
- voiceInteractor, procState, state, persistentState, pendingResults,
- pendingNewIntents, isForward, profilerInfo, assistToken);
-
- return instance;
- }
接下来看LaunchActivityItem的execute
- public void execute(ClientTransactionHandler client, IBinder token,
- PendingTransactionActions pendingActions) {
- Trace.traceBegin(TRACE_TAG_ACTIVITY_MANAGER, "activityStart");
- ActivityClientRecord r = new ActivityClientRecord(token, mIntent, mIdent, mInfo,
- mOverrideConfig, mCompatInfo, mReferrer, mVoiceInteractor, mState, mPersistentState,
- mPendingResults, mPendingNewIntents, mIsForward,
- mProfilerInfo, client, mAssistToken);
- client.handleLaunchActivity(r, pendingActions, null /* customIntent */);
- Trace.traceEnd(TRACE_TAG_ACTIVITY_MANAGER);
- }
这里的client是ActivityThread
- public Activity handleLaunchActivity(ActivityClientRecord r,
- PendingTransactionActions pendingActions, Intent customIntent) {
- ....
- final Activity a = performLaunchActivity(r, customIntent);
- if (a != null) {
- ....
- } else {
- // If there was an error, for any reason, tell the activity manager to stop us.
- try {
- ActivityTaskManager.getService()
- .finishActivity(r.token, Activity.RESULT_CANCELED, null,
- Activity.DONT_FINISH_TASK_WITH_ACTIVITY);
- } catch (RemoteException ex) {
- throw ex.rethrowFromSystemServer();
- }
- }
- return a;
- }
- private void executeLifecycleState(ClientTransaction transaction) {
- final ActivityLifecycleItem lifecycleItem = transaction.getLifecycleStateRequest();
- ....
- lifecycleItem.execute(mTransactionHandler, token, mPendingActions);
- }
想知道这里的lifecycleItem是啥,同样需要回到realStartActivityLocked方法中
final ActivityLifecycleItem lifecycleItem;
if (andResume) {
lifecycleItem = ResumeActivityItem.obtain(dc.isNextTransitionForward());
} else {
lifecycleItem = PauseActivityItem.obtain();
}
如果start的activity在栈顶,andResume为true。
- public void execute(ClientTransactionHandler client, IBinder token,
- PendingTransactionActions pendingActions) {
- client.handleResumeActivity(token, true /* finalStateRequest */, mIsForward,
- "RESUME_ACTIVITY");
- }
- public void execute(ClientTransactionHandler client, IBinder token,
- PendingTransactionActions pendingActions) {
- Trace.traceBegin(TRACE_TAG_ACTIVITY_MANAGER, "activityPause");
- client.handlePauseActivity(token, mFinished, mUserLeaving, mConfigChanges, pendingActions,
- "PAUSE_ACTIVITY_ITEM");
- Trace.traceEnd(TRACE_TAG_ACTIVITY_MANAGER);
- }
跟LaunchActivityItem类的execute调用ActivityThread的handleLaunchActivity方法一样,XXActivityItem就是去调用ActivityThread对应的handleXXActivity方法。
总结下来就是ActivityStackSupervisor处理启动activity请求会把该请求封装成一个ClientTransaction,然后执行Activity对应操作时就向ClientTransaction添加对应的XXActivityItem。而ActivityThread是ClientTransaction的处理者,继承了ClientTransactionHandler,根据XXActivityItem调用handleXXActivity,去执行activity的启动、onResume等生命周期活动。
流程:





