Android系统在启动时安装应用程序的过程,这些应用程序安装好之后,还需要有一个Home应用程序来负责把它们在桌面上展示出来,在Android系统中,这个默认的Home应用程序就是Launcher了,本文将详细分析Launcher应用程序的启动过程。
cpp
@frameworks/base/services/core/java/com/android/server/am/UserController.java
finishUserUnlocking
mHandler.obtainMessage(USER_UNLOCK_MSG, userId, 0, uss).sendToTarget();
case USER_UNLOCK_MSG: finishUserUnlocked
finishUserUnlockedCompleted
mHandler.obtainMessage(USER_UNLOCKED_MSG, userId, 0).sendToTarget();
case USER_UNLOCKED_MSG: mInjector.getSystemServiceManager().onUserUnlocked(msg.arg1);
mService.mTaskSupervisor.onUserUnlocked(user.getUserIdentifier());
@frameworks/base/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java
scheduleStartHome("userUnlocked");
mHandler.obtainMessage(START_HOME_MSG, reason).sendToTarget();
case START_HOME_MSG: { mRootWindowContainer.startHomeOnEmptyDisplays((String) msg.obj);
@frameworks/base/services/core/java/com/android/server/wm/RootWindowContainer.java
startHomeOnEmptyDisplays
forAllTaskDisplayAreas(taskDisplayArea -> {
startHomeOnTaskDisplayArea(mCurrentUser, myReason, taskDisplayArea,
@frameworks/base/services/core/java/com/android/server/wm/ActivityStartController.java
Service.getActivityStartController().startHomeActivity(homeIntent, aInfo, myReason, taskDisplayArea);
@frameworks/base/services/core/java/com/android/server/wm/ActivityStarter.java
mLastHomeActivityStartResult = obtainStarter(intent, "startHomeActivity: " + reason).setActivityOptions(options.toBundle()).execute();
res = executeRequest(mRequest);
ActivityRecord r = new ActivityRecord.Builder(mService)..setActivityInfo(aInfo)
mLastStartActivityResult = startActivityUnchecked(r, sourceRecord, voiceSession,
result = startActivityInner(r, sourceRecord, voiceSession, voiceInteractor,startFlags, doResume, options, inTask, inTaskFragment, restrictedBgActivity,
mTargetRootTask.startActivityLocked(mStartActivity,
@frameworks/base/services/core/java/com/android/server/wm/RootWindowContainer.java
mRootWindowContainer.resumeFocusedTasksTopActivities(mTargetRootTask, mStartActivity, mOptions, mTransientLaunch);
final Task focusedRoot = display.getFocusedRootTask();
@frameworks/base/services/core/java/com/android/server/wm/Task.java
focusedRoot.resumeTopActivityUncheckedLocked(target, targetOptions);
someActivityResumed = resumeTopActivityInnerLocked(prev, options, deferPause);
@frameworks/base/services/core/java/com/android/server/wm/TaskFragment.java
resumed[0] = topFragment.resumeTopActivity(prev, options, deferPause);
ActivityRecord next = topRunningActivity(true /* focusableOnly */);
pausing |= startPausing(mTaskSupervisor.mUserLeaving, false /* uiSleeping */, next, "resumeTopActivity"); //这里就是stop上一个activity的地方
if (next.attachedToProcess()) { //要启动的activity所在的进程已经起来了,直接通过事务的形式去启动activity
final ClientTransaction transaction = ClientTransaction.obtain(next.app.getThread(), next.appToken);
mAtmService.getLifecycleManager().scheduleTransaction(transaction);
} else { //如果进程没启动,调用ActivityTaskSupervisor的startSpecificActivity
@frameworks/base/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java
mTaskSupervisor.startSpecificActivity(next, true, true);
@base/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
mService.startProcessAsync(r, knownToBeDead, isTop, isTop ? "top-activity" : "activity");
final Message m = PooledLambda.obtainMessage(ActivityManagerInternal::startProcess, mAmInternal, activity.processName,
mH.sendMessage(m);
LocalService::startProcess //class LocalService extends ActivityManagerInternal
startProcessLocked(processName, info, knownToBeDead, 0 /* intentFlags */, new HostingRecord(hostingType, hostingName, isTop),
@frameworks/base/services/core/java/com/android/server/am/ProcessList.java
return mProcessList.startProcessLocked(processName, info, knownToBeDead, intentFlags,
startProcessLocked(app, hostingRecord, zygotePolicyFlags, abiOverride);
startProcessLocked(app, hostingRecord, zygotePolicyFlags, false
startProcessLocked(hostingRecord, entryPoint, app, uid, gids, runtimeFlags, zygotePolicyFlags, mountExternal, seInfo, requiredAbi,
mService.mProcStartHandler.post(() -> handleProcessStart( app,
handleProcessStartedLocked(app, startResult, startSeq);
return handleProcessStartedLocked(pending, startResult.pid, startResult.usingWrapper,
buf.append("Start proc "); //Start proc 1486:com.dynabook.VDlauncher/1000 for top-activity {com.dynabook.VDlauncher/com.dynabook.VDlauncher.MainActivity}
buf.append(pid);
buf.append(':');
buf.append(app.processName);
buf.append('/');
buf.append(app.getHostingRecord().getType());
buf.append(app.getHostingRecord().getName());
..............
@src/main/java/com/dynabook/VDlauncher/MainActivity.java
MainActivity::onCreate
--------------------------------------------回归线---------------------------------
@frameworks/base/services/core/java/com/android/server/am/UserController.java finishUserUnlocking mHandler.obtainMessage(USER_UNLOCK_MSG, userId, 0, uss).sendToTarget(); case USER_UNLOCK_MSG: finishUserUnlocked finishUserUnlockedCompleted mHandler.obtainMessage(USER_UNLOCKED_MSG, userId, 0).sendToTarget(); case USER_UNLOCKED_MSG: mInjector.getSystemServiceManager().onUserUnlocked(msg.arg1); mService.mTaskSupervisor.onUserUnlocked(user.getUserIdentifier()); @frameworks/base/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java scheduleStartHome("userUnlocked"); mHandler.obtainMessage(START_HOME_MSG, reason).sendToTarget(); case START_HOME_MSG: { mRootWindowContainer.startHomeOnEmptyDisplays((String) msg.obj); @frameworks/base/services/core/java/com/android/server/wm/RootWindowContainer.java startHomeOnEmptyDisplays forAllTaskDisplayAreas(taskDisplayArea -> { startHomeOnTaskDisplayArea(mCurrentUser, myReason, taskDisplayArea, @frameworks/base/services/core/java/com/android/server/wm/ActivityStartController.java Service.getActivityStartController().startHomeActivity(homeIntent, aInfo, myReason, taskDisplayArea); @frameworks/base/services/core/java/com/android/server/wm/ActivityStarter.java mLastHomeActivityStartResult = obtainStarter(intent, "startHomeActivity: " + reason).setActivityOptions(options.toBundle()).execute(); res = executeRequest(mRequest); ActivityRecord r = new ActivityRecord.Builder(mService)..setActivityInfo(aInfo) mLastStartActivityResult = startActivityUnchecked(r, sourceRecord, voiceSession, result = startActivityInner(r, sourceRecord, voiceSession, voiceInteractor,startFlags, doResume, options, inTask, inTaskFragment, restrictedBgActivity, mTargetRootTask.startActivityLocked(mStartActivity, @frameworks/base/services/core/java/com/android/server/wm/RootWindowContainer.java mRootWindowContainer.resumeFocusedTasksTopActivities(mTargetRootTask, mStartActivity, mOptions, mTransientLaunch); final Task focusedRoot = display.getFocusedRootTask(); @frameworks/base/services/core/java/com/android/server/wm/Task.java focusedRoot.resumeTopActivityUncheckedLocked(target, targetOptions); someActivityResumed = resumeTopActivityInnerLocked(prev, options, deferPause); @frameworks/base/services/core/java/com/android/server/wm/TaskFragment.java resumed[0] = topFragment.resumeTopActivity(prev, options, deferPause); ActivityRecord next = topRunningActivity(true /* focusableOnly */); pausing |= startPausing(mTaskSupervisor.mUserLeaving, false /* uiSleeping */, next, "resumeTopActivity"); //这里就是stop上一个activity的地方 if (next.attachedToProcess()) { //要启动的activity所在的进程已经起来了,直接通过事务的形式去启动activity final ClientTransaction transaction = ClientTransaction.obtain(next.app.getThread(), next.appToken); mAtmService.getLifecycleManager().scheduleTransaction(transaction); } else { //如果进程没启动,调用ActivityTaskSupervisor的startSpecificActivity @frameworks/base/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java mTaskSupervisor.startSpecificActivity(next, true, true); @base/services/core/java/com/android/server/wm/ActivityTaskManagerService.java mService.startProcessAsync(r, knownToBeDead, isTop, isTop ? "top-activity" : "activity"); final Message m = PooledLambda.obtainMessage(ActivityManagerInternal::startProcess, mAmInternal, activity.processName, mH.sendMessage(m); LocalService::startProcess //class LocalService extends ActivityManagerInternal startProcessLocked(processName, info, knownToBeDead, 0 /* intentFlags */, new HostingRecord(hostingType, hostingName, isTop), @frameworks/base/services/core/java/com/android/server/am/ProcessList.java return mProcessList.startProcessLocked(processName, info, knownToBeDead, intentFlags, startProcessLocked(app, hostingRecord, zygotePolicyFlags, abiOverride); startProcessLocked(app, hostingRecord, zygotePolicyFlags, false startProcessLocked(hostingRecord, entryPoint, app, uid, gids, runtimeFlags, zygotePolicyFlags, mountExternal, seInfo, requiredAbi, mService.mProcStartHandler.post(() -> handleProcessStart( app, handleProcessStartedLocked(app, startResult, startSeq); return handleProcessStartedLocked(pending, startResult.pid, startResult.usingWrapper, buf.append("Start proc "); //Start proc 1486:com.dynabook.VDlauncher/1000 for top-activity {com.dynabook.VDlauncher/com.dynabook.VDlauncher.MainActivity} buf.append(pid); buf.append(':'); buf.append(app.processName); buf.append('/'); buf.append(app.getHostingRecord().getType()); buf.append(app.getHostingRecord().getName()); .............. @src/main/java/com/dynabook/VDlauncher/MainActivity.java MainActivity::onCreate