返回顶部
首页 > 资讯 > 移动开发 >Android系统启动(四) — Launcher 启动过程
  • 284
分享到

Android系统启动(四) — Launcher 启动过程

androidjava开发语言 2023-09-04 22:09:08 284人浏览 安东尼
摘要

1 Launcher 概述 系统启动的最后一步是启动一个应用程序来显示系统中已经安装的应用程序,这个应用程序就叫做 Launcher。Launcher 在启动过程中会请求 PackageManager

1 Launcher 概述

系统启动的最后一步是启动一个应用程序来显示系统中已经安装的应用程序,这个应用程序就叫做 LauncherLauncher 在启动过程中会请求 PackageManagerService 返回系统中已经安装的应用程序信息,并将这些信息封装成一个快捷图标列表显示在系统屏幕上,这样用户就可以通过点击这些快捷图标来启动相应的应用程序。

通俗的讲,Launcher 就是 Android 系统的桌面, 它的作用主要有以下两点:

  • 作为 Android 系统的启动器,用于启动应用程序;
  • 作为 Android 系统的桌面,用于显示和管理应用程序的快捷图标或者其他桌面组件;

2 Launcher 启动过程

SystemServer 进程在启动的过程中会启动 PackageManagerServicePackageManagerService 启动后会将系统中的应用程序安装完成,在此之前已经启动的 ActivityManagerService 会将 Launcher 启动起来。

Launcher 的启动分为三个部分:

  • SystemServer 完成启动 Launcher Activity 的相关配置;
  • ZyGote 进程 forkLauncher 进程;
  • 进入 ActivityThread.main 函数,最终完成 LauncherActivity.onCreate 操作;

第一阶段 完成 Launcher 的相关配置

图1

SystemServer.startOtherServices 方法中调用 ActivityManagerService.systemReady方法,Launcher 进程的启动就是从这里开始的,以下是相关源码

// /frameworks/base/services/java/com/android/server/SystemServer.javaprivate void startOtherServices() {    ...    MactivityManagerService.systemReady(() -> { // 1        Slog.i(TAG, "Making services ready");        traceBeginAndSlog("StartActivityManagerReadyPhase");        mSystemServiceManager.startBootPhase(            SystemService.PHASE_ACTIVITY_MANAGER_READY);        traceEnd();        }       ...}                          

以下是 ActivityManagerService.systemReady 方法的源码:

// /frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.javapublic ActivityTaskManagerInternal mAtmInternal;public void systemReady(final Runnable goinGCallback, TimingsTraceLog traceLog) {    ...    // 启动 Home Activity,即 Launcher 应用的入口 Activity,这里指的是,在所有屏幕上启动 Launcher。因为 Android 10 开始支持多屏幕,比如手机屏幕、虚拟投屏、外接屏幕    mAtmInternal.startHomeOnAllDisplays(currentUserId, "systemReady"); // 1    ...}

这里的 mAtmInternalActivityTaskManagerInternal 的实例,ActivityTaskManagerInternal 是一个抽象类。 ActivityManagerService 中的内部类 LocalService 实现了 ActivityTaskManagerInternal

// /frameworks/base/services/core/java/com/android/server/wm/ActivityTaskManagerService.javafinal class LocalService extends ActivityTaskManagerInternal {    ...    @Override    public boolean startHomeOnAllDisplays(int userId, String reason) {        synchronized (mGlobalLock) {            return mRootActivityContainer.startHomeOnAllDisplays(userId, reason);        }    }    ...}

LocalService.startHomeOnAllDisplays 方法中调用了 RootActivityContainer.startHomeOnAllDisplays 方法。RootActivityContainer 的作用是,调用 PackageManagerService 中去查询手机系统中已经安装的应用哪一个符合 Launcher 标准,且返回一个 Intent 对象,并且交给 ActivityStarter

// /frameworks/base/services/core/java/com/android/server/wm/RootActivityContainer.javaboolean startHomeOnAllDisplays(int userId, String reason) {    boolean homeStarted = false;    for (int i = mActivityDisplays.size() - 1; i >= 0; i--) {        final int displayId = mActivityDisplays.get(i).mDisplayId;        homeStarted |= startHomeOnDisplay(userId, reason, displayId); // 1    }    return homeStarted;}boolean startHomeOnDisplay(int userId, String reason, int displayId) {    return startHomeOnDisplay(userId, reason, displayId, false ,false );}boolean startHomeOnDisplay(int userId, String reason, int displayId,boolean allowInstrumenting, boolean fromHomeKey) {    ...    Intent homeIntent = null;    ActivityInfo aInfo = null;    if (displayId == DEFAULT_DISPLAY) {        // 构建一个 category 为 CATEGORY_HOME 的 Intent,表明是 HomeActivity        homeIntent = mService.getHomeIntent(); // 2        // 通过 PMS 从系统所有已安装的引用中找到一个符合 homeIntent 的 Activity        aInfo = resolveHomeActivity(userId, homeIntent); // 3    } else if (shouldPlaceSecondaryHomeOnDisplay(displayId)) {        ...    }    ...    // 启动 Launcher    mService.getActivityStartController().startHomeActivity(homeIntent, aInfo,     myReason, displayId); // 4    return true;}

在注释 2 处调用了 ActivityTaskManagerService.getHomeIntent() 方法来构建一个 categoryCATEGORY_HOMEIntent,表明是一个符合 Launcher 应用的 Intent。在注释 3 处通过调用 resolveHomeActivity 方法解析出需要启动 Activity 的信息。在注释 4 处调用 ActivityTaskManagerService.getActivityStartController() 获取 ActivityStartController,这个类的作用就是做启动前的各项检查,比如,Activity 是否有清单文件注册,Class 文件是否存在等,之后启动 Activity

以下是相关的时序图:

图2

首先,看一下 ActivityTaskManagerService.getHomeIntent() 方法,主要是构建一个符合 Launcher 应用的 Intent

// frameworks/base/services/core/java/com/android/server/wm/ActivityTaskManagerService.javaIntent getHomeIntent() {    Intent intent = new Intent(mTopAction, mTopData != null ? Uri.parse(mTopData) : null);    intent.setComponent(mTopComponent);    intent.addFlags(Intent.FLAG_DEBUG_TRIAGED_MISSING);     if (mFactoryTest != FactoryTest.FACTORY_TEST_LOW_LEVEL) {        intent.addCategory(Intent.CATEGORY_HOME); // 1    }    return intent;}     

在注释 1 处代表的是要启动 Activity 的意图,通常来说,整个系统只会有一个应用在清单文件中配置 CATEGORY_HOME,如果配置了多个,系统在启动的时候就会要求用户手动去选择哪一个应用作为启动应用,如果在系统设置应用中进行配置了,就会选择配置的那个应用。

接着看 RootActivityContainer.resolveIntentInternal 方法:

// /frameworks/base/services/core/java/com/android/server/wm/RootActivityContainer.javaprivate ResolveInfo resolveIntentInternal(Intent intent, String resolvedType,              int flags, int userId,               boolean resolveForStart,               int filterCallingUid) {    try {        Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "resolveIntent");        if (!sUserManager.exists(userId)) return null;        final int callingUid = Binder.getCallingUid();        flags = updateFlagsForResolve(flags, userId, intent, filterCallingUid, resolveForStart);        mPermissionManager.enforceCrossUserPermission(callingUid, userId,                          false , false , "resolve intent");        Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "queryIntentActivities");        final List<ResolveInfo> query = queryIntentActivitiesInternal(intent, resolvedType,              flags, filterCallingUid, userId, resolveForStart, true );        Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER);        final ResolveInfo bestChoice =            chooseBestActivity(intent, resolvedType, flags, query, userId);        return bestChoice;    } finally {        Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER);    }}

通过 Binder 跨进程通信通知 PackageManagerService 从系统所有已经安装的应用中找到一个符合 homeInentActivity

再看 ActivityStartController.startHomeActivity 的代码:

// /frameworks/base/services/core/java/com/android/server/wm/ActivityStartController.javavoid startHomeActivity(Intent intent, ActivityInfo aInfo, String reason,                        int displayId) {    final ActivityOptions options = ActivityOptions.makeBasic();    options.setLaunchWindowingMode(WINDOWING_MODE_FULLSCREEN);    if (!ActivityRecord.isResolverActivity(aInfo.name)) {        options.setLaunchActivityType(ACTIVITY_TYPE_HOME);    }    options.setLaunchDisplayId(displayId);    mLastHomeActivityStartResult =         obtainStarter(intent, "startHomeActivity: " + reason) // 1        .setOutActivity(tmpOutRecord)        .setCallingUid(0)        .setActivityInfo(aInfo)        .setActivityOptions(options.toBundle())        .execute(); // 2    mLastHomeActivityStartRecord = tmpOutRecord[0];    final ActivityDisplay display =        mService.mRootActivityContainer.getActivityDisplay(displayId);    final ActivityStack homeStack = display != null ? display.getHomeStack() : null;    if (homeStack != null && homeStack.mInResumeTopActivity) {         mSupervisor.scheduleResumeTopActivities();    }}ActivityStarter obtainStarter(Intent intent, String reason) { // 3    return mFactory.obtain().setIntent(intent).setReason(reason);}

在注释 1 处先获取一个 ActivityStarter ,主要用于启动 Activity,然后把需要的参数设置进去,最后再调用它的 execute() 方法:

// /frameworks/base/services/core/java/com/android/server/wm/ActivityStarter.javaint execute() {    try {        if (mRequest.mayWait) {           ...        } else {            return startActivity(...);        }    } finally {        onExecutionComplete();    }}

以下是 ActivityStarter.startActivity 的相关源码,这个方法主要是用来做 Activity 启动之前的安全校验:

// /frameworks/base/services/core/java/com/android/server/wm/ActivityStarter.javaprivate int startActivity(...) {    mSupervisor.getActivityMetricsLogger().notifyActivityLaunching(intent);    int err = ActivityManager.START_SUCCESS;    // Pull the optional Ephemeral Installer-only bundle out of the options early.    final Bundle verificationBundle        = options != null ? options.popAppVerificationBundle() : null;    WindowProcessController callerApp = null;    if (caller != null) {        callerApp = mService.getProcessController(caller);        if (callerApp != null) {            callingPid = callerApp.getPid();            callingUid = callerApp.mInfo.uid;        } else {            Slog.w(TAG, "Unable to find app for caller " + caller                   + " (pid=" + callingPid + ") when starting: "                   + intent.toString());            err = ActivityManager.START_PERMISSION_DENIED;        }    }...    final int res = startActivity(r, sourceRecord, voiceSession, voiceInteractor,       startFlags, true , checkedOptions,       inTask, outActivity, restrictedBgActivity);    ...}private int startActivity(final ActivityRecord r, ActivityRecord sourceRecord,                           IVoiceInteractionSession voiceSession,                           IVoiceInteractor voiceInteractor, int startFlags,                           boolean doResume, ActivityOptions options,                           TaskRecord inTask, ActivityRecord[] outActivity,                          boolean restrictedBgActivity) {    ...    result = startActivityUnchecked(r, sourceRecord, voiceSession, voiceInteractor,         startFlags, doResume, options, inTask,         outActivity, restrictedBgActivity); // 1    ...}

注释 1 处调用了 ActivityStarter.startActivityUnchecked 的代码:

// /frameworks/base/services/core/java/com/android/server/wm/ActivityStarter.javaprivate int startActivityUnchecked(final ActivityRecord r,        ActivityRecord sourceRecord,        IVoiceInteractionSession voiceSession,        IVoiceInteractor voiceInteractor, int startFlags,        boolean doResume, ActivityOptions options,        TaskRecord inTask, ActivityRecord[] outActivity,        boolean restrictedBgActivity) {...    final int preferredWindowingMode = mLaunchParams.mWindowingMode;    computeLaunchingTaskFlags(); // 1    computeSourceStack(); // 2    mIntent.setFlags(mLaunchFlags);    ActivityRecord reusedActivity = getReusableIntentActivity();...    mRootActivityContainer.resumeFocusedStacksTopActivities(); // 3    ...}

注释 1 处的 ActivityStarter.computeLaunchingTaskFlags() 方法是根据 Activitylauncher modeintent.flag 计算出 Activity 的入栈方式。注释 2 处的 ActivityStarter.computeSourceStack() 计算从哪个栈中启动该 Activity。注释 3 处调用了 RootActivityContainer.resumeFocusedStacksTopActivities 方法:

// /frameworks/base/services/core/java/com/android/server/wm/RootActivityContainer.javaboolean resumeFocusedStacksTopActivities() {    return resumeFocusedStacksTopActivities(null, null, null);}boolean resumeFocusedStacksTopActivities(    ActivityStack targetStack, ActivityRecord target, ActivityOptions targetOptions) {...    if (targetStack != null && (targetStack.isTopStackOnDisplay()    || getTopDisplayFocusedStack() == targetStack)) {        result = targetStack.resumeTopActivityUncheckedLocked(target, targetOptions);    }    for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {        ...        if (!resumedOnDisplay) {            final ActivityStack focusedStack = display.getFocusedStack();             if (focusedStack != null) {                focusedStack.resumeTopActivityUncheckedLocked(target, targetOptions); // 1            }        }    }    return result;}

在注释 1 处调用 ActivityStack.resumeTopActivityUncheckedLocked 方法:

// /frameworks/base/services/core/java/com/android/server/wm/ActivityStack.java@GuardedBy("mService")boolean resumeTopActivityUncheckedLocked(ActivityRecord prev, ActivityOptions options) {    ...    result = resumeTopActivityInnerLocked(prev, options);    ...}@GuardedBy("mService")private boolean resumeTopActivityInnerLocked(ActivityRecord prev,                  ActivityOptions options) {    ...    if (anim) {        next.applyOptionsLocked();    } else {        next.clearOptionsLocked();    }        mStackSupervisor.mNoAnimActivities.clear();        if (next.attachedToProcess()) { // 待启动的进程是否创建完成,如果没有就会到 else 中        ...    }  else {         mStackSupervisor.startSpecificActivityLocked(next, true, true); // 1    }    ...}

在注释 1 处调用 ActivityStackSupervisor.startSpecificActivityLocked

// /frameworks/base/services/core/java/com/android/server/wm/ActivityStackSupervisor.javavoid startSpecificActivityLocked(ActivityRecord r, boolean andResume,     boolean checkConfig) {    ...    try {        ...        final Message msg = PooledLambda.obtainMessage(            ActivityManagerInternal::startProcess,  // 1            mService.mAmInternal, r.processName, r.info.applicationInfo,             knownToBeDead, "activity", r.intent.getComponent());        mService.mH.sendMessage(msg);    } finally {        Trace.traceEnd(TRACE_TAG_ACTIVITY_MANAGER);    }}

注释 1 出调用的其实是 ActivityManagerService.startProcess 方法,开始创建进程:

// /frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.javapublic final class LocalService extends ActivityManagerInternal {    @Override    public void startProcess(String processName, ApplicationInfo info, boolean knownToBeDead, String hostingType,  ComponentName hostingName) {        try {            if (Trace.isTagEnabled(Trace.TRACE_TAG_ACTIVITY_MANAGER)) {                Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "startProcess:"     + processName);            }            synchronized (ActivityManagerService.this) {                startProcessLocked(processName, info, knownToBeDead,        0 ,       new HostingRecord(hostingType, hostingName),       false ,        false ,       true ); // 1            }        } finally {            Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);        }    }        @GuardedBy("this")    final ProcessRecord startProcessLocked(String processName,               ApplicationInfo info,                boolean knownToBeDead, int intentFlags,               HostingRecord hostingRecord,                boolean allowWhileBooting,                boolean isolated, boolean keepIfLarge) {        return mProcessList.startProcessLocked(processName, info, knownToBeDead,                    intentFlags,                   hostingRecord, allowWhileBooting,                    isolated, 0 ,                    keepIfLarge,                   null ,                    null ,                    null ,                   null ); // 2    }}

在注释 1 处调用 LocalService.startProcessLocked 方法。在 LocalService.startProcessLocked 方法中又把进程创建的工作委派给了 ProcessList。接着看 ProcessList.startProcessLocked 方法:

// /frameworks/base/services/core/java/com/android/server/am/ProcessList.java@GuardedBy("mService")final void startProcessLocked(ProcessRecord app, HostingRecord hostingRecord) {    startProcessLocked(app, hostingRecord, null );}@GuardedBy("mService")final boolean startProcessLocked(ProcessRecord app, HostingRecord hostingRecord,     String abiOverride) {    return startProcessLocked(app, hostingRecord, false ,  false , abiOverride);}@GuardedBy("mService")boolean startProcessLocked(ProcessRecord app, HostingRecord hostingRecord,                           boolean disableHiddenapiChecks,boolean mountExtStorageFull,                           String abiOverride) {    ...    final String entryPoint = "android.app.ActivityThread"; // 1    return startProcessLocked(hostingRecord, entryPoint, app, uid, gids,  runtimeFlags, mountExternal, seInfo, requiredAbi,   instructionSet, invokeWith, startTime);}@GuardedBy("mService")final ProcessRecord startProcessLocked(String processName, ApplicationInfo info,           boolean knownToBeDead, int intentFlags,            HostingRecord hostingRecord,           boolean allowWhileBooting, boolean isolated,            int isolatedUid, boolean keepIfLarge,           String abiOverride, String entryPoint,            String[] entryPointArgs, Runnable crashHandler) {    if (!isolated) {        app = getProcessRecordLocked(processName, info.uid, keepIfLarge);        checkSlow(startTime, "startProcess: after getProcessRecord");        ...    }    final String entryPoint = "android.app.ActivityThread";    ...}

这几个方法的作用是在进程创建之前,配置一些必要的参数,比如版本号之类的参数。在注释 1 处是一个非常重要的参数,entryPoint 是新进程的入口。所以,Android 应用的程序入口是 ActivityThread

创建进程所需的参数配置完成后,最终会走到 ZygoteProcess 类中:

private Process.ProcessStartResult startViaZygote(@NonNull final String processClass,                      @Nullable final String niceName,                      final int uid, final int gid,                      @Nullable final int[] gids,                      int runtimeFlags, int mountExternal,                      int targetSdkVersion,                      @Nullable String seInfo,                      @NonNull String abi,                      @Nullable String instructionSet,                      @Nullable String appDataDir,                      @Nullable String invokeWith,                      boolean startChildZygote,                      @Nullable String packageName,                      boolean useUsapPool,                      @Nullable String[] extraArgs)   throws ZygoteStartFailedEx {    synchronized (mLock) {        return zygoteSendArgsAndGetResult(openZygoteSocketIfNeeded(abi),              useUsapPool, argsForZygote);    }}

此时还处于 system_server进程,这个类的目的是创建本地的 Socket 连接对象,连接到 Zygote 进程的 Socket 方法,然后通过字符输入流,把创建进程所需要的参数发送过去。

第二阶段:Zygote 进程接收请求并创建 Launcher 进程

参考 应用程序进程启动过程

第三个阶段:进入 ActivityThread.main,最终完成 Launcher.onCreate 操作

Zygote fork 出了 Launcher 进程,并把接下来的 Launcher 启动任务交给了 ActivityThread 来进行,接下来就从 ActivityThread.main 方法来分析 Launcher 的创建过程。 以下是 ActivityThread 启动 Activity 的时序图:

ActivityThread启动Activity时序图

ActivityThread.main 方法是程序入口,以下是相关代码:

// /frameworks/base/core/java/android/app/ActivityThread.javapublic static void main(String[] args) {    ...    Looper.prepareMainLooper();...    ActivityThread thread = new ActivityThread();    thread.attach(false, startSeq); // 1    if (sMainThreadHandler == null) {        sMainThreadHandler = thread.getHandler();    }...      Looper.loop();    throw new RuntimeException("Main thread loop unexpectedly exited");}

在注释 1 处调用 ActivityThread.attach 方法,以下是相关源码:

// /frameworks/base/core/java/android/app/ActivityThread.java@UnsupportedAppUsageprivate void attach(boolean system, long startSeq) {    sCurrentActivityThread = this;    mSystemThread = system;    if (!system) {        ...        final IActivityManager mgr = ActivityManager.getService(); // 1        try {            mgr.attachApplication(mAppThread, startSeq); // 2        } catch (RemoteException ex) {            throw ex.rethrowFromSystemServer();        }        ...    } else {        ...    }    ...}

在注释 1 处获取 ActivityManagerService 的实例,在注释 2 处调用 ActivityManagerService.attachApplication 方法:

// /frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java@Overridepublic final void attachApplication(IApplicationThread thread, long startSeq) {    if (thread == null) {        throw new SecurityException("Invalid application interface");    }    synchronized (this) {        // 通过 Binder 获取传入的 pid 信息        int callingPid = Binder.getCallingPid();         final int callingUid = Binder.getCallingUid();        final long origId = Binder.clearCallingIdentity();        attachApplicationLocked(thread, callingPid, callingUid, startSeq); // 1        Binder.restoreCallingIdentity(origId);    }}public ActivityTaskManagerInternal mAtmInternal;@GuardedBy("this")private boolean attachApplicationLocked(@NonNull IApplicationThread thread,            int pid, int callingUid, long startSeq) {    ...    didSomething = mAtmInternal.attachApplication(app.getWindowProcessController()); // 2    ...}

在注释 1 处调用了 ActivityManagerService.attachApplicationLocked 方法。注释 2 处的 mAtmInternalActivityTaskManagerInternal 类型的变量, ActivityTaskManagerService 中的内部类 LocalService 继承自 ActivityTaskManagerInternal,以下是相关源码:

// /frameworks/base/services/core/java/com/android/server/wm/ActivityTaskManagerService.javafinal class LocalService extends ActivityTaskManagerInternal {    @HotPath(caller = HotPath.PROCESS_CHANGE)    @Override    public boolean attachApplication(WindowProcessController wpc) throws RemoteException {        synchronized (mGlobalLockWithoutBoost) {            return mRootActivityContainer.attachApplication(wpc); // 1        }    }}

在注释 1 处调用了 RootActivityContainer.attachApplication 方法:

// frameworks/base/services/core/java/com/android/server/wm/RootActivityContainer.javaboolean attachApplication(WindowProcessController app) throws RemoteException {    final String processName = app.mName;    boolean didSomething = false;    for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {        final ActivityDisplay display = mActivityDisplays.get(displayNdx);        final ActivityStack stack = display.getFocusedStack();        if (stack != null) {            stack.getAllRunningVisibleActivitiesLocked(mTmpActivityList);            final ActivityRecord top = stack.topRunningActivityLocked();            final int size = mTmpActivityList.size();            for (int i = 0; i < size; i++) {                final ActivityRecord activity = mTmpActivityList.get(i);                if (activity.app == null && app.mUid == activity.info.applicationInfo.uid                    && processName.equals(activity.processName)) {                    try {                        // 1                        if (mStackSupervisor.realStartActivityLocked(activity, app,    top == activity ,              true )) {didSomething = true;                        }                    } catch (RemoteException e) {                        Slog.w(TAG, "Exception in new application when starting activity "   + top.intent.getComponent().flattenToShortString(), e);                        throw e;                    }                }            }        }    }    if (!didSomething) {        ensuReactivitiesVisible(null, 0, false );    }    return didSomething;}

在注释 1 处调用 ActivityStackSupervisor.realStartActivityLocked 方法:

// /frameworks/base/services/core/java/com/android/server/wm/ActivityStackSupervisor.javaboolean realStartActivityLocked(ActivityRecord r, WindowProcessController proc,    boolean andResume, boolean checkConfig) throws RemoteException {...    clientTransaction.addCallback(LaunchActivityItem.obtain(new Intent(r.intent),                         System.identityHashCode(r), r.info,                           mergedConfiguration.getGlobalConfiguration(),                         mergedConfiguration.getOverrideConfiguration(), r.compat,                         r.launchedFromPackage, task.voiceInteractor,          proc.getReportedProcState(), r.icicle, r.persistentState, results,                          newIntents, dc.isNextTransitionForward(),                         proc.createProfilerInfoIfNeeded(), r.assistToken)); // 1...    // Schedule transaction.    mService.getLifecycleManager().scheduleTransaction(clientTransaction); // 2 ...}

注释 2ActivityTaskManagerService.getLifecycleManager 方法返回 ClientLifecycleManager 实例。以下是 ClientLifecycleManager.scheduleTransaction 的相关源码:

// /frameworks/base/services/core/java/com/android/server/wm/ClientLifecycleManager.javavoid scheduleTransaction(ClientTransaction transaction) throws RemoteException {    final IApplicationThread client = transaction.getClient();    transaction.schedule(); // 1    if (!(client instanceof Binder)) {        // If client is not an instance of Binder - it's a remote call and at this point it is        // safe to recycle the object. All objects used for local calls will be recycled after        // the transaction is executed on client in ActivityThread.        transaction.recycle();     }}

在注释 1 处调用了 ClientTransaction.schedule 方法:

// /frameworks/base/core/java/android/app/servertransaction/ClientTransaction.javaprivate IApplicationThread mClient; public void schedule() throws RemoteException {    mClient.scheduleTransaction(this); // 1}

注释 1 处的 mClientIApplicationThread 实例,在这里是 ApplicationThreadApplicationThreadActivityThread 的内部类,以下是相关源码:

// /frameworks/base/core/java/android/app/ActivityThread.javaprivate class ApplicationThread extends IApplicationThread.Stub {    @Override    public void scheduleTransaction(ClientTransaction transaction) throws RemoteException {        ActivityThread.this.scheduleTransaction(transaction); // 1    }}

注释 1 处调用了 ActivityThread.this.scheduleTransaction 方法,ActivityThread 继承自 ClientTransactionHandler,因此这里调用的是 ClientTransactionHandler.scheduleTransaction 方法,以下是相关源码:

// /frameworks/base/core/java/android/app/ClientTransactionHandler.javavoid scheduleTransaction(ClientTransaction transaction) {    transaction.preExecute(this);    sendMessage(ActivityThread.H.EXECUTE_TRANSACTION, transaction); // 1}

注释 1 处的 ActivityThread.HHandler 的子类,以下是 ActivityThread.sendMessage 方法的源码和关于 ActivityThread.H.EXECUTE_TRANSACTION 的相关处理:

// /frameworks/base/core/java/android/app/ActivityThread.javavoid sendMessage(int what, Object obj) {    sendMessage(what, obj, 0, 0, false);}private void sendMessage(int what, Object obj, int arg1, int arg2, boolean async) {    if (DEBUG_MESSAGES) {        Slog.v(TAG,               "SCHEDULE " + what + " " + mH.codeToString(what) + ": " + arg1 + " / " + obj);    }    Message msg = Message.obtain();    msg.what = what;    msg.obj = obj;    msg.arg1 = arg1;    msg.arg2 = arg2;    if (async) {        msg.setAsynchronous(true);    }    mH.sendMessage(msg);}class H extends Handler {    ...    public static final int EXECUTE_TRANSACTION = 159;...    public void handleMessage(Message msg) {        if (DEBUG_MESSAGES) Slog.v(TAG, ">>> handling: " + codeToString(msg.what));        switch (msg.what) {            ...            case EXECUTE_TRANSACTION:                final ClientTransaction transaction = (ClientTransaction) msg.obj;                mTransactionExecutor.execute(transaction); // 1                if (isSystem()) {                    // Client transactions inside system process are recycled on the client side                    // instead of ClientLifecycleManager to avoid being cleared before this                    // message is handled.                    transaction.recycle();                }                // TODO(lifecycler): Recycle locally scheduled transactions.                break;...        }    }}

在注释 1 处调用了 TransactionExecutor.execute 方法

// /frameworks/base/core/java/android/app/servertransaction/TransactionExecutor.javapublic void execute(ClientTransaction transaction) {    ...    executeCallbacks(transaction); // 1    executeLifecycleState(transaction);    mPendingActions.clear();    if (DEBUG_RESOLVER) Slog.d(TAG, tId(transaction) + "End resolving transaction");}@VisibleForTestingpublic void executeCallbacks(ClientTransaction transaction) {    ...    final int size = callbacks.size();    for (int i = 0; i < size; ++i) {        final ClientTransactionItem item = callbacks.get(i);        ...        item.execute(mTransactionHandler, token, mPendingActions); // 2        ..    }}

注释 2 处调用了 ClientTransactionItem.execute 方法,该方法在其子类 LaunchActivityItem 中实现,以下是 LaunchActivityItem.execute 方法:

// /frameworks/base/core/java/android/app/servertransaction/LaunchActivityItem.java) @Overridepublic void execute(ClientTransactionHandler client, IBinder token,                    PendingTransactionActions pendingActions) {    Trace.traceBegin(TRACE_TAG_ACTIVITY_MANAGER, "activityStart");    ActivityClientRecord r = new ActivityClientRecord(token, mIntent, mIdent, mInfo,                          mOverrideConfig, mCompatInfo, mReferrer,                           mVoiceInteractor, mState,                           mPersistentState,                          mPendingResults, mPendingNewIntents,                           mIsForward,                          mProfilerInfo, client, mAssistToken);    client.handleLaunchActivity(r, pendingActions, null ); // 1    Trace.traceEnd(TRACE_TAG_ACTIVITY_MANAGER);}

注释 1 处的 clientClientTransactionHandler 的子类 ActivityThread,查看 ActivityThread.handleLauncherActivity 的源码,主要是调用了 ActivityThread.perfORMLaunchActivity 方法:

// /frameworks/base/core/java/android/app/ActivityThread.java@Overridepublic Activity handleLaunchActivity(ActivityClientRecord r,         PendingTransactionActions pendingActions,          Intent customIntent) {    ...    WindowManagerGlobal.initialize();    // 1 启动 Activity    final Activity a = performLaunchActivity(r, customIntent);    if (a != null) {        r.createdConfig = new Configuration(mConfiguration);        reportSizeConfigurations(r);        if (!r.activity.mFinished && pendingActions != null) {            pendingActions.setOldState(r.state);            pendingActions.setRestoreInstanceState(true);            pendingActions.setCallOnPostCreate(true);        }    } else {        // If there was an error, for any reason, tell the activity manager to stop us.        try {            // 停止 Activity 的启动            ActivityTaskManager.getService()                .finishActivity(r.token, Activity.RESULT_CANCELED, null,    Activity.DONT_FINISH_TASK_WITH_ACTIVITY);        } catch (RemoteException ex) {            throw ex.rethrowFromSystemServer();        }    }    return a;}private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {    ActivityInfo aInfo = r.activityInfo; // 2 获取 ActivityInfo 类    if (r.packageInfo == null) {        // 3 获取 APK 文件描述类 LoadApk        r.packageInfo = getPackageInfo(aInfo.applicationInfo, r.compatInfo,           Context.CONTEXT_INCLUDE_CODE);     }    ComponentName component = r.intent.getComponent(); // 4    ...    // 5 创建要启动的 Activity 的上下文环境    ContextImpl appContext = createBaseContextForActivity(r);     Activity activity = null;    try {        java.lang.ClassLoader cl = appContext.getClassLoader();        // 6 用类加载器创建该 Activity 的实例        activity = mInstrumentation.newActivity(cl, component.getClassName(), r.intent);        ...    } catch (Exception e) {        ...    }    try {        // 7 创建 Application        Application app = r.packageInfo.makeApplication(false, mInstrumentation);        ...        if (activity != null) {            ...            // 8 初始化 Activity            activity.attach(appContext, this, getInstrumentation(), r.token,r.ident, app, r.intent, r.activityInfo, title, r.parent,r.embeddedID, r.lastNonConfigurationInstances, config,r.referrer, r.voiceInteractor, window, r.configCallback,r.assistToken);            ...            if (r.isPersistable()) {                mInstrumentation.callActivityOnCreate(activity, r.state, r.persistentState); // 9            } else {                mInstrumentation.callActivityOnCreate(activity, r.state);            }            ...        }        ...    } catch (SuperNotCalledException e) {        throw e;    } catch (Exception e) {        ....    }    return activity;}

注释 1 处调用了 ActivityThread.performLaunchActivity 方法来启动 Activity。注释 2 处用来获取 ActivityInfo,用来存储代码以及 AndroidManifest 设置的 ActivityReceiver 节点信息,比如,ActivitythemelaunchMode。在注释 3 处获取 APK 文件的描述类 LoadedApk。在注释 4 处获取要启动的 ActivityComponentName 类,在 ComponentName 类中保存了该 Activity 的包名和类名。在注释 5 处用来创建要启动的 Activity 的上下文环境。在注释 6 处根据 ComponentName 中存储的 Activity 类名,用类加载器来创建该 Activity 的实例 。注释 7 处用来创建 ApplicationLoadedApk.makeApplication 方法内部会调用 Application.onCreate 方法。注释 8 处调用 Activity.attach 方法初始化 Activity,在 Activity.attach 方法中会创建 Window 对象(PhoneWindow)并与 Activity 自身进行关联。在注释 9 处调用 Instrumentation.callActivityOnCreate 方法来启动 Activity

// /frameworks/base/core/java/android/app/Instrumentation.javapublic void callActivityOnCreate(Activity activity, Bundle icicle,     PersistableBundle persistentState) {    prePerformCreate(activity);    activity.performCreate(icicle, persistentState); // 1    postPerformCreate(activity);}

注释 1 处调用了 Activity.performCreate 方法,在 Activity.performCreate 方法中又调用了 Activity.onCreate 方法,到这里,根 Activity 就启动了,以下是相关源码:

// /frameworks/base/core/java/android/app/Activity.java@UnsupportedAppUsagefinal void performCreate(Bundle icicle, PersistableBundle persistentState) {    dispatchActivityPreCreated(icicle);    mCanEnterPictureInPicture = true;    restoreHasCurrentPermissionRequest(icicle);    // 1    if (persistentState != null) {        onCreate(icicle, persistentState);    } else {        onCreate(icicle);    }    writeEventLog(LOG_AM_ON_CREATE_CALLED, "performCreate");    mActivityTransitionState.readState(icicle);    mVisibleFromClient = !mWindow.getwindowstyle().getBoolean(        com.android.internal.R.styleable.Window_windowNoDisplay, false);    mFragments.dispatchActivityCreated();    mActivityTransitionState.setEnterActivityOptions(this, getActivityOptions());    dispatchActivityPostCreated(icicle);}@MainThread@CallSuperprotected void onCreate(@Nullable Bundle savedInstanceState) {    if (DEBUG_LIFECYCLE) Slog.v(TAG, "onCreate " + this + ": " + savedInstanceState);    if (mLastNonConfigurationInstances != null) {        mFragments.restoreLoaderNonConfig(mLastNonConfigurationInstances.loaders);    }    if (mActivityInfo.parentActivityName != null) {        if (mActionBar == null) {            mEnableDefaultActionBarUp = true;        } else {            mActionBar.setDefaultDisplayHomeAsUpEnabled(true);        }    }    if (savedInstanceState != null) {        mAutoFillResetNeeded = savedInstanceState.getBoolean(AUTOFILL_RESET_NEEDED, false);        mLastAutofillId = savedInstanceState.getInt(LAST_AUTOFILL_ID,                        View.LAST_APP_AUTOFILL_ID);        if (mAutoFillResetNeeded) {            getAutofillManager().onCreate(savedInstanceState);        }        Parcelable p = savedInstanceState.getParcelable(FRAGMENTS_TAG);        mFragments.restoreAllState(p, mLastNonConfigurationInstances != null       ? mLastNonConfigurationInstances.fragments : null);    }    mFragments.dispatchCreate();    dispatchActivityCreated(savedInstanceState);    if (mVoiceInteractor != null) {        mVoiceInteractor.attachActivity(this);    }    mRestoredFromBundle = savedInstanceState != null;    mCalled = true;}public void onCreate(@Nullable Bundle savedInstanceState,                     @Nullable PersistableBundle persistentState) {    onCreate(savedInstanceState);}

参考

Android系统开机到Launcher启动流程分析

来源地址:https://blog.csdn.net/xingyu19911016/article/details/128697566

--结束END--

本文标题: Android系统启动(四) — Launcher 启动过程

本文链接: https://lsjlt.com/news/394434.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Android系统启动(四) — Launcher 启动过程
    1 Launcher 概述 系统启动的最后一步是启动一个应用程序来显示系统中已经安装的应用程序,这个应用程序就叫做 Launcher。Launcher 在启动过程中会请求 PackageManager...
    99+
    2023-09-04
    android java 开发语言
  • android launcher启动流程是什么
    Android Launcher的启动流程如下:1. 用户点击设备上的Home按钮或者通过其他方式启动Launcher应用。2. 系...
    99+
    2023-10-20
    android
  • 详解Android系统启动过程
    目录计算机是如何启动的引导阶段加载内核阶段Android的启动过程init进程init.rc 文件service_manager 进程surface_flinger 进程media_...
    99+
    2024-04-02
  • Android系统启动流程
    Android系统完整的启动过程,从系统层次角度可分为 Linux 系统层、Android 系统服务层、Zygote进程模型三个阶段;从开机到启动 Home Launcher 完成具体的任务细节可分为七个步骤,下面就从具体的细节来解读 An...
    99+
    2023-09-03
    android
  • Linux系统的systemd的启动过程
    本篇内容主要讲解“Linux系统的systemd的启动过程 ”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Linux系统的systemd的启动过程 ”吧!Linux系统的启动方式有点复杂,而且总...
    99+
    2023-06-13
  • Android 系统启动流分析 &amp; Zygote启动流程分析
    本文是基于Android 7.1进行分析       Zygote在Android系统扮演着不可或缺的角色,Android系统的启动首先需要Zygote参与,比如启动Syste...
    99+
    2022-06-06
    启动 系统 Android
  • Android Activity启动过程详解
     Android系统启动篇 1,《android系统启动流程简介》 2,《android init进程启动流程》 3,《android zygote进程启动流程》 4,《Android SystemServer进程启动流程》 5,《andr...
    99+
    2023-09-02
    android
  • Linux系统开机启动过程介绍
    本篇内容主要讲解“Linux系统开机启动过程介绍”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Linux系统开机启动过程介绍”吧!按下电源按钮的直到欢迎页出来之后,linux总共做的事可以分为五...
    99+
    2023-06-13
  • Linux系统启动过程是怎样的
    今天就跟大家聊聊有关Linux系统启动过程是怎样的,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。第三部分:系统初始化在init的配置文件中有这么一行:si::sysinit:/etc...
    99+
    2023-06-16
  • Android的四种启动模式
    一、Activity的四种启动模式: standard(标准模式):一个定义Activity在mainfest中不设置android:launchMode=“standard”,也会默认为standa...
    99+
    2023-10-10
    android kotlin java
  • Android Service的启动过程分析
    Android Service的启动过程分析 刚开始学习Service的时候以为它是一个线程的封装,也可以执行耗时操作。其实不然,Service是运行在主线程的。直接执行耗时操...
    99+
    2022-06-06
    android service service 启动 Android
  • Android启动过程深入解析
      当按下Android设备电源键时究竟发生了什么?   Android的启动过程是怎么样的?   什么是Linux内核?   桌面系统linux内核与Android...
    99+
    2022-06-06
    Android
  • 简要分析linux系统的启动过程
    接触linux系统运维已经好几年了,常常被问到linux系统启动流程问题,刚好今天有空来梳理下这个过程: 一般来说,所有的操作系统的启动流程基本就是: 总的来说,linux系统启动流程可以简单总结为以下几步: 1)开...
    99+
    2022-06-04
    linux系统的启动过程 linux启动过程
  • Linux系统启动过程是怎么样的
    小编给大家分享一下Linux系统启动过程是怎么样的,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!在BIOS阶段,计算机的行为基本上被写死了,可以做的事情并不多;一...
    99+
    2023-06-28
  • Android编程中Activity的四种启动模式
    本文实例讲述了Android编程中Activity的四种启动模式。分享给大家供大家参考,具体如下: Activity启动方式有四种,分别是: standard singleTo...
    99+
    2022-06-06
    启动 activity Android
  • Android Service启动过程完整分析
    刚开始学习Service的时候以为它是一个线程的封装,也可以执行耗时操作。其实不然,Service是运行在主线程的。直接执行耗时操作是会阻塞主线程的。长时间就直接ANR了。 我...
    99+
    2022-06-06
    android service service Android
  • android应用启动过程是什么
    Android应用的启动过程可以分为以下几个步骤:1. 用户点击应用图标:用户在设备上点击应用图标,触发应用的启动。2. 系统启动应...
    99+
    2023-09-09
    android
  • Linux系统启动过程的阶段有哪些
    这篇文章主要讲解了“Linux系统启动过程的阶段有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Linux系统启动过程的阶段有哪些”吧! ...
    99+
    2023-02-10
    linux
  • Linux系统开机后的启动过程分析
    本篇内容介绍了“Linux系统开机后的启动过程分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Linux的启动其实和windows的启动过...
    99+
    2023-06-13
  • Android APP启动方式、启动流程及启动优化分析
    本文章向大家介绍Android app应用启动的一些相关知识,包括app启动方式、app启动流程和app启动优化等知识!  app应用启动方式 1、冷启动  ...
    99+
    2022-06-06
    app启动 优化 app Android
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作