前言

随着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
暂无评论...