笔友城堡 - 可定义的个人主页

前言

随着Android源码的变化,AndroidLauncher的启动位置也变化的,本文以Android13上为例,看一下Android开机后Launcher的启动。

记录于此,方便自己查阅。

正文

个人流水笔记,仅供参考。

SystemServer.java

framework/base/services/java/com/android/server/SystemServer.java

这里主要有如下功能

  1. 初始化环境,比如时间,时区,语言等

  2. 准备主线程Looper

  3. 启动服务引导服务,核心服务,其他服务

  4. 进入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.java

systemReady()

隐藏内容!
评论后才能查看!

番外篇

看一下怎么启动的,当然也是走马观花。

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()

参考文章

  1. 《Android源码》

  2. Android P之Launcher启动

相关文章

笔友城堡 - 可定义的个人主页

暂无评论

评论审核已启用。您的评论可能需要一段时间后才能被显示。

none
暂无评论...