随着Android源码的变化,AndroidLauncher的启动位置也变化的,本文以Android13上为例,看一下Android开机后Launcher的启动。
记录于此,方便自己查阅。
正文
个人流水笔记,仅供参考。
SystemServer.java
framework/base/services/java/com/android/server/SystemServer.java这里主要有如下功能
初始化环境,比如时间,时区,语言等
准备主线程Looper
启动服务引导服务,核心服务,其他服务
进入Looper循环
服务的启动主要涉及下面三个方法。
//开启引导服务startBootstrapServices();//开启核心服务startCoreServices();//开启其他服务startOtherServices();
本文暂时只关注Launcher的启动,
Launcher的启动涉及ActivityManagerService。
startBootstrapServices()
在startBootstrapServices()创建了mActivityManagerService对象。
ActivityTaskManagerService atm = mSystemServiceManager.startService( ActivityTaskManagerService.Lifecycle.class).getService();mActivityManagerService = ActivityManagerService.Lifecycle.startService( mSystemServiceManager, atm);mActivityManagerService.setSystemServiceManager(mSystemServiceManager);
只关注了Launcher的启动,Launcher的启动在mActivityManagerService的systemReady()方法之中。
startOtherServices()
systemReady()方法调用在startOtherServices()中。
systemReady()的调用表示系统要准备好了
mActivityManagerService.systemReady(() -> { //启动了SystemUI try { startSystemUi(context, windowManagerF); } catch (Throwable e) { reportWtf("starting System UI", e); } //略,这里很多代码,但不是我们关注点}
ActivityManagerService.java
framework/base/services/core/java/com/android/server/am/ActivityManagerService.javasystemReady()
番外篇
ActivityStarter.java
execute()
后面为了方便观看,省略很多代码。
int execute() { try { //略 int res; synchronized (mService.mGlobalLock) { //略 //走这里 res = executeRequest(mRequest); //略 return getExternalResult(res); } } finally { onExecutionComplete(); }}
executeRequest()
private int executeRequest(Request request) { //略 //走这里 mLastStartActivityResult = startActivityUnchecked(r, sourceRecord, voiceSession, request.voiceInteractor, startFlags, true /* doResume */, checkedOptions, inTask, inTaskFragment, restrictedBgActivity, intentGrants); return mLastStartActivityResult;}
startActivityUnchecked()
private int startActivityUnchecked(final ActivityRecord r, ActivityRecord sourceRecord, IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor, int startFlags, boolean doResume, ActivityOptions options, Task inTask, TaskFragment inTaskFragment, boolean restrictedBgActivity, NeededUriGrants intentGrants) { //略 try { //走这里 result = startActivityInner(r, sourceRecord, voiceSession, voiceInteractor, startFlags, doResume, options, inTask, inTaskFragment, restrictedBgActivity, intentGrants); } finally { Trace.traceEnd(Trace.TRACE_TAG_WINDOW_MANAGER); startedActivityRootTask = handleStartResult(r, options, result, newTransition, remoteTransition); mService.continueWindowLayout(); } postStartActivityProcessing(r, result, startedActivityRootTask); return result;}
startActivityInner()
int startActivityInner(final ActivityRecord r, ActivityRecord sourceRecord, IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor, int startFlags, boolean doResume, ActivityOptions options, Task inTask, TaskFragment inTaskFragment, boolean restrictedBgActivity, NeededUriGrants intentGrants) { //略 //mDoResume = true if (mDoResume) { final ActivityRecord topTaskActivity = startedTask.topRunningActivityLocked(); if (!mTargetRootTask.isTopActivityFocusable() || (topTaskActivity != null && topTaskActivity.isTaskOverlay() && mStartActivity != topTaskActivity)) { mTargetRootTask.ensureActivitiesVisible(null /* starting */, 0 /* configChanges */, !PRESERVE_WINDOWS); mTargetRootTask.mDisplayContent.executeAppTransition(); } else { if (mTargetRootTask.isTopActivityFocusable() && !mRootWindowContainer.isTopDisplayFocusedRootTask(mTargetRootTask)) { mTargetRootTask.moveToFront("startActivityInner"); } //走这里 mRootWindowContainer.resumeFocusedTasksTopActivities( mTargetRootTask, mStartActivity, mOptions, mTransientLaunch); } } //略 return START_SUCCESS;}
RootWindowContainer.java
resumeFocusedTasksTopActivities()
boolean resumeFocusedTasksTopActivities( Task targetRootTask, ActivityRecord target, ActivityOptions targetOptions, boolean deferPause) { //略 for (int displayNdx = getChildCount() - 1; displayNdx >= 0; --displayNdx) { final DisplayContent display = getChildAt(displayNdx); final boolean curResult = result; boolean[] resumedOnDisplay = new boolean[1]; display.forAllRootTasks(rootTask -> { final ActivityRecord topRunningActivity = rootTask.topRunningActivity(); if (!rootTask.isFocusableAndVisible() || topRunningActivity == null) { return; } if (rootTask == targetRootTask) { resumedOnDisplay[0] |= curResult; return; } if (rootTask.getDisplayArea().isTopRootTask(rootTask) && topRunningActivity.isState(RESUMED)) { rootTask.executeAppTransition(targetOptions); } else { resumedOnDisplay[0] |= topRunningActivity.makeActiveIfNeeded(target); } }); result |= resumedOnDisplay[0]; if (!resumedOnDisplay[0]) { final Task focusedRoot = display.getFocusedRootTask(); //不为null if (focusedRoot != null) { //走这里 result |= focusedRoot.resumeTopActivityUncheckedLocked(target, targetOptions); } else if (targetRootTask == null) { result |= resumeHomeActivity(null /* prev */, "no-focusable-task", display.getDefaultTaskDisplayArea()); } } } return result;}
Task.java
resumeTopActivityUncheckedLocked()
@GuardedBy("mService")boolean resumeTopActivityUncheckedLocked(ActivityRecord prev, ActivityOptions options) { return resumeTopActivityUncheckedLocked(prev, options, false /* skipPause */);}
resumeTopActivityUncheckedLocked()
@GuardedBy("mService")boolean resumeTopActivityUncheckedLocked(ActivityRecord prev, ActivityOptions options, boolean deferPause) { //true if (mInResumeTopActivity) { return false; } //略 //上面返回了 return someActivityResumed;}
返回到上面execute()
参考文章
《Android源码》
《

