Android 10.0 launcher启动流程

程序员 2024-10-3 10:42:25 68 0 来自 中国
学习笔记:
Android 10.0 launcher 启动流程
Android 13 Launcher 基础熟悉(一)
Android 13 Launcher 数据加载分析(二)
Android 13 Launcher3 数据库及Workspace 的数据加载与绑定(三)
在前面SystemUI启动流程中说到,在SystemServer中会去启动各种系统服务,这里的launcher也是启动的此中一个服务ActivityManagerService去启动的。在android10之前,系统四大组件的启动都是在ActivityManagerService中,在android10中,单独抽出了一个ActivityTaskManagerService,重要负责Activity的管理和调理。这里先来看下ActivityManagerService服务的启动:
// SystemServer.javaprivate void startBootstrapServices() {    ... ...    // Activity manager runs the show.    traceBeginAndSlog("StartActivityManager");    // TODO: Might need to move after migration to WM.    ActivityTaskManagerService atm = mSystemServiceManager.startService(            ActivityTaskManagerService.Lifecycle.class).getService();    mActivityManagerService = ActivityManagerService.Lifecycle.startService(            mSystemServiceManager, atm);    mActivityManagerService.setSystemServiceManager(mSystemServiceManager);    mActivityManagerService.setInstaller(installer);    mWindowManagerGlobalLock = atm.getGlobalLock();    traceEnd();    ... ...}当SystemServiceManager调用 startService() 时,就会通过反射去创建传进去的class,然后在调用创建对象的 onStart() 方法,这里就是去初始化ActivityTaskManagerService和ActivityManagerService对象,并不会去启动launcher,而且系统服务启动分为三块:
// SystemServer.javastartBootstrapServices();   // 启动引导服务startCoreServices();        // 启动核心折务startOtherServices();       // 启动其他服务在startOtherServices()中可以看到:
// SystemServer.javaprivate void startOtherServices() {    ... ...    // We now tell the activity manager it is okay to run third party    // code.  It will call back into us once it has gotten to the state    // where third party code can really run (but before it has actually    // started launching the initial applications), for us to complete our    // initialization.    mActivityManagerService.systemReady(() -> {        ... ...    });}这就分析在全部服务初始化完成后,在这里会关照ActivityManagerService的systemReady()启动 launcher 的历程。
下面一起来看 launcher 是怎样被启动起来的:
// ActivityManagerService.javapublic void systemReady(final Runnable goingCallback, TimingsTraceLog traceLog) {    ... ...    mAtmInternal.startHomeOnAllDisplays(currentUserId, "systemReady");    ... ...    mAtmInternal.resumeTopActivities(false /* scheduleIdle */);    ... ...}mAtmInternal范例是ActivityTaskManagerInternal,这是一个抽象类,实在现是ActivityTaskManagerService的内部类LocalService:
// ActivityTaskManagerService.javafinal class LocalService extends ActivityTaskManagerInternal {    ... ...    @Override    public boolean startHomeOnAllDisplays(int userId, String reason) {        synchronized (mGlobalLock) {            return mRootActivityContainer.startHomeOnAllDisplays(userId, reason);        }    }    ... ...        @Override    public void resumeTopActivities(boolean scheduleIdle){        synchronized (mGlobalLock){            mRootActivityContainer.resumeFocusedStacksTopActivities();            if(scheduleIdle){                mStackSupervisor.scheduleIdleLocked();            }        }    }    ... ...}这里的mRootActivityContainer范例是RootActivityContainer,按照文档上的分析,这是一个暂时类,重要是将ActivityStackSupervisor.java中的一部门逻辑分离出来,在android11中,这个类就已经找不到了。更换成了RootWindowContainer,这里我们跟进 mRootActivityContainer.startHomeOnAllDisplays() 方法看,终极会调用到:startHomeOnDisplay() :
// RootActivityContainer.javaboolean startHomeOnDisplay(int userId,String reason,int displayId,boolean allowInstrumenting,boolean fromHomeKey){    // Fallback to top focused display if the displayId is invalid.    if(displayId==INVALID_DISPLAY){        displayId=getTopDisplayFocusedStack().mDisplayId;    }     Intent homeIntent=null;    ActivityInfo aInfo=null;    if(displayId==DEFAULT_DISPLAY){        //拿到需要启动launcher的intent,通过resolveHomeActivity解析出需要启动的Activity        homeIntent=mService.getHomeIntent();        aInfo=resolveHomeActivity(userId,homeIntent);    }else if(shouldPlaceSecondaryHomeOnDisplay(displayId)){        Pair<ActivityInfo, Intent> info=resolveSecondaryHomeActivity(userId,displayId);        aInfo=info.first;        homeIntent=info.second;    }    if(aInfo==null||homeIntent==null){        return false;    }     if(!canStartHomeOnDisplay(aInfo,displayId,allowInstrumenting)){        return false;    }     // Updates the home component of the intent.    homeIntent.setComponent(new ComponentName(aInfo.applicationInfo.packageName,aInfo.name));    homeIntent.setFlags(homeIntent.getFlags()|FLAG_ACTIVITY_NEW_TASK);    // Updates the extra information of the intent.    if(fromHomeKey){        homeIntent.putExtra(WindowManagerPolicy.EXTRA_FROM_HOME_KEY,true);    }    // Update the reason for ANR debugging to verify if the user activity is the one that    // actually launched.    final String myReason=reason+":"+userId+":"+UserHandle.getUserId(    aInfo.applicationInfo.uid)+":"+displayId;    mService.getActivityStartController().startHomeActivity(homeIntent,aInfo,myReason,    displayId);    return true;}这里可以分为两步看:
  1、通过ActivityTaskManagerService的getHomeIntent()获取到需要启动的intent,在通过resolveHomeActivity()解析出需要启动Activity的信息,
  2、mService.getActivityStartController()获取到的是ActivityStartController,这个类的重要作用是用于控制委派启动的Activity。
先来看下ActivityTaskManagerService的getHomeIntent() :
    // ActivityTaskManagerService.java    Intent 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);        }        return intent;    }注意看 intent.addCategory(Intent.CATEGORY_HOME) ,这个代表的就是要启动Activity的意图,通常来说,整个系统的只会有一个应用会在清单文件中配置CATEGORY_HOME,如果配置了多个,系统在启动的时间就会要求用户手动去选择哪个作为启动应用,如果在系统设置应用中举行配置了,就会选择配置的谁人应用启动。(这个 CATEGORY_HOME 配置,说白了就只有 launcher 程序才会有)。
回到主线,接着看mService.getActivityStartController().startHomeActivity() :
    // ActivityStartController.java    void startHomeActivity(Intent intent, ActivityInfo aInfo, String reason,            TaskDisplayArea taskDisplayArea) {        final ActivityOptions options = ActivityOptions.makeBasic();        options.setLaunchWindowingMode(WINDOWING_MODE_FULLSCREEN);        if (!ActivityRecord.isResolverActivity(aInfo.name)) {            // The resolver activity shouldn't be put in home stack because when the foreground is            // standard type activity, the resolver activity should be put on the top of current            // foreground instead of bring home stack to front.            options.setLaunchActivityType(ACTIVITY_TYPE_HOME);        }        final int displayId = taskDisplayArea.getDisplayId();        options.setLaunchDisplayId(displayId);        options.setLaunchTaskDisplayArea(taskDisplayArea.mRemoteToken                .toWindowContainerToken());        // The home activity will be started later, defer resuming to avoid unneccerary operations        // (e.g. start home recursively) when creating home stack.        mSupervisor.beginDeferResume();        final ActivityStack homeStack;        try {            // Make sure home stack exists on display area.            homeStack = taskDisplayArea.getOrCreateRootHomeTask(ON_TOP);        } finally {            mSupervisor.endDeferResume();        }        mLastHomeActivityStartResult = obtainStarter(intent, "startHomeActivity: " + reason)                .setOutActivity(tmpOutRecord)                .setCallingUid(0)                .setActivityInfo(aInfo)                .setActivityOptions(options.toBundle())                .execute();        mLastHomeActivityStartRecord = tmpOutRecord[0];        if (homeStack.mInResumeTopActivity) {            // If we are in resume section already, home activity will be initialized, but not            // resumed (to avoid recursive resume) and will stay that way until something pokes it            // again. We need to schedule another resume.            mSupervisor.scheduleResumeTopActivities();        }    }    /**     * @return A starter to configure and execute starting an activity. It is valid until after     *         {@link ActivityStarter#execute} is invoked. At that point, the starter should be     *         considered invalid and no longer modified or used.     */    ActivityStarter obtainStarter(Intent intent, String reason) {        return mFactory.obtain().setIntent(intent).setReason(reason);    }这里重要是先获取一个ActivityStarter(重要用于启动Activity),然后把需要的参数设置进去,末了再调用它的ActivityStarter.execute()方法:
// ActivityStarter.javaint execute() {    try {        ... ...        final LaunchingState launchingState;        synchronized (mService.mGlobalLock) {            final ActivityRecord caller = ActivityRecord.forTokenLocked(mRequest.resultTo);            // 通过ActivityMetricsLogger.notifyActivityLaunching创建LaunchingState并记载创建Activity开始的时间            launchingState = mSupervisor.getActivityMetricsLogger().notifyActivityLaunching(                    mRequest.intent, caller);        }                ... ...        // 实行启动请求        res = executeRequest(mRequest);        ... ...                // Notify ActivityMetricsLogger that the activity has launched.        // ActivityMetricsLogger will then wait for the windows to be drawn and populate        // WaitResult.        // 通过ActivityMetricsLogger.notifyActivityLaunched记载Activity启动完成的时间        mSupervisor.getActivityMetricsLogger().notifyActivityLaunched(launchingState, res,                mLastStartActivityRecord);        // 同时将Request.waitResult添加到ActivityStackSupervisor的mWaitingActivityLaunched中,等待窗口绘制完成        return getExternalResult(mRequest.waitResult == null ? res                : waitForResult(res, mLastStartActivityRecord));                } finally {            onExecutionComplete();        }    }        通过上面代码我们知道,启动是在 executeRequest() 方法里:
    // ActivityStarter.java    private int executeRequest(Request request) {    ... ...        //调用 startActivityUnchecked        mLastStartActivityResult = startActivityUnchecked(r, sourceRecord, voiceSession,                request.voiceInteractor, startFlags, true /* doResume */, checkedOptions, inTask,                restrictedBgActivity, intentGrants);        return mLastStartActivityResult;    }ActivityStarter.startActivityUnchecked()
// ActivityStarter.java    private int startActivityUnchecked(final ActivityRecord r, ActivityRecord sourceRecord,                IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor,                int startFlags, boolean doResume, ActivityOptions options, Task inTask,                boolean restrictedBgActivity, NeededUriGrants intentGrants) {        int result = START_CANCELED;      ... ...        try {            //延时布局            mService.deferWindowLayout();            //实行startActivityInner            result = startActivityInner(r, sourceRecord, voiceSession, voiceInteractor,                    startFlags, doResume, options, inTask, restrictedBgActivity, intentGrants);        } finally {            //规复布局            mService.continueWindowLayout();        }      ... ...        return result;    }ActivityStarter.startActivityInner()
int startActivityInner() {     ... ...       if (mDoResume) {            //ActivityRecord 记载着 Activity 信息            final ActivityRecord topTaskActivity =                    mStartActivity.getTask().topRunningActivityLocked();            if (!mTargetStack.isTopActivityFocusable()                    || (topTaskActivity != null && topTaskActivity.isTaskOverlay()                    && mStartActivity != topTaskActivity)) {                mTargetStack.getDisplay().mDisplayContent.executeAppTransition();            } else {                //实行resumeFocusedStacksTopActivities                mRootWindowContainer.resumeFocusedStacksTopActivities(                        mTargetStack, mStartActivity, mOptions);            }        }    ... ...        return START_SUCCESS;    }RootWindowContainer.resumeFocusedStacksTopActivities()
// RootWindowContainer.javaboolean resumeFocusedStacksTopActivities(            ActivityStack targetStack, ActivityRecord target, ActivityOptions targetOptions) {    ... ...        //如果是栈顶Activity,启动resumeTopActivityUncheckedLocked        if (targetStack != null && (targetStack.isTopStackInDisplayArea()                || getTopDisplayFocusedStack() == targetStack)) {            result = targetStack.resumeTopActivityUncheckedLocked(target, targetOptions);        }    ... ...        if (!resumedOnDisplay) {            //获取栈顶的 ActivityRecord            final ActivityStack focusedStack = display.getFocusedStack();            if (focusedStack != null) {                //实行resumeTopActivityUncheckedLocked                result |= focusedStack.resumeTopActivityUncheckedLocked(target, targetOptions);            }else if (targetStack == null) {                    result |= resumeHomeActivity(null /* prev */, "no-focusable-task",                            display.getDefaultTaskDisplayArea());            }        }      return result;}ActivityStack.resumeTopActivityUncheckedLocked()
    // ActivityStack.java    boolean resumeTopActivityUncheckedLocked(ActivityRecord prev, ActivityOptions options) {        if (mInResumeTopActivity) {            // Don't even start recursing.            return false;        }        boolean result = false;        try {            mInResumeTopActivity = true;            // 实行 resumeTopActivityInnerLocked,            // 终极调用到 ActivityStackSupervisor.startSpecificActivity()            result = resumeTopActivityInnerLocked(prev, options);            final ActivityRecord next = topRunningActivity(true /* focusableOnly */);            if (next == null || !next.canTurnScreenOn()) {                checkReadyForSleep();            }        } finally {            mInResumeTopActivity = false;        }        return result;    }ActivityStackSupervisor.startSpecificActivity()
    // ActivityStackSupervisor.java    void startSpecificActivity(ActivityRecord r, boolean andResume, boolean checkConfig) {        // Is this activity's application already running?        final WindowProcessController wpc =                mService.getProcessController(r.processName, r.info.applicationInfo.uid);         boolean knownToBeDead = false;        //历程存在        if (wpc != null && wpc.hasThread()) {            try {                //真正启动Activity方法                realStartActivityLocked(r, wpc, andResume, checkConfig);                return;            } catch (RemoteException e) {                Slog.w(TAG, "Exception when starting activity "                        + r.intent.getComponent().flattenToShortString(), e);            }            // If a dead object exception was thrown -- fall through to            // restart the application.            knownToBeDead = true;        }         r.notifyUnknownVisibilityLaunchedForKeyguardTransition();         final boolean isTop = andResume && r.isTopRunningActivity();        //历程不存在 mService =ATMS        mService.startProcessAsync(r, knownToBeDead, isTop, isTop ? "top-activity" : "activity");    }startSpecificActivity() 这个方法是关键方法,如果历程已经存在直接实行 realStartActivityLocked 去启动 Activity,历程不存在则通过AMS去创建 Socket,然后关照 Zygote 去 fork 历程。由于这里第一次创建,以是会走到 startProcessAsync() 。
Launcher启动流程调用栈:

1.png 创建Socket创建毗连

ActivityTaskManagerService.startProcessAsync()
    void startProcessAsync(ActivityRecord activity, boolean knownToBeDead, boolean isTop,            String hostingType) {        try {            if (Trace.isTagEnabled(TRACE_TAG_WINDOW_MANAGER)) {                Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "dispatchingStartProcess:"                        + activity.processName);            }            // Post message to start process to avoid possible deadlock of calling into AMS with the            // ATMS lock held.            final Message m = PooledLambda.obtainMessage(ActivityManagerInternal::startProcess,                    mAmInternal, activity.processName, activity.info.applicationInfo, knownToBeDead,                    isTop, hostingType, activity.intent.getComponent());            mH.sendMessage(m);        } finally {            Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER);        }    }通过handler发消息实行ActivityManagerInternal.startProcess() ,内部又转调用ActivityManagerService.startProcessLocked() :
@GuardedBy("this")    final ProcessRecord startProcessLocked(String processName,            ApplicationInfo info, boolean knownToBeDead, int intentFlags,            HostingRecord hostingRecord, int zygotePolicyFlags, boolean allowWhileBooting,            boolean isolated, boolean keepIfLarge) {        return mProcessList.startProcessLocked(processName, info, knownToBeDead, intentFlags,                hostingRecord, zygotePolicyFlags, allowWhileBooting, isolated, 0 /* isolatedUid */,                keepIfLarge, null /* ABI override */, null /* entryPoint */,                null /* entryPointArgs */, null /* crashHandler */);    }mProcessList范例是ProcessList,这是一个历程管理类,形貌了历程的adj值,当系统资源吃紧时,就会根据这里形貌的adj去判定杀死哪个应用来释放资源,可以通过adb shell dumpsys meminfo来检察当前全部历程的分类环境,接着来看下ProcessList.startProcessLocked():
    // ProcessList.java    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) {                ProcessRecord app;        ... ...        checkSlow(startTime, "startProcess: stepping in to startProcess");        final boolean success = startProcessLocked(app, hostingRecord, abiOverride);        checkSlow(startTime, "startProcess: done starting proc!");        return success ? app : null;    }     boolean startProcessLocked(ProcessRecord app, HostingRecord hostingRecord,            boolean disableHiddenApiChecks, boolean mountExtStorageFull,            String abiOverride) {            ... ...        try {            ... ...            // Start the process.  It will either succeed and return a result containing            // the PID of the new process, or else throw a RuntimeException.            final String entryPoint = "android.app.ActivityThread";             return startProcessLocked(hostingRecord, entryPoint, app, uid, gids,                    runtimeFlags, mountExternal, seInfo, requiredAbi, instructionSet, invokeWith,                    startTime);        } catch (RuntimeException e) {            Slog.e(ActivityManagerService.TAG, "Failure starting process " + app.processName, e);             // Something went very wrong while trying to start this process; one            // common case is when the package is frozen due to an active            // upgrade. To recover, clean up any active bookkeeping related to            // starting this process. (We already invoked this method once when            // the package was initially frozen through KILL_APPLICATION_MSG, so            // it doesn't hurt to use it again.)            mService.forceStopPackageLocked(app.info.packageName, UserHandle.getAppId(app.uid),                    false, false, true, false, false, app.userId, "start failure");            return false;        }    }     boolean startProcessLocked(HostingRecord hostingRecord,String entryPoint,            ProcessRecord app, int uid, int[] gids, int runtimeFlags, int mountExternal,            String seInfo, String requiredAbi, String instructionSet, String invokeWith,long startTime) {            ... ...            final Process.ProcessStartResult startResult = startProcess(app.hostingRecord,entryPoint, app, app.startUid, gids, runtimeFlags, mountExternal,app.seInfo, requiredAbi, instructionSet, invokeWith, app.startTime);            ... ...    }     private Process.ProcessStartResult startProcess(HostingRecord hostingRecord, String entryPoint,            ProcessRecord app, int uid, int[] gids, int runtimeFlags, int mountExternal,            String seInfo, String requiredAbi, String instructionSet, String invokeWith,            long startTime) {        try {            Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "Start proc: " +                    app.processName);            checkSlow(startTime, "startProcess: asking zygote to start proc");            final Process.ProcessStartResult startResult;            if (hostingRecord.usesWebviewZygote()) {                ... ...            } else if (hostingRecord.usesAppZygote()) {                final AppZygote appZygote = createAppZygoteForProcessIfNeeded(app);                 startResult = appZygote.getProcess().start(entryPoint,                        app.processName, uid, uid, gids, runtimeFlags, mountExternal,                        app.info.targetSdkVersion, seInfo, requiredAbi, instructionSet,                        app.info.dataDir, null, app.info.packageName,                        /*useUsapPool=*/ false,                        new String[] {PROC_START_SEQ_IDENT + app.startSeq});            } else {                ... ...            }            checkSlow(startTime, "startProcess: returned from zygote!");            return startResult;        } finally {            Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);        }    }这里有几个我们需要关注的点,一个是第二个方法界说的entryPoint="android.app.ActivityThread",这个就是背面创建历程时会通过反射调用到的类,再来看末了一个方法,这里会实行else if语句,也就是实行ZygoteProcess的start()方法。终极到 ZygoteProcess 的attemptUsapSendArgsAndGetResult 通过 Socket 通讯,fork 一个新的 Launcher 历程,调用过程如图:


ZygoteProcess.attemptZygoteSendArgsAndGetResult()
    // ZygoteProcess.java     private Process.ProcessStartResult attemptZygoteSendArgsAndGetResult(            ZygoteState zygoteState, String msgStr) throws ZygoteStartFailedEx {        try {            final BufferedWriter zygoteWriter = zygoteState.mZygoteOutputWriter;            final DataInputStream zygoteInputStream = zygoteState.mZygoteInputStream;             zygoteWriter.write(msgStr);把应用历程的一些参数写给前面毗连的zygote历程            zygoteWriter.flush();//进入Zygote历程,处于壅闭状态            //从socket中得到zygote创建的应用pid,赋值给 ProcessStartResult的对象            Process.ProcessStartResult result = new Process.ProcessStartResult();            result.pid = zygoteInputStream.readInt();            result.usingWrapper = zygoteInputStream.readBoolean();            return result;        } catch (IOException ex) {            zygoteState.close();        }    }Zygote历程处置惩罚

ZygoteInit.main
public static void main(String argv[]) {    Runnable caller;    if (startSystemServer) {        //Zygote Fork出的第一个历程 SystmeServer        Runnable r = forkSystemServer(abiList, zygoteSocketName, zygoteServer);         if (r != null) {            r.run();            return;        }    }    //循环等待fork出其他的应用历程,好比Launcher    caller = zygoteServer.runSelectLoop(abiList);    ...    if (caller != null) {        caller.run(); //实行runSelectLoop返回的Runnable对象,进入子历程    }}ZygoteServer.runSelectLoop
Runnable runSelectLoop(String abiList) {    while (true) {        int pollReturnValue;            try {                //epoll机制 循环                pollReturnValue = Os.poll(pollFDs, pollTimeoutMs);            } catch (ErrnoException ex) {                throw new RuntimeException("poll failed", ex);            }            ...            //来了消息后,调用processOneCommand()来举行历程的处置惩罚            final Runnable command =  connection.processOneCommand(this);    } }ZygoteConnection.processOneCommand
Runnable processOneCommand(ZygoteServer zygoteServer) {            //fork历程,得到新历程pid            //pid=0 表现Zygote  fork子历程乐成            //pid > 0 表现子历程 的真正的PID            pid = Zygote.forkAndSpecialize(parsedArgs.mUid, parsedArgs.mGid, parsedArgs.mGids,                parsedArgs.mRuntimeFlags, rlimits, parsedArgs.mMountExternal, parsedArgs.mSeInfo,                parsedArgs.mNiceName, fdsToClose, fdsToIgnore, parsedArgs.mStartChildZygote,                parsedArgs.mInstructionSet, parsedArgs.mAppDataDir, parsedArgs.mIsTopApp,                parsedArgs.mPkgDataInfoList, parsedArgs.mWhitelistedDataInfoList,                parsedArgs.mBindMountAppDataDirs, parsedArgs.mBindMountAppStorageDirs);        try {            //fork乐成,第一次返回的pid = 0            if (pid == 0) {                return handleChildProc(parsedArgs, childPipeFd, parsedArgs.mStartChildZygote);            } else {                handleParentProc(pid, serverPipeFd);                return null;            }}** ZygoteConnection.handleChildProc**
这里重要实行到 ZygoteInit.zygoteInit,zygoteInit 举行一些环境的初始化、启动Binder历程等利用,终极反射实行 ActivityThread.main
    private Runnable handleChildProc(ZygoteArguments parsedArgs,            FileDescriptor pipeFd, boolean isZygote) {        closeSocket();        Zygote.setAppProcessName(parsedArgs, TAG);            if (!isZygote) {                //App历程将会调用到这里,终极反射实行ActivityThread.main                return ZygoteInit.zygoteInit(parsedArgs.mTargetSdkVersion,                        parsedArgs.mDisabledCompatChanges,                        parsedArgs.mRemainingArgs, null /* classLoader */);            } else {                return ZygoteInit.childZygoteInit(parsedArgs.mTargetSdkVersion,                        parsedArgs.mRemainingArgs, null /* classLoader */);            }            }Zygote历程调用栈:

3.png ActivityThread中处置惩罚

Zygote fork出了 Launcher 的历程,并把接下来的 Launcher 启动任务交给了 ActivityThread 来举行,接下来我们就从 ActivityThread.main方法来分析 Launcher 的创建过程。
    // ActivityThread.java    public static void main(String[] args) {        Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "ActivityThreadMain");        ... ...        //创建主线程Looper        Looper.prepareMainLooper();        ... ...        ActivityThread thread = new ActivityThread();        //实行attach        ... ...        thread.attach(false, startSeq);        //开启循环        ... ...        Looper.loop();        throw new RuntimeException("Main thread loop unexpectedly exited");    }这里就是android层面分别为一个应用历程的开始,初始化一个looper,也就是android中说的主线程,并开始looper循环,这里调用到了ActivitThread.attach() :
// ActivityThread.java    private void attach(boolean system, long startSeq) {        sCurrentActivityThread = this;        mSystemThread = system;        if (!system) {            ... ...            // 这里会拿到ActivityManagerService的署理            final IActivityManager mgr = ActivityManager.getService();            try {               //应用的句柄发给AMS,从而使AMS可以管理新历程                mgr.attachApplication(mAppThread, startSeq);            } catch (RemoteException ex) {                throw ex.rethrowFromSystemServer();            }             ... ...        } else {            // 在前面讲Zygote历程的时间,里面创建ActivityThread就会实行到这里        }         //当系统配置发生变更时会实行这个回调        ViewRootImpl.ConfigChangedCallback configChangedCallback                = (Configuration globalConfig) -> {            ... ...        };        ViewRootImpl.addConfigCallback(configChangedCallback);    }这里会实行if语句里面的内容,mAppThread的范例是ApplicationThread,这个类的重要作用是在ActivityManagerService中回调回ActivityThread中来,mgr是ActivityManagerService的署理,在实行它的ActivityManagerService.attachApplication() 方法:
    // ActivityManagerService.java    public final void attachApplication(IApplicationThread thread, long startSeq) {        synchronized (this) {            int callingPid = Binder.getCallingPid();            final int callingUid = Binder.getCallingUid();            final long origId = Binder.clearCallingIdentity();            attachApplicationLocked(thread, callingPid, callingUid, startSeq);            Binder.restoreCallingIdentity(origId);        }    }ActivityManagerService.attachApplicationLocked()
调用AMS的 attachApplication(),终极层层调用到 ActivityStackSupervisor 的 realStartActivityLocked,真正准备去启动Activity。
private final boolean attachApplicationLocked(IApplicationThread thread,int pid, int callingUid, long startSeq) {        ... ...        //这里会去调用ActivityThrea的bindApplication(),也就是会去创建Application        thread.bindApplication(... ...)        ... ...        //如果当前的Application记载仍旧依附到之前的历程中,则清理掉        if (app.thread != null) {            handleAppDiedLocked(app, true, true);        }        ... ...        // See if the top visible activity is waiting to run in this process...        if (normalMode) {            try {                //调用ActivityTaskManagerService的attachApplication(),终极层层调用到ActivityStackSupervisor.java的 realStartActivityLocked()                didSomething = mAtmInternal.attachApplication(app.getWindowProcessController());            } catch (Exception e) {                Slog.wtf(TAG, "Exception thrown launching activities in " + app, e);                badApp = true;            }        }        ... ...    }这里通过AMS终极会调用到ActivityStackSupervisor.realStartActivityLocked():
    // ActivityStackSupervisor.java    boolean realStartActivityLocked(ActivityRecord r, WindowProcessController proc,            boolean andResume, boolean checkConfig) throws RemoteException {        //确保全部的Activity实行了onPause才会往下继续实行        if (!mRootActivityContainer.allPausedActivitiesComplete()) {            // While there are activities pausing we skipping starting any new activities until            // pauses are complete. NOTE: that we also do this for activities that are starting in            // the paused state because they will first be resumed then paused on the client side.            if (DEBUG_SWITCH || DEBUG_PAUSE || DEBUG_STATES) Slog.v(TAG_PAUSE,                    "realStartActivityLocked: Skipping start of r=" + r                    + " some activities pausing...");            return false;        }        ... ...         try {            ... ...            try{                ... ...                // Create activity launch transaction.                final ClientTransaction clientTransaction = ClientTransaction.obtain(                        proc.getThread(), r.appToken);                 final DisplayContent dc = r.getDisplay().mDisplayContent;                //在回调序列的末端添加一条消息                clientTransaction.addCallback(LaunchActivityItem.obtain(... ...));                 // Set desired final state.                final ActivityLifecycleItem lifecycleItem;                if (andResume) {                    lifecycleItem = ResumeActivityItem.obtain(dc.isNextTransitionForward());                } else {                    lifecycleItem = PauseActivityItem.obtain();                }                //添加末了实行的生命周期状态                clientTransaction.setLifecycleStateRequest(lifecycleItem);                 // 这里实在就是实行ClientTransaction的schedule()方法                mService.getLifecycleManager().scheduleTransaction(clientTransaction);                ... ...            } catch (RemoteException e) {                if (r.launchFailed) {                    // 第二次启动失败,finish activity并放弃启动                    Slog.e(TAG, "Second failure launching "                            + r.intent.getComponent().flattenToShortString() + ", giving up", e);                    proc.appDied();                    stack.requestFinishActivityLocked(r.appToken, Activity.RESULT_CANCELED, null,                            "2nd-crash", false);                    return false;                }                 //第一次启动失败,实验重启历程                r.launchFailed = true;                proc.removeActivity(r);                throw e;            }        } finally {            endDeferResume();        }        ... ...         return true;    }ActivityThread调用栈:

小结

至此已经走到 realStartActivityLocked,接下来就是 Activity 的启动流程,Activity 启动下篇文章会单独分析。总结一下 Launcher 启动流程,Launcher的启动颠末了三个阶段:
  1、SystemServer 创建AMS和ATMS,通过 SystemReady 进入 LauncherActivity 的调用
  2、Zygote 历程 fork 出 Launcher 历程,通过 Socket 举行通讯
  3、进入 ActivityThread 的处置惩罚,完成 Launcher 的 Acitivty 启动
您需要登录后才可以回帖 登录 | 立即注册

Powered by CangBaoKu v1.0 小黑屋藏宝库It社区( 冀ICP备14008649号 )

GMT+8, 2024-10-18 16:52, Processed in 0.179186 second(s), 35 queries.© 2003-2025 cbk Team.

快速回复 返回顶部 返回列表