• Android—ATMS应用启动流程


    应用的启动:Launcher应用点击桌面应用,应用启动。

    frameworks\base\core\java\android\app\Activity.java:

    启动一个Activity我们很熟悉,就是startActivity:

    1. public void startActivity(Intent intent, @Nullable Bundle options) {
    2. if (options != null) {
    3. startActivityForResult(intent, -1, options);
    4. } else {
    5. // Note we want to go through this call for compatibility with
    6. // applications that may have overridden the method.
    7. startActivityForResult(intent, -1);
    8. }
    9. }
    10. public void startActivityForResult(@RequiresPermission Intent intent, int requestCode) {
    11. startActivityForResult(intent, requestCode, null);
    12. }
    13. public void startActivityForResult(@RequiresPermission Intent intent, int requestCode, @Nullable Bundle options) {
    14. ....
    15. Instrumentation.ActivityResult ar =
    16. mInstrumentation.execStartActivity(
    17. this, mMainThread.getApplicationThread(), mToken, this,
    18. intent, requestCode, options);
    19. ....
    20. }

    看execStartActivity方法的参数,mToken是一个IBinder,与mInstrumentation和mMainThread都在调用activity的attach方法时赋的值。

    接下来继续跟进execStartActivity

    1. public ActivityResult execStartActivity(
    2. Context who, IBinder contextThread, IBinder token, Activity target,
    3. Intent intent, int requestCode, Bundle options) {
    4. ....
    5. try {
    6. intent.migrateExtraStreamToClipData();
    7. intent.prepareToLeaveProcess(who);
    8. int result = ActivityTaskManager.getService()
    9. .startActivity(whoThread, who.getBasePackageName(), intent,
    10. intent.resolveTypeIfNeeded(who.getContentResolver()),
    11. token, target != null ? target.mEmbeddedID : null,
    12. requestCode, 0, null, options);
    13. checkStartActivityResult(result, intent);
    14. } catch (RemoteException e) {
    15. throw new RuntimeException("Failure from system", e);
    16. }
    17. return null;
    18. }

    这里调用了ActivityTaskManager.getService().startActivity()这个方法进行了跳转。

    我们先看ActivityTaskManager.getService()

    1. public static IActivityTaskManager getService() {
    2. return IActivityTaskManagerSingleton.get();
    3. }
    4. public final T get() {
    5. synchronized (this) {
    6. if (mInstance == null) {
    7. mInstance = create();
    8. }
    9. return mInstance;
    10. }
    11. }
    12. @UnsupportedAppUsage(trackingBug = 129726065)
    13. private static final Singleton IActivityTaskManagerSingleton =
    14. new Singleton() {
    15. @Override
    16. protected IActivityTaskManager create() {
    17. final IBinder b = ServiceManager.getService(Context.ACTIVITY_TASK_SERVICE);
    18. return IActivityTaskManager.Stub.asInterface(b);
    19. }
    20. };

    ActivityTaskManager.getService()中先用ServiceManager.getService(Context.ACTIVITY_TASK_SERVICE)获取了IBinder对象,按照之前分析Binder,我们知道这里可能是一个BPBinder。

    然后我们将这个BPBinder再转化为IActivityTaskManager接口对象。

    我们可以继续看下ServiceManager.getService(Context.ACTIVITY_TASK_SERVICE);

    1. public static IBinder getService(String name) {
    2. try {
    3. IBinder service = sCache.get(name);
    4. if (service != null) {
    5. return service;
    6. } else {
    7. return Binder.allowBlocking(rawGetService(name));
    8. }
    9. } catch (RemoteException e) {
    10. Log.e(TAG, "error in getService", e);
    11. }
    12. return null;
    13. }
    14. private static IBinder rawGetService(String name) throws RemoteException {
    15. final IBinder binder = getIServiceManager().getService(name);
    16. ....
    17. return binder;
    18. }
    19. private static IServiceManager getIServiceManager() {
    20. if (sServiceManager != null) {
    21. return sServiceManager;
    22. }
    23. // Find the service manager
    24. sServiceManager = ServiceManagerNative
    25. .asInterface(Binder.allowBlocking(BinderInternal.getContextObject()));
    26. return sServiceManager;
    27. }

    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

    frameworks\base\services\core\java\com\android\server\wm\ActivityTaskManagerService.java:

    1. public class ActivityTaskManagerService extends IActivityTaskManager.Stub
    2. public static final class Lifecycle extends SystemService {
    3. private final ActivityTaskManagerService mService;
    4. public Lifecycle(Context context) {
    5. super(context);
    6. mService = new ActivityTaskManagerService(context);
    7. }
    8. @Override
    9. public void onStart() {
    10. publishBinderService(Context.ACTIVITY_TASK_SERVICE, mService);
    11. mService.start();
    12. }
    13. ....
    14. }

    找到了一块熟悉的代码,Lifecycle是ATMS的内部类,这里我们之前分析过,publishBinderService就是向ServiceManager添加该服务,因为ATMS使用了AIDL,所以onTransact方法在ATMS的Stub类里面,我们这里直接看ATMS的startActivity方法

    1. public final int startActivity(IApplicationThread caller, String callingPackage,
    2. Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode,
    3. int startFlags, ProfilerInfo profilerInfo, Bundle bOptions) {
    4. return startActivityAsUser(caller, callingPackage, intent, resolvedType, resultTo,
    5. resultWho, requestCode, startFlags, profilerInfo, bOptions,
    6. UserHandle.getCallingUserId());
    7. }
    8. @Override
    9. public int startActivityAsUser(IApplicationThread caller, String callingPackage,
    10. Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode,
    11. int startFlags, ProfilerInfo profilerInfo, Bundle bOptions, int userId) {
    12. return startActivityAsUser(caller, callingPackage, intent, resolvedType, resultTo,
    13. resultWho, requestCode, startFlags, profilerInfo, bOptions, userId,
    14. true /*validateIncomingUser*/);
    15. }
    16. int startActivityAsUser(IApplicationThread caller, String callingPackage,
    17. Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode,
    18. int startFlags, ProfilerInfo profilerInfo, Bundle bOptions, int userId,
    19. boolean validateIncomingUser) {
    20. enforceNotIsolatedCaller("startActivityAsUser");
    21. userId = getActivityStartController().checkTargetUser(userId, validateIncomingUser,
    22. Binder.getCallingPid(), Binder.getCallingUid(), "startActivityAsUser");
    23. // TODO: Switch to user app stacks here.
    24. return getActivityStartController().obtainStarter(intent, "startActivityAsUser")
    25. .setCaller(caller)
    26. .setCallingPackage(callingPackage)
    27. .setResolvedType(resolvedType)
    28. .setResultTo(resultTo)
    29. .setResultWho(resultWho)
    30. .setRequestCode(requestCode)
    31. .setStartFlags(startFlags)
    32. .setProfilerInfo(profilerInfo)
    33. .setActivityOptions(bOptions)
    34. .setMayWait(userId)
    35. .execute();
    36. }

    obtainStarter返回的是ActivityStarter对象,这里set了很多参数最后执行execute方法,这里注意调用setMayWait。

    1. ActivityStarter setMayWait(int userId) {
    2. mRequest.mayWait = true;
    3. mRequest.userId = userId;
    4. return this;
    5. }
    6. int execute() {
    7. try {
    8. // TODO(b/64750076): Look into passing request directly to these methods to allow
    9. // for transactional diffs and preprocessing.
    10. if (mRequest.mayWait) {
    11. return startActivityMayWait(mRequest.caller, mRequest.callingUid,
    12. mRequest.callingPackage, mRequest.realCallingPid, mRequest.realCallingUid,
    13. mRequest.intent, mRequest.resolvedType,
    14. mRequest.voiceSession, mRequest.voiceInteractor, mRequest.resultTo,
    15. mRequest.resultWho, mRequest.requestCode, mRequest.startFlags,
    16. mRequest.profilerInfo, mRequest.waitResult, mRequest.globalConfig,
    17. mRequest.activityOptions, mRequest.ignoreTargetSecurity, mRequest.userId,
    18. mRequest.inTask, mRequest.reason,
    19. mRequest.allowPendingRemoteAnimationRegistryLookup,
    20. mRequest.originatingPendingIntent, mRequest.allowBackgroundActivityStart);
    21. } else {
    22. return startActivity(mRequest.caller, mRequest.intent, mRequest.ephemeralIntent,
    23. mRequest.resolvedType, mRequest.activityInfo, mRequest.resolveInfo,
    24. mRequest.voiceSession, mRequest.voiceInteractor, mRequest.resultTo,
    25. mRequest.resultWho, mRequest.requestCode, mRequest.callingPid,
    26. mRequest.callingUid, mRequest.callingPackage, mRequest.realCallingPid,
    27. mRequest.realCallingUid, mRequest.startFlags, mRequest.activityOptions,
    28. mRequest.ignoreTargetSecurity, mRequest.componentSpecified,
    29. mRequest.outActivity, mRequest.inTask, mRequest.reason,
    30. mRequest.allowPendingRemoteAnimationRegistryLookup,
    31. mRequest.originatingPendingIntent, mRequest.allowBackgroundActivityStart);
    32. }
    33. } finally {
    34. onExecutionComplete();
    35. }
    36. }

     mRequest.mayWait为true,走startActivityMayWait

    1. private int startActivityMayWait(IApplicationThread caller,....) {
    2. ....
    3. ResolveInfo rInfo = mSupervisor.resolveIntent(intent, resolvedType, userId,
    4. ....
    5. // Collect information about the target of the Intent.
    6. ActivityInfo aInfo = mSupervisor.resolveActivity(intent, rInfo, startFlags, profilerInfo);
    7. synchronized (mService.mGlobalLock) {
    8. .....
    9. final ActivityRecord[] outRecord = new ActivityRecord[1];
    10. int res = startActivity(caller, intent, ephemeralIntent, resolvedType, aInfo, rInfo,
    11. voiceSession, voiceInteractor, resultTo, resultWho, requestCode, callingPid,
    12. callingUid, callingPackage, realCallingPid, realCallingUid, startFlags, options,
    13. ignoreTargetSecurity, componentSpecified, outRecord, inTask, reason,
    14. allowPendingRemoteAnimationRegistryLookup, originatingPendingIntent,
    15. allowBackgroundActivityStart);
    16. ....
    17. if (outResult != null) {
    18. outResult.result = res;
    19. final ActivityRecord r = outRecord[0];
    20. switch(res) {
    21. case START_SUCCESS: {
    22. mSupervisor.mWaitingActivityLaunched.add(outResult);
    23. do {
    24. try {
    25. mService.mGlobalLock.wait();
    26. } catch (InterruptedException e) {
    27. }
    28. } while (outResult.result != START_TASK_TO_FRONT
    29. && !outResult.timeout && outResult.who == null);
    30. if (outResult.result == START_TASK_TO_FRONT) {
    31. res = START_TASK_TO_FRONT;
    32. }
    33. break;
    34. }
    35. case START_DELIVERED_TO_TOP: {
    36. outResult.timeout = false;
    37. outResult.who = r.mActivityComponent;
    38. outResult.totalTime = 0;
    39. break;
    40. }
    41. case START_TASK_TO_FRONT: {
    42. .....
    43. break;
    44. }
    45. }
    46. }
    47. return res;
    48. }
    49. }
    50. private int startActivity(IApplicationThread caller, Intent intent, ....) {
    51. if (TextUtils.isEmpty(reason)) {
    52. throw new IllegalArgumentException("Need to specify a reason.");
    53. }
    54. mLastStartReason = reason;
    55. mLastStartActivityTimeMs = System.currentTimeMillis();
    56. mLastStartActivityRecord[0] = null;
    57. mLastStartActivityResult = startActivity(caller, intent, ephemeralIntent, resolvedType,
    58. aInfo, rInfo, voiceSession, voiceInteractor, resultTo, resultWho, requestCode,
    59. callingPid, callingUid, callingPackage, realCallingPid, realCallingUid, startFlags,
    60. options, ignoreTargetSecurity, componentSpecified, mLastStartActivityRecord,
    61. inTask, allowPendingRemoteAnimationRegistryLookup, originatingPendingIntent,
    62. allowBackgroundActivityStart);
    63. if (outActivity != null) {
    64. // mLastStartActivityRecord[0] is set in the call to startActivity above.
    65. outActivity[0] = mLastStartActivityRecord[0];
    66. }
    67. return getExternalResult(mLastStartActivityResult);
    68. }
    69. private int startActivity(IApplicationThread caller, Intent intent, ....) {
    70. .....
    71. final int res = startActivity(r, sourceRecord, voiceSession, voiceInteractor, startFlags,
    72. true /* doResume */, checkedOptions, inTask, outActivity, restrictedBgActivity);
    73. mSupervisor.getActivityMetricsLogger().notifyActivityLaunched(res, outActivity[0]);
    74. return res;
    75. }
    76. private int startActivity(final ActivityRecord r, .....) {
    77. int result = START_CANCELED;
    78. final ActivityStack startedActivityStack;
    79. try {
    80. mService.mWindowManager.deferSurfaceLayout();
    81. result = startActivityUnchecked(r, sourceRecord, voiceSession, voiceInteractor,
    82. startFlags, doResume, options, inTask, outActivity, restrictedBgActivity);
    83. }
    84. ......
    85. return result;
    86. }
    87. private int startActivityUnchecked(final ActivityRecord r, ....) {
    88. .....
    89. mTargetStack.startActivityLocked(mStartActivity, topFocused, newTask, mKeepCurTransition,
    90. mOptions);
    91. if (mDoResume) {
    92. final ActivityRecord topTaskActivity =
    93. mStartActivity.getTaskRecord().topRunningActivityLocked();
    94. if (!mTargetStack.isFocusable()
    95. || (topTaskActivity != null && topTaskActivity.mTaskOverlay
    96. && mStartActivity != topTaskActivity)) {
    97. // If the activity is not focusable, we can't resume it, but still would like to
    98. // make sure it becomes visible as it starts (this will also trigger entry
    99. // animation). An example of this are PIP activities.
    100. // Also, we don't want to resume activities in a task that currently has an overlay
    101. // as the starting activity just needs to be in the visible paused state until the
    102. // over is removed.
    103. mTargetStack.ensureActivitiesVisibleLocked(mStartActivity, 0, !PRESERVE_WINDOWS);
    104. // Go ahead and tell window manager to execute app transition for this activity
    105. // since the app transition will not be triggered through the resume channel.
    106. mTargetStack.getDisplay().mDisplayContent.executeAppTransition();
    107. } else {
    108. // If the target stack was not previously focusable (previous top running activity
    109. // on that stack was not visible) then any prior calls to move the stack to the
    110. // will not update the focused stack. If starting the new activity now allows the
    111. // task stack to be focusable, then ensure that we now update the focused stack
    112. // accordingly.
    113. if (mTargetStack.isFocusable()
    114. && !mRootActivityContainer.isTopDisplayFocusedStack(mTargetStack)) {
    115. mTargetStack.moveToFront("startActivityUnchecked");
    116. }
    117. mRootActivityContainer.resumeFocusedStacksTopActivities(
    118. mTargetStack, mStartActivity, mOptions);
    119. }
    120. } else if (mStartActivity != null) {
    121. mSupervisor.mRecentTasks.add(mStartActivity.getTaskRecord());
    122. }
    123. mRootActivityContainer.updateUserStack(mStartActivity.mUserId, mTargetStack);
    124. mSupervisor.handleNonResizableTaskIfNeeded(mStartActivity.getTaskRecord(),
    125. preferredWindowingMode, mPreferredDisplayId, mTargetStack);
    126. return START_SUCCESS;
    127. }

    startActivityUnchecked()调用了mTargetStack.startActivityLocked(),这个方法比较重要。

    1. void startActivityLocked(ActivityRecord r, ActivityRecord focusedTopActivity,
    2. boolean newTask, boolean keepCurTransition, ActivityOptions options) {
    3. TaskRecord rTask = r.getTaskRecord();
    4. final int taskId = rTask.taskId;
    5. final boolean allowMoveToFront = options == null || !options.getAvoidMoveToFront();
    6. // mLaunchTaskBehind tasks get placed at the back of the task stack.
    7. if (!r.mLaunchTaskBehind && allowMoveToFront
    8. && (taskForIdLocked(taskId) == null || newTask)) {
    9. // Last activity in task had been removed or ActivityManagerService is reusing task.
    10. // Insert or replace.
    11. // Might not even be in.
    12. insertTaskAtTop(rTask, r);
    13. }
    14. TaskRecord task = null;
    15. if (!newTask) {
    16. // If starting in an existing task, find where that is...
    17. boolean startIt = true;
    18. for (int taskNdx = mTaskHistory.size() - 1; taskNdx >= 0; --taskNdx) {
    19. task = mTaskHistory.get(taskNdx);
    20. if (task.getTopActivity() == null) {
    21. // All activities in task are finishing.
    22. continue;
    23. }
    24. if (task == rTask) {
    25. // Here it is! Now, if this is not yet visible to the
    26. // user, then just add it without starting; it will
    27. // get started when the user navigates back to it.
    28. if (!startIt) {
    29. if (DEBUG_ADD_REMOVE) Slog.i(TAG, "Adding activity " + r + " to task "
    30. + task, new RuntimeException("here").fillInStackTrace());
    31. r.createAppWindowToken();
    32. ActivityOptions.abort(options);
    33. return;
    34. }
    35. break;
    36. } else if (task.numFullscreen > 0) {
    37. startIt = false;
    38. }
    39. }
    40. }

    startActivityLocked方法就是找到要启动的Activity的TaskRecord,并将activity插入到合适位置。 这样activity对应ActivityRecord就加入到对应ActivityStack中的对应的TaskRecord中了。

    mRootActivityContainer.resumeFocusedStacksTopActivities(mTargetStack, mStartActivity, mOptions);

    frameworks\base\services\core\java\com\android\server\wm\RootActivityContainer.java:

    1. boolean resumeFocusedStacksTopActivities(
    2. ActivityStack targetStack, ActivityRecord target, ActivityOptions targetOptions) {
    3. ....
    4. if (targetStack != null && (targetStack.isTopStackOnDisplay()
    5. || getTopDisplayFocusedStack() == targetStack)) {
    6. result = targetStack.resumeTopActivityUncheckedLocked(target, targetOptions);
    7. }
    8. ....
    9. return result;
    10. }
    11. boolean resumeTopActivityUncheckedLocked(ActivityRecord prev, ActivityOptions options) {
    12. ....
    13. result = resumeTopActivityInnerLocked(prev, options);
    14. ....
    15. return result;
    16. }
    17. private boolean resumeTopActivityInnerLocked(ActivityRecord prev, ActivityOptions options) {
    18. ActivityRecord next = topRunningActivityLocked(true /* focusableOnly */);
    19. ....
    20. if (next.attachedToProcess()) {
    21. .....
    22. } else {
    23. .....
    24. mStackSupervisor.startSpecificActivityLocked(next, true, true);
    25. }
    26. return true;
    27. }
    28. void startSpecificActivityLocked(ActivityRecord r, boolean andResume, boolean checkConfig) {
    29. // Is this activity's application already running?
    30. final WindowProcessController wpc =
    31. mService.getProcessController(r.processName, r.info.applicationInfo.uid);
    32. boolean knownToBeDead = false;
    33. if (wpc != null && wpc.hasThread()) {
    34. ....
    35. realStartActivityLocked(r, wpc, andResume, checkConfig);
    36. return;
    37. ....
    38. }
    39. // Post message to start process to avoid possible deadlock of calling into AMS with the ATMS lock held.
    40. final Message msg = PooledLambda.obtainMessage(
    41. ActivityManagerInternal::startProcess, mService.mAmInternal, r.processName,
    42. r.info.applicationInfo, knownToBeDead, "activity", r.intent.getComponent());
    43. mService.mH.sendMessage(msg);
    44. ....
    45. }

    显然应用还没启动,所以会走到下面的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

    frameworks\base\services\core\java\com\android\server\am\ActivityManagerService.java:

    1. public void startProcess(String processName, ApplicationInfo info,
    2. boolean knownToBeDead, String hostingType, ComponentName hostingName) {
    3. synchronized (ActivityManagerService.this) {
    4. startProcessLocked(processName, info, knownToBeDead, 0 /* intentFlags */,
    5. new HostingRecord(hostingType, hostingName),
    6. false /* allowWhileBooting */, false /* isolated */,
    7. true /* keepIfLarge */);
    8. }
    9. }
    10. final ProcessRecord startProcessLocked(String processName,
    11. ApplicationInfo info, boolean knownToBeDead, int intentFlags,
    12. HostingRecord hostingRecord, boolean allowWhileBooting,
    13. boolean isolated, boolean keepIfLarge) {
    14. return mProcessList.startProcessLocked(processName, info, knownToBeDead, intentFlags,
    15. hostingRecord, allowWhileBooting, isolated, 0 /* isolatedUid */, keepIfLarge,
    16. null /* ABI override */, null /* entryPoint */, null /* entryPointArgs */,
    17. null /* crashHandler */);
    18. }

    frameworks\base\services\core\java\com\android\server\am\ProcessList.java:

    1. final ProcessRecord startProcessLocked(String processName, ApplicationInfo info,...) {
    2. ProcessRecord app;
    3. if (app == null) {
    4. app = newProcessRecordLocked(info, processName, isolated, isolatedUid, hostingRecord);
    5. .....
    6. } else {
    7. // If this is a new package in the process, add the package to the list
    8. app.addPackage(info.packageName, info.longVersionCode, mService.mProcessStats);
    9. }
    10. final boolean success = startProcessLocked(app, hostingRecord, abiOverride);
    11. return success ? app : null;
    12. }
    13. final boolean startProcessLocked(ProcessRecord app, HostingRecord hostingRecord,
    14. String abiOverride) {
    15. return startProcessLocked(app, hostingRecord,
    16. false /* disableHiddenApiChecks */, false /* mountExtStorageFull */, abiOverride);
    17. }
    18. boolean startProcessLocked(ProcessRecord app, HostingRecord hostingRecord,
    19. boolean disableHiddenApiChecks, boolean mountExtStorageFull,
    20. String abiOverride) {
    21. AppGlobals.getPackageManager().checkPackageStartable(app.info.packageName, userId);
    22. ....
    23. // Start the process. It will either succeed and return a result containing
    24. // the PID of the new process, or else throw a RuntimeException.
    25. final String entryPoint = "android.app.ActivityThread";
    26. return startProcessLocked(hostingRecord, entryPoint, app, uid, gids,
    27. runtimeFlags, mountExternal, seInfo, requiredAbi, instructionSet, invokeWith,
    28. startTime);
    29. } catch (RuntimeException e) {
    30. mService.forceStopPackageLocked(app.info.packageName, UserHandle.getAppId(app.uid),
    31. false, false, true, false, false, app.userId, "start failure");
    32. return false;
    33. }
    34. }
    35. boolean startProcessLocked(HostingRecord hostingRecord, ....) {
    36. ....
    37. final Process.ProcessStartResult startResult = startProcess(hostingRecord,
    38. entryPoint, app,
    39. uid, gids, runtimeFlags, mountExternal, seInfo, requiredAbi, instructionSet,
    40. invokeWith, startTime);
    41. handleProcessStartedLocked(app, startResult.pid, startResult.usingWrapper,
    42. startSeq, false);
    43. return app.pid > 0;
    44. }
    45. private Process.ProcessStartResult startProcess(HostingRecord hostingRecord, ....) {
    46. try {
    47. final Process.ProcessStartResult startResult;
    48. if (hostingRecord.usesWebviewZygote()) {
    49. startResult = startWebView(entryPoint,
    50. app.processName, uid, uid, gids, runtimeFlags, mountExternal,
    51. app.info.targetSdkVersion, seInfo, requiredAbi, instructionSet,
    52. app.info.dataDir, null, app.info.packageName,
    53. new String[] {PROC_START_SEQ_IDENT + app.startSeq});
    54. } else if (hostingRecord.usesAppZygote()) {
    55. final AppZygote appZygote = createAppZygoteForProcessIfNeeded(app);
    56. startResult = appZygote.getProcess().start(entryPoint,
    57. app.processName, uid, uid, gids, runtimeFlags, mountExternal,
    58. app.info.targetSdkVersion, seInfo, requiredAbi, instructionSet,
    59. app.info.dataDir, null, app.info.packageName,
    60. /*useUsapPool=*/ false,
    61. new String[] {PROC_START_SEQ_IDENT + app.startSeq});
    62. } else {
    63. startResult = Process.start(entryPoint,
    64. app.processName, uid, uid, gids, runtimeFlags, mountExternal,
    65. app.info.targetSdkVersion, seInfo, requiredAbi, instructionSet,
    66. app.info.dataDir, invokeWith, app.info.packageName,
    67. new String[] {PROC_START_SEQ_IDENT + app.startSeq});
    68. }
    69. return startResult;
    70. } finally {
    71. Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
    72. }
    73. }

    frameworks\base\core\java\android\os\Process.java:

    1. public static ProcessStartResult start(@NonNull final String processClass,
    2. @Nullable final String niceName,
    3. int uid, int gid, @Nullable int[] gids,
    4. int runtimeFlags,
    5. int mountExternal,
    6. int targetSdkVersion,
    7. @Nullable String seInfo,
    8. @NonNull String abi,
    9. @Nullable String instructionSet,
    10. @Nullable String appDataDir,
    11. @Nullable String invokeWith,
    12. @Nullable String packageName,
    13. @Nullable String[] zygoteArgs) {
    14. return ZYGOTE_PROCESS.start(processClass, niceName, uid, gid, gids,
    15. runtimeFlags, mountExternal, targetSdkVersion, seInfo,
    16. abi, instructionSet, appDataDir, invokeWith, packageName,
    17. /*useUsapPool=*/ true, zygoteArgs);
    18. }

    frameworks\base\core\java\android\os\ZygoteProcess.java:

    1. public final Process.ProcessStartResult start(@NonNull final String processClass,
    2. final String niceName,
    3. int uid, int gid, @Nullable int[] gids,
    4. int runtimeFlags, int mountExternal,
    5. int targetSdkVersion,
    6. @Nullable String seInfo,
    7. @NonNull String abi,
    8. @Nullable String instructionSet,
    9. @Nullable String appDataDir,
    10. @Nullable String invokeWith,
    11. @Nullable String packageName,
    12. boolean useUsapPool,
    13. @Nullable String[] zygoteArgs) {
    14. // TODO (chriswailes): Is there a better place to check this value?
    15. if (fetchUsapPoolEnabledPropWithMinInterval()) {
    16. informZygotesOfUsapPoolStatus();
    17. }
    18. try {
    19. return startViaZygote(processClass, niceName, uid, gid, gids,
    20. runtimeFlags, mountExternal, targetSdkVersion, seInfo,
    21. abi, instructionSet, appDataDir, invokeWith, /*startChildZygote=*/ false,
    22. packageName, useUsapPool, zygoteArgs);
    23. } catch (ZygoteStartFailedEx ex) {
    24. Log.e(LOG_TAG,
    25. "Starting VM process through Zygote failed");
    26. }
    27. }
    28. private Process.ProcessStartResult startViaZygote(@NonNull final String processClass,
    29. @Nullable final String niceName,
    30. final int uid, final int gid,
    31. @Nullable final int[] gids,
    32. int runtimeFlags, int mountExternal,
    33. int targetSdkVersion,
    34. @Nullable String seInfo,
    35. @NonNull String abi,
    36. @Nullable String instructionSet,
    37. @Nullable String appDataDir,
    38. @Nullable String invokeWith,
    39. boolean startChildZygote,
    40. @Nullable String packageName,
    41. boolean useUsapPool,
    42. @Nullable String[] extraArgs)
    43. throws ZygoteStartFailedEx {
    44. ArrayList argsForZygote = new ArrayList<>();
    45. // --runtime-args, --setuid=, --setgid=,
    46. // and --setgroups= must go first
    47. argsForZygote.add("--runtime-args");
    48. argsForZygote.add("--setuid=" + uid);
    49. argsForZygote.add("--setgid=" + gid);
    50. argsForZygote.add("--runtime-flags=" + runtimeFlags);
    51. if (mountExternal == Zygote.MOUNT_EXTERNAL_DEFAULT) {
    52. argsForZygote.add("--mount-external-default");
    53. } else if (mountExternal == Zygote.MOUNT_EXTERNAL_READ) {
    54. argsForZygote.add("--mount-external-read");
    55. } else if (mountExternal == Zygote.MOUNT_EXTERNAL_WRITE) {
    56. argsForZygote.add("--mount-external-write");
    57. } else if (mountExternal == Zygote.MOUNT_EXTERNAL_FULL) {
    58. argsForZygote.add("--mount-external-full");
    59. } else if (mountExternal == Zygote.MOUNT_EXTERNAL_INSTALLER) {
    60. argsForZygote.add("--mount-external-installer");
    61. } else if (mountExternal == Zygote.MOUNT_EXTERNAL_LEGACY) {
    62. argsForZygote.add("--mount-external-legacy");
    63. }
    64. argsForZygote.add("--target-sdk-version=" + targetSdkVersion);
    65. // --setgroups is a comma-separated list
    66. if (gids != null && gids.length > 0) {
    67. StringBuilder sb = new StringBuilder();
    68. sb.append("--setgroups=");
    69. int sz = gids.length;
    70. for (int i = 0; i < sz; i++) {
    71. if (i != 0) {
    72. sb.append(',');
    73. }
    74. sb.append(gids[i]);
    75. }
    76. argsForZygote.add(sb.toString());
    77. }
    78. if (niceName != null) {
    79. argsForZygote.add("--nice-name=" + niceName);
    80. }
    81. if (seInfo != null) {
    82. argsForZygote.add("--seinfo=" + seInfo);
    83. }
    84. if (instructionSet != null) {
    85. argsForZygote.add("--instruction-set=" + instructionSet);
    86. }
    87. if (appDataDir != null) {
    88. argsForZygote.add("--app-data-dir=" + appDataDir);
    89. }
    90. if (invokeWith != null) {
    91. argsForZygote.add("--invoke-with");
    92. argsForZygote.add(invokeWith);
    93. }
    94. if (startChildZygote) {
    95. argsForZygote.add("--start-child-zygote");
    96. }
    97. if (packageName != null) {
    98. argsForZygote.add("--package-name=" + packageName);
    99. }
    100. argsForZygote.add(processClass);
    101. if (extraArgs != null) {
    102. Collections.addAll(argsForZygote, extraArgs);
    103. }
    104. synchronized(mLock) {
    105. // The USAP pool can not be used if the application will not use the systems graphics
    106. // driver. If that driver is requested use the Zygote application start path.
    107. return zygoteSendArgsAndGetResult(openZygoteSocketIfNeeded(abi),
    108. useUsapPool,
    109. argsForZygote);
    110. }
    111. }
    112. private Process.ProcessStartResult zygoteSendArgsAndGetResult(
    113. ZygoteState zygoteState, boolean useUsapPool, @NonNull ArrayList args)
    114. throws ZygoteStartFailedEx {
    115. ....
    116. return attemptZygoteSendArgsAndGetResult(zygoteState, msgStr);
    117. }
    118. private Process.ProcessStartResult attemptZygoteSendArgsAndGetResult(
    119. ZygoteState zygoteState, String msgStr) throws ZygoteStartFailedEx {
    120. try {
    121. final BufferedWriter zygoteWriter = zygoteState.mZygoteOutputWriter;
    122. final DataInputStream zygoteInputStream = zygoteState.mZygoteInputStream;
    123. zygoteWriter.write(msgStr);
    124. zygoteWriter.flush();
    125. // Always read the entire result from the input stream to avoid leaving
    126. // bytes in the stream for future process starts to accidentally stumble
    127. // upon.
    128. Process.ProcessStartResult result = new Process.ProcessStartResult();
    129. result.pid = zygoteInputStream.readInt();
    130. result.usingWrapper = zygoteInputStream.readBoolean();
    131. if (result.pid < 0) {
    132. throw new ZygoteStartFailedEx("fork() failed");
    133. }
    134. return result;
    135. } catch (IOException ex) {
    136. zygoteState.close();
    137. Log.e(LOG_TAG, "IO Exception while communicating with Zygote - "
    138. + ex.toString());
    139. throw new ZygoteStartFailedEx(ex);
    140. }
    141. }

    终于来到与Zygote相关的了,在这前面就是各种判断和配置参数,我们先看openZygoteSocketIfNeeded(abi)

    1. private ZygoteState openZygoteSocketIfNeeded(String abi) throws ZygoteStartFailedEx {
    2. try {
    3. attemptConnectionToPrimaryZygote();
    4. if (primaryZygoteState.matches(abi)) {
    5. return primaryZygoteState;
    6. }
    7. if (mZygoteSecondarySocketAddress != null) {
    8. // The primary zygote didn't match. Try the secondary.
    9. attemptConnectionToSecondaryZygote();
    10. if (secondaryZygoteState.matches(abi)) {
    11. return secondaryZygoteState;
    12. }
    13. }
    14. } catch (IOException ioe) {
    15. throw new ZygoteStartFailedEx("Error connecting to zygote", ioe);
    16. }
    17. throw new ZygoteStartFailedEx("Unsupported zygote ABI: " + abi);
    18. }
    19. private void attemptConnectionToPrimaryZygote() throws IOException {
    20. if (primaryZygoteState == null || primaryZygoteState.isClosed()) {
    21. primaryZygoteState =
    22. ZygoteState.connect(mZygoteSocketAddress, mUsapPoolSocketAddress);
    23. maybeSetApiBlacklistExemptions(primaryZygoteState, false);
    24. maybeSetHiddenApiAccessLogSampleRate(primaryZygoteState);
    25. maybeSetHiddenApiAccessStatslogSampleRate(primaryZygoteState);
    26. }
    27. }
    28. static ZygoteState connect(@NonNull LocalSocketAddress zygoteSocketAddress,
    29. @Nullable LocalSocketAddress usapSocketAddress)
    30. throws IOException {
    31. DataInputStream zygoteInputStream;
    32. BufferedWriter zygoteOutputWriter;
    33. final LocalSocket zygoteSessionSocket = new LocalSocket();
    34. if (zygoteSocketAddress == null) {
    35. throw new IllegalArgumentException("zygoteSocketAddress can't be null");
    36. }
    37. try {
    38. zygoteSessionSocket.connect(zygoteSocketAddress);
    39. zygoteInputStream = new DataInputStream(zygoteSessionSocket.getInputStream());
    40. zygoteOutputWriter =
    41. new BufferedWriter(
    42. new OutputStreamWriter(zygoteSessionSocket.getOutputStream()),
    43. Zygote.SOCKET_BUFFER_SIZE);
    44. } catch (IOException ex) {
    45. try {
    46. zygoteSessionSocket.close();
    47. } catch (IOException ignore) { }
    48. throw ex;
    49. }
    50. return new ZygoteState(zygoteSocketAddress, usapSocketAddress,
    51. zygoteSessionSocket, zygoteInputStream, zygoteOutputWriter,
    52. getAbiList(zygoteOutputWriter, zygoteInputStream));
    53. }

    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;

     找一下那里赋值的,

    1. public ZygoteProcess() {
    2. mZygoteSocketAddress =
    3. new LocalSocketAddress(Zygote.PRIMARY_SOCKET_NAME,
    4. LocalSocketAddress.Namespace.RESERVED);
    5. mZygoteSecondarySocketAddress =
    6. new LocalSocketAddress(Zygote.SECONDARY_SOCKET_NAME,
    7. LocalSocketAddress.Namespace.RESERVED);
    8. mUsapPoolSocketAddress =
    9. new LocalSocketAddress(Zygote.USAP_POOL_PRIMARY_SOCKET_NAME,
    10. LocalSocketAddress.Namespace.RESERVED);
    11. mUsapPoolSecondarySocketAddress =
    12. new LocalSocketAddress(Zygote.USAP_POOL_SECONDARY_SOCKET_NAME,
    13. LocalSocketAddress.Namespace.RESERVED);
    14. }
    15. public static final String PRIMARY_SOCKET_NAME = "zygote";
    16. public static final String SECONDARY_SOCKET_NAME = "zygote_secondary";

    所以zygoteSessionSocket.connect(zygoteSocketAddress)相当于

    zygoteSessionSocket.connect("zygote");这个值有点熟悉,我们回到ZygoteInit的main函数看下。

    frameworks\base\core\java\com\android\internal\os\ZygoteInit.java:

    1. public static void main(String argv[]) {
    2. ZygoteServer zygoteServer = null
    3. Runnable caller;
    4. try {
    5. ....
    6. String zygoteSocketName = "zygote";
    7. final boolean isPrimaryZygote = zygoteSocketName.equals(Zygote.PRIMARY_SOCKET_NAME);
    8. ....
    9. zygoteServer = new ZygoteServer(isPrimaryZygote);
    10. Log.i(TAG, "Accepting command socket connections");
    11. // The select loop returns early in the child process after a fork and
    12. // loops forever in the zygote.
    13. caller = zygoteServer.runSelectLoop(abiList);
    14. } catch (Throwable ex) {
    15. Log.e(TAG, "System zygote died with exception", ex);
    16. throw ex;
    17. } finally {
    18. if (zygoteServer != null) {
    19. zygoteServer.closeServerSocket();
    20. }
    21. }
    22. if (caller != null) {
    23. caller.run();
    24. }
    25. }
    26. ZygoteServer(boolean isPrimaryZygote) {
    27. mUsapPoolEventFD = Zygote.getUsapPoolEventFD();
    28. if (isPrimaryZygote) {
    29. mZygoteSocket = Zygote.createManagedSocketFromInitSocket(Zygote.PRIMARY_SOCKET_NAME);
    30. mUsapPoolSocket =
    31. Zygote.createManagedSocketFromInitSocket(
    32. Zygote.USAP_POOL_PRIMARY_SOCKET_NAME);
    33. } else {
    34. mZygoteSocket = Zygote.createManagedSocketFromInitSocket(Zygote.SECONDARY_SOCKET_NAME);
    35. mUsapPoolSocket =
    36. Zygote.createManagedSocketFromInitSocket(
    37. Zygote.USAP_POOL_SECONDARY_SOCKET_NAME);
    38. }
    39. fetchUsapPoolPolicyProps();
    40. mUsapPoolSupported = true;
    41. }

    main里面创建了ZygoteServer,这里的isPrimaryZygote为true,我们看到了熟悉的常量Zygote.PRIMARY_SOCKET_NAME,所以这里用“zyogte”创建了Socket服务器,如果isPrimaryZygote为false的话就是第二个socket地址。我们在连接的时候连不上第一个socket服务器也会去尝试连接第二个。

    main最后

    caller = zygoteServer.runSelectLoop(abiList);

    caller.run();

    是开启了Socket轮询,对于请求的处理在之前的文章已经分析过了。

    Android—Zygote的启动与工作

    就是接收到socket连接的时候会去调用native层的fork方法创建一个新的进程。

    我们在ProcessList.java的startProcessLocked方法中将

    final String entryPoint = "android.app.ActivityThread";

    作为参数最后传到socket,socket收到请求数据后,在ZygoteConnection的processOneCommand方法中会用反射执行ActivityThread的main函数。

    1. protected static Runnable findStaticMain(String className, String[] argv,
    2. ClassLoader classLoader) {
    3. Class cl;
    4. try {
    5. cl = Class.forName(className, true, classLoader);
    6. } catch (ClassNotFoundException ex) {
    7. throw new RuntimeException(
    8. "Missing class when invoking static main " + className,
    9. ex);
    10. }
    11. Method m;
    12. try {
    13. m = cl.getMethod("main", new Class[] { String[].class });
    14. } catch (NoSuchMethodException ex) {
    15. throw new RuntimeException(
    16. "Missing static main on " + className, ex);
    17. } catch (SecurityException ex) {
    18. throw new RuntimeException(
    19. "Problem getting static main on " + className, ex);
    20. }
    21. int modifiers = m.getModifiers();
    22. if (! (Modifier.isStatic(modifiers) && Modifier.isPublic(modifiers))) {
    23. throw new RuntimeException(
    24. "Main method is not public and static on " + className);
    25. }
    26. /*
    27. * This throw gets caught in ZygoteInit.main(), which responds
    28. * by invoking the exception's run() method. This arrangement
    29. * clears up all the stack frames that were required in setting
    30. * up the process.
    31. */
    32. return new MethodAndArgsCaller(m, argv);
    33. }

    我们看ActivityThread的main方法

    frameworks\base\core\java\android\app\ActivityThread.java:

    1. public static void main(String[] args) {
    2. ...
    3. Looper.prepareMainLooper();
    4. ...
    5. ActivityThread thread = new ActivityThread();
    6. thread.attach(false, startSeq);
    7. ...
    8. Looper.loop();
    9. }

    main中先去创建主线程的Looper然后去生成ActivityThread对象然后调用attach方法,最后去开启轮询。

    1. @UnsupportedAppUsage
    2. private void attach(boolean system, long startSeq) {
    3. sCurrentActivityThread = this;
    4. mSystemThread = system;
    5. if (!system) {
    6. ....
    7. final IActivityManager mgr = ActivityManager.getService();
    8. try {
    9. mgr.attachApplication(mAppThread, startSeq);
    10. } catch (RemoteException ex) {
    11. throw ex.rethrowFromSystemServer();
    12. }
    13. // Watch for getting close to heap limit.
    14. BinderInternal.addGcWatcher(new Runnable() {
    15. @Override public void run() {
    16. ....
    17. });
    18. } else {
    19. ...
    20. }
    21. ViewRootImpl.ConfigChangedCallback configChangedCallback
    22. = (Configuration globalConfig) -> {
    23. synchronized (mResourcesManager) {
    24. ....
    25. };
    26. ViewRootImpl.addConfigCallback(configChangedCallback);
    27. }

    attach里面如果是systemServer的进程就走else,IActivityManager对应的是AMS,我们直接看AMS的attachApplication方法

    1. @Override
    2. public final void attachApplication(IApplicationThread thread, long startSeq) {
    3. synchronized (this) {
    4. ...
    5. attachApplicationLocked(thread, callingPid, callingUid, startSeq);
    6. Binder.restoreCallingIdentity(origId);
    7. }
    8. }
    9. private final boolean attachApplicationLocked(IApplicationThread thread,
    10. int pid, int callingUid, long startSeq) {
    11. ProcessRecord app;
    12. long startTime = SystemClock.uptimeMillis();
    13. long bindApplicationTimeMillis;
    14. ....
    15. app = mPidsSelfLocked.get(pid);
    16. // If this application record is still attached to a previous
    17. // process, clean it up now.
    18. if (app.thread != null) {
    19. handleAppDiedLocked(app, true, true);
    20. }
    21. app.makeActive(thread, mProcessStats);
    22. //mProcessesReady这个变量在AMS的 systemReady 中被赋值为true,
    23. //所以这里的normalMode也为true
    24. boolean normalMode = mProcessesReady || isAllowedWhileBooting(app.info);
    25. if (normalMode) {
    26. try {
    27. didSomething = mAtmInternal.attachApplication(app.getWindowProcessController());
    28. } catch (Exception e) {
    29. Slog.wtf(TAG, "Exception thrown launching activities in " + app, e);
    30. badApp = true;
    31. }
    32. }
    33. return true;
    34. }

    这里的mAtmInternal是ActivityTaskManagerInternal对象。我们知道ATMS有个内部类LocalService继承了该类。

    frameworks\base\services\core\java\com\android\server\wm\ActivityTaskManagerService.java:

    1. public boolean attachApplication(WindowProcessController wpc) throws RemoteException {
    2. synchronized (mGlobalLockWithoutBoost) {
    3. return mRootActivityContainer.attachApplication(wpc);
    4. }
    5. }

    frameworks\base\services\core\java\com\android\server\wm\RootActivityContainer.java:

    1. boolean attachApplication(WindowProcessController app) throws RemoteException {
    2. final String processName = app.mName;
    3. boolean didSomething = false;
    4. for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
    5. final ActivityDisplay display = mActivityDisplays.get(displayNdx);
    6. final ActivityStack stack = display.getFocusedStack();
    7. if (stack != null) {
    8. stack.getAllRunningVisibleActivitiesLocked(mTmpActivityList);
    9. final ActivityRecord top = stack.topRunningActivityLocked();
    10. final int size = mTmpActivityList.size();
    11. for (int i = 0; i < size; i++) {
    12. final ActivityRecord activity = mTmpActivityList.get(i);
    13. if (activity.app == null && app.mUid == activity.info.applicationInfo.uid
    14. && processName.equals(activity.processName)) {
    15. try {
    16. if (mStackSupervisor.realStartActivityLocked(activity, app,
    17. top == activity /* andResume */, true /* checkConfig */)) {
    18. didSomething = true;
    19. }
    20. } catch (RemoteException e) {
    21. Slog.w(TAG, "Exception in new application when starting activity "
    22. + top.intent.getComponent().flattenToShortString(), e);
    23. throw e;
    24. }
    25. }
    26. }
    27. }
    28. }
    29. if (!didSomething) {
    30. ensureActivitiesVisible(null, 0, false /* preserve_windows */);
    31. }
    32. return didSomething;
    33. }

    这里取了所有可见的activity,循环作为realStartActivityLocked方法参数

    frameworks\base\services\core\java\com\android\server\wm\ActivityStackSupervisor.java:

    1. boolean realStartActivityLocked(ActivityRecord r, WindowProcessController proc,
    2. boolean andResume, boolean checkConfig) throws RemoteException {
    3. // 直到所有的 onPause() 执行结束才会去启动新的 activity
    4. if (!mRootActivityContainer.allPausedActivitiesComplete()) {
    5. return false;
    6. }
    7. try {
    8. // Create activity launch transaction.
    9. final ClientTransaction clientTransaction = ClientTransaction.obtain(
    10. proc.getThread(), r.appToken);
    11. clientTransaction.addCallback(LaunchActivityItem.obtain(new Intent(r.intent),
    12. System.identityHashCode(r), r.info,
    13. // TODO: Have this take the merged configuration instead of separate global
    14. // and override configs.
    15. mergedConfiguration.getGlobalConfiguration(),
    16. mergedConfiguration.getOverrideConfiguration(), r.compat,
    17. r.launchedFromPackage, task.voiceInteractor, proc.getReportedProcState(),
    18. r.icicle, r.persistentState, results, newIntents,
    19. dc.isNextTransitionForward(), proc.createProfilerInfoIfNeeded(),
    20. r.assistToken));
    21. // Set desired final state.
    22. final ActivityLifecycleItem lifecycleItem;
    23. if (andResume) {
    24. lifecycleItem = ResumeActivityItem.obtain(dc.isNextTransitionForward());
    25. } else {
    26. lifecycleItem = PauseActivityItem.obtain();
    27. }
    28. clientTransaction.setLifecycleStateRequest(lifecycleItem);
    29. // Schedule transaction.
    30. mService.getLifecycleManager().scheduleTransaction(clientTransaction);
    31. .....
    32. } catch (RemoteException e) {
    33. ...
    34. }
    35. } finally {
    36. endDeferResume();
    37. }
    38. .....
    39. return true;
    40. }

    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:

    1. void scheduleTransaction(ClientTransaction transaction) throws RemoteException {
    2. final IApplicationThread client = transaction.getClient();
    3. transaction.schedule();
    4. ....
    5. }

    frameworks\base\core\java\android\app\servertransaction\ClientTransaction.java:

    1. public void schedule() throws RemoteException {
    2. mClient.scheduleTransaction(this);
    3. }
    4. public static ClientTransaction obtain(IApplicationThread client, IBinder activityToken) {
    5. ClientTransaction instance = ObjectPool.obtain(ClientTransaction.class);
    6. if (instance == null) {
    7. instance = new ClientTransaction();
    8. }
    9. instance.mClient = client;
    10. instance.mActivityToken = activityToken;
    11. return instance;
    12. }

    结合final ClientTransaction clientTransaction = ClientTransaction.obtain(proc.getThread(), r.appToken);

    所以mService.getLifecycleManager().scheduleTransaction(clientTransaction);就是调用了proc.getThread()的scheduleTransaction方法。

    但是proc.getThread()是什么呢?

    我们回头到AMS的attachApplicationLocked方法,

    1. private final boolean attachApplicationLocked(IApplicationThread thread,
    2. int pid, int callingUid, long startSeq) {
    3. ProcessRecord app;
    4. long startTime = SystemClock.uptimeMillis();
    5. long bindApplicationTimeMillis;
    6. ....
    7. app = mPidsSelfLocked.get(pid);
    8. // If this application record is still attached to a previous
    9. // process, clean it up now.
    10. if (app.thread != null) {
    11. handleAppDiedLocked(app, true, true);
    12. }
    13. app.makeActive(thread, mProcessStats);
    14. //mProcessesReady这个变量在AMS的 systemReady 中被赋值为true,
    15. //所以这里的normalMode也为true
    16. boolean normalMode = mProcessesReady || isAllowedWhileBooting(app.info);
    17. if (normalMode) {
    18. try {
    19. didSomething = mAtmInternal.attachApplication(app.getWindowProcessController());
    20. } catch (Exception e) {
    21. Slog.wtf(TAG, "Exception thrown launching activities in " + app, e);
    22. badApp = true;
    23. }
    24. }
    25. return true;
    26. }

    发现proc.getThread()是app.getWindowProcessController(),意思就是app.getWindowProcessController().getTread()

    frameworks\base\services\core\java\com\android\server\am\ProcessRecord.java:

    1. WindowProcessController getWindowProcessController() {
    2. return mWindowProcessController;
    3. }
    4. public void makeActive(IApplicationThread _thread, ProcessStatsService tracker) {
    5. ....
    6. thread = _thread;
    7. mWindowProcessController.setThread(thread);
    8. }

    我们发现它是在makeActive方法中赋值的,回到AMS的attachApplicationLocked方法,我们可以找到该方法,我们看下传进去的thread是谁。

    最后发现是一开始ActivityThread的attach方法传进来的

    1. private void attach(boolean system, long startSeq) {
    2. ....
    3. mgr.attachApplication(mAppThread, startSeq);
    4. ....
    5. }
    6. final ApplicationThread mAppThread = new ApplicationThread();

    所以最终mService.getLifecycleManager().scheduleTransaction(clientTransaction);就是调用了ApplicationThread的scheduleTransaction方法,ApplicationThread是ActivityThread的内部类,所以饶了一大圈最终又回到了ActivityThread。

    1. public void scheduleTransaction(ClientTransaction transaction) throws RemoteException {
    2. ActivityThread.this.scheduleTransaction(transaction);
    3. }

     这里调用了ActivityThread的scheduleTransaction,ActivityThread继承了ClientTransactionHandler,scheduleTransaction在ClientTransactionHandler类中。

    frameworks\base\core\java\android\app\ClientTransactionHandler.java:

    1. void scheduleTransaction(ClientTransaction transaction) {
    2. transaction.preExecute(this);
    3. sendMessage(ActivityThread.H.EXECUTE_TRANSACTION, transaction);
    4. }

    这里把信息发送到ActivityThread的内部类H里面

    1. case EXECUTE_TRANSACTION:
    2. final ClientTransaction transaction = (ClientTransaction) msg.obj;
    3. mTransactionExecutor.execute(transaction);
    4. break;

    frameworks\base\core\java\android\app\servertransaction\TransactionExecutor.java:

    1. public void execute(ClientTransaction transaction) {
    2. ...
    3. executeCallbacks(transaction);
    4. executeLifecycleState(transaction);
    5. ...
    6. }
    7. public void executeCallbacks(ClientTransaction transaction) {
    8. final List callbacks = transaction.getCallbacks();
    9. final int size = callbacks.size();
    10. for (int i = 0; i < size; ++i) {
    11. final ClientTransactionItem item = callbacks.get(i);
    12. item.execute(mTransactionHandler, token, mPendingActions);
    13. ....
    14. }
    15. }

    1.executeCallbacks

    这里拿出了ClientTransaction的callbacks,然后调用callback的execute。

    记得在ActivityStackSupervisor类的realStartActivityLocked方法中

    clientTransaction.addCallback(LaunchActivityItem.obtain(new Intent(r.intent),.....);

     我们回去看一下LaunchActivityItem的obtain

    frameworks\base\core\java\android\app\servertransaction\LaunchActivityItem.java:

    1. public static LaunchActivityItem obtain(Intent intent, int ident, ActivityInfo info,
    2. Configuration curConfig, Configuration overrideConfig, CompatibilityInfo compatInfo,
    3. String referrer, IVoiceInteractor voiceInteractor, int procState, Bundle state,
    4. PersistableBundle persistentState, List pendingResults,
    5. List pendingNewIntents, boolean isForward, ProfilerInfo profilerInfo,
    6. IBinder assistToken) {
    7. LaunchActivityItem instance = ObjectPool.obtain(LaunchActivityItem.class);
    8. if (instance == null) {
    9. instance = new LaunchActivityItem();
    10. }
    11. setValues(instance, intent, ident, info, curConfig, overrideConfig, compatInfo, referrer,
    12. voiceInteractor, procState, state, persistentState, pendingResults,
    13. pendingNewIntents, isForward, profilerInfo, assistToken);
    14. return instance;
    15. }

    接下来看LaunchActivityItem的execute

    1. public void execute(ClientTransactionHandler client, IBinder token,
    2. PendingTransactionActions pendingActions) {
    3. Trace.traceBegin(TRACE_TAG_ACTIVITY_MANAGER, "activityStart");
    4. ActivityClientRecord r = new ActivityClientRecord(token, mIntent, mIdent, mInfo,
    5. mOverrideConfig, mCompatInfo, mReferrer, mVoiceInteractor, mState, mPersistentState,
    6. mPendingResults, mPendingNewIntents, mIsForward,
    7. mProfilerInfo, client, mAssistToken);
    8. client.handleLaunchActivity(r, pendingActions, null /* customIntent */);
    9. Trace.traceEnd(TRACE_TAG_ACTIVITY_MANAGER);
    10. }

    这里的client是ActivityThread

    1. public Activity handleLaunchActivity(ActivityClientRecord r,
    2. PendingTransactionActions pendingActions, Intent customIntent) {
    3. ....
    4. final Activity a = performLaunchActivity(r, customIntent);
    5. if (a != null) {
    6. ....
    7. } else {
    8. // If there was an error, for any reason, tell the activity manager to stop us.
    9. try {
    10. ActivityTaskManager.getService()
    11. .finishActivity(r.token, Activity.RESULT_CANCELED, null,
    12. Activity.DONT_FINISH_TASK_WITH_ACTIVITY);
    13. } catch (RemoteException ex) {
    14. throw ex.rethrowFromSystemServer();
    15. }
    16. }
    17. return a;
    18. }

     2.executeLifecycleState

    1. private void executeLifecycleState(ClientTransaction transaction) {
    2. final ActivityLifecycleItem lifecycleItem = transaction.getLifecycleStateRequest();
    3. ....
    4. lifecycleItem.execute(mTransactionHandler, token, mPendingActions);
    5. }

    想知道这里的lifecycleItem是啥,同样需要回到realStartActivityLocked方法中

                    final ActivityLifecycleItem lifecycleItem;
                    if (andResume) {
                        lifecycleItem = ResumeActivityItem.obtain(dc.isNextTransitionForward());
                    } else {
                        lifecycleItem = PauseActivityItem.obtain();
                    }

    如果start的activity在栈顶,andResume为true。

    frameworks\base\core\java\android\app\servertransaction\ResumeActivityItem.java:

    1. public void execute(ClientTransactionHandler client, IBinder token,
    2. PendingTransactionActions pendingActions) {
    3. client.handleResumeActivity(token, true /* finalStateRequest */, mIsForward,
    4. "RESUME_ACTIVITY");
    5. }

    frameworks\base\core\java\android\app\servertransaction\PauseActivityItem.java:

    1. public void execute(ClientTransactionHandler client, IBinder token,
    2. PendingTransactionActions pendingActions) {
    3. Trace.traceBegin(TRACE_TAG_ACTIVITY_MANAGER, "activityPause");
    4. client.handlePauseActivity(token, mFinished, mUserLeaving, mConfigChanges, pendingActions,
    5. "PAUSE_ACTIVITY_ITEM");
    6. Trace.traceEnd(TRACE_TAG_ACTIVITY_MANAGER);
    7. }

    跟LaunchActivityItem类的execute调用ActivityThread的handleLaunchActivity方法一样,XXActivityItem就是去调用ActivityThread对应的handleXXActivity方法。

    总结下来就是ActivityStackSupervisor处理启动activity请求会把该请求封装成一个ClientTransaction,然后执行Activity对应操作时就向ClientTransaction添加对应的XXActivityItem。而ActivityThread是ClientTransaction的处理者,继承了ClientTransactionHandler,根据XXActivityItem调用handleXXActivity,去执行activity的启动、onResume等生命周期活动。

    流程:

  • 相关阅读:
    Haar cascade+opencv检测算法
    Python 环境安装系统教程——PyCharm
    CRM项目记录(四)
    java设计模式和面向对象编程思想
    weapp-tailwindcss - 在开发小程序中使用 tailwindcss 的最佳方式,免费开源,支持国内各家主流小程序平台
    CesiumJS PrimitiveAPI 高级着色入门 - 从参数化几何与 Fabric 材质到着色器 - 上篇
    使用DESeq2进行转录组原始count标准化和差异分析
    OpenCV实现人脸检测(Haar特征)
    计算机毕业论文选题java毕业设计软件源代码SSH健身房管理系统[包运行成功]
    抢滩未来 音视频引领新趋势
  • 原文地址:https://blog.csdn.net/weixin_41939525/article/details/126178948