Android9.0源码学习 - Launcher Activi

作者: Dufre | 来源:发表于2018-12-23 18:30 被阅读15次

    由于篇幅限制,分了两个部分来写,Android9.0源码学习 - Launcher Activity(一)

    AMS -> Activity

    刚才讲到在startSpecificActivityLocked()中,会判断app是否running,如果不是在running会先去启这个app,如果已经running了,会跑realStartActivityLocked()

    /frameworks/base/services/core/java/com/android/server/am/ActivityStackSupervisor.java - realStartActivityLocked()

        final boolean realStartActivityLocked(ActivityRecord r, ProcessRecord app,
                boolean andResume, boolean checkConfig) throws RemoteException {
            ///M: Add debug trace tag
            Trace.traceBegin(TRACE_TAG_ACTIVITY_MANAGER, "realStartActivityLocked");
            if (!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;
            }
    
            final TaskRecord task = r.getTask();
            final ActivityStack stack = task.getStack();
    
            beginDeferResume();
    
            try {
                r.startFreezingScreenLocked(app, 0);
    
                // schedule launch ticks to collect information about slow apps.
                r.startLaunchTickingLocked();
    
                r.setProcess(app);
    
                if (getKeyguardController().isKeyguardLocked()) {
                    r.notifyUnknownVisibilityLaunched();
                }
    
                // Have the window manager re-evaluate the orientation of the screen based on the new
                // activity order.  Note that as a result of this, it can call back into the activity
                // manager with a new orientation.  We don't care about that, because the activity is
                // not currently running so we are just restarting it anyway.
                if (checkConfig) {
                    // Deferring resume here because we're going to launch new activity shortly.
                    // We don't want to perform a redundant launch of the same record while ensuring
                    // configurations and trying to resume top activity of focused stack.
                    ensureVisibilityAndConfig(r, r.getDisplayId(),
                            false /* markFrozenIfConfigChanged */, true /* deferResume */);
                }
    
                if (r.getStack().checkKeyguardVisibility(r, true /* shouldBeVisible */,
                        true /* isTop */)) {
                    // We only set the visibility to true if the activity is allowed to be visible
                    // based on
                    // keyguard state. This avoids setting this into motion in window manager that is
                    // later cancelled due to later calls to ensure visible activities that set
                    // visibility back to false.
                    r.setVisibility(true);
                }
    
                final int applicationInfoUid =
                        (r.info.applicationInfo != null) ? r.info.applicationInfo.uid : -1;
                if ((r.userId != app.userId) || (r.appInfo.uid != applicationInfoUid)) {
                    Slog.wtf(TAG,
                            "User ID for activity changing for " + r
                                    + " appInfo.uid=" + r.appInfo.uid
                                    + " info.ai.uid=" + applicationInfoUid
                                    + " old=" + r.app + " new=" + app);
                }
    
                app.waitingToKill = null;
                r.launchCount++;
                r.lastLaunchTime = SystemClock.uptimeMillis();
    
                if (DEBUG_ALL) Slog.v(TAG, "Launching: " + r);
    
                int idx = app.activities.indexOf(r);
                if (idx < 0) {
                    app.activities.add(r);
                }
                mService.updateLruProcessLocked(app, true, null);
                mService.mHandler.post(mService::updateOomAdj);
    
                final LockTaskController lockTaskController = mService.getLockTaskController();
                if (task.mLockTaskAuth == LOCK_TASK_AUTH_LAUNCHABLE
                        || task.mLockTaskAuth == LOCK_TASK_AUTH_LAUNCHABLE_PRIV
                        || (task.mLockTaskAuth == LOCK_TASK_AUTH_WHITELISTED
                                && lockTaskController.getLockTaskModeState()
                                        == LOCK_TASK_MODE_LOCKED)) {
                    lockTaskController.startLockTaskMode(task, false, 0 /* blank UID */);
                }
    
                try {
                    if (app.thread == null) {
                        throw new RemoteException();
                    }
                    List<ResultInfo> results = null;
                    List<ReferrerIntent> newIntents = null;
                    if (andResume) {
                        // We don't need to deliver new intents and/or set results if activity is going
                        // to pause immediately after launch.
                        results = r.results;
                        newIntents = r.newIntents;
                    }
                    if (DEBUG_SWITCH) Slog.v(TAG_SWITCH,
                            "Launching: " + r + " icicle=" + r.icicle + " with results=" + results
                                    + " newIntents=" + newIntents + " andResume=" + andResume);
                    EventLog.writeEvent(EventLogTags.AM_RESTART_ACTIVITY, r.userId,
                            System.identityHashCode(r), task.taskId, r.shortComponentName);
                    if (r.isActivityTypeHome()) {
                        // Home process is the root process of the task.
                        mService.mHomeProcess = task.mActivities.get(0).app;
                    }
                    mService.notifyPackageUse(r.intent.getComponent().getPackageName(),
                            PackageManager.NOTIFY_PACKAGE_USE_ACTIVITY);
                    r.sleeping = false;
                    r.forceNewConfig = false;
                    mService.getAppWarningsLocked().onStartActivity(r);
                    mService.showAskCompatModeDialogLocked(r);
                    r.compat = mService.compatibilityInfoForPackageLocked(r.info.applicationInfo);
                    ProfilerInfo profilerInfo = null;
                    if (mService.mProfileApp != null && mService.mProfileApp.equals(app.processName)) {
                        if (mService.mProfileProc == null || mService.mProfileProc == app) {
                            mService.mProfileProc = app;
                            ProfilerInfo profilerInfoSvc = mService.mProfilerInfo;
                            if (profilerInfoSvc != null && profilerInfoSvc.profileFile != null) {
                                if (profilerInfoSvc.profileFd != null) {
                                    try {
                                        profilerInfoSvc.profileFd = profilerInfoSvc.profileFd.dup();
                                    } catch (IOException e) {
                                        profilerInfoSvc.closeFd();
                                    }
                                }
    
                                profilerInfo = new ProfilerInfo(profilerInfoSvc);
                            }
                        }
                    }
    
                    app.hasShownUi = true;
                    app.pendingUiClean = true;
                    app.forceProcessStateUpTo(mService.mTopProcessState);
                    // Because we could be starting an Activity in the system process this may not go
                    // across a Binder interface which would create a new Configuration. Consequently
                    // we have to always create a new Configuration here.
    
                    final MergedConfiguration mergedConfiguration = new MergedConfiguration(
                            mService.getGlobalConfiguration(), r.getMergedOverrideConfiguration());
                    r.setLastReportedConfiguration(mergedConfiguration);
    
                    logIfTransactionTooLarge(r.intent, r.icicle);
    
                    ///M: Add debug trace tag
                    Trace.traceBegin(TRACE_TAG_ACTIVITY_MANAGER, "LaunchActivityItem");
                    // Create activity launch transaction.
                    final ClientTransaction clientTransaction = ClientTransaction.obtain(app.thread,
                            r.appToken);
                    clientTransaction.addCallback(LaunchActivityItem.obtain(new Intent(r.intent),
                            System.identityHashCode(r), r.info,
                            // TODO: Have this take the merged configuration instead of separate global
                            // and override configs.
                            mergedConfiguration.getGlobalConfiguration(),
                            mergedConfiguration.getOverrideConfiguration(), r.compat,
                            r.launchedFromPackage, task.voiceInteractor, app.repProcState, r.icicle,
                            r.persistentState, results, newIntents, mService.isNextTransitionForward(),
                            profilerInfo));
    
                    // Set desired final state.
                    final ActivityLifecycleItem lifecycleItem;
                    if (andResume) {
                        lifecycleItem = ResumeActivityItem.obtain(mService.isNextTransitionForward());
                    } else {
                        lifecycleItem = PauseActivityItem.obtain();
                    }
                    clientTransaction.setLifecycleStateRequest(lifecycleItem);
    
                    // Schedule transaction.
                    mService.getLifecycleManager().scheduleTransaction(clientTransaction);
                    ///M: Add debug trace tag
                    Trace.traceEnd(TRACE_TAG_ACTIVITY_MANAGER);
    
                    if ((app.info.privateFlags & ApplicationInfo.PRIVATE_FLAG_CANT_SAVE_STATE) != 0
                            && mService.mHasHeavyWeightFeature) {
                        // This may be a heavy-weight process!  Note that the package
                        // manager will ensure that only activity can run in the main
                        // process of the .apk, which is the only thing that will be
                        // considered heavy-weight.
                        if (app.processName.equals(app.info.packageName)) {
                            if (mService.mHeavyWeightProcess != null
                                    && mService.mHeavyWeightProcess != app) {
                                Slog.w(TAG, "Starting new heavy weight process " + app
                                        + " when already running "
                                        + mService.mHeavyWeightProcess);
                            }
                            mService.mHeavyWeightProcess = app;
                            Message msg = mService.mHandler.obtainMessage(
                                    ActivityManagerService.POST_HEAVY_NOTIFICATION_MSG);
                            msg.obj = r;
                            mService.mHandler.sendMessage(msg);
                        }
                    }
    
                } catch (RemoteException e) {
                    if (r.launchFailed) {
                        // This is the second time we failed -- finish activity
                        // and give up.
                        Slog.e(TAG, "Second failure launching "
                                + r.intent.getComponent().flattenToShortString()
                                + ", giving up", e);
                        mService.appDiedLocked(app);
                        stack.requestFinishActivityLocked(r.appToken, Activity.RESULT_CANCELED, null,
                                "2nd-crash", false);
                        return false;
                    }
    
                    // This is the first time we failed -- restart process and
                    // retry.
                    r.launchFailed = true;
                    app.activities.remove(r);
                    throw e;
                }
            } finally {
                endDeferResume();
            }
    
            r.launchFailed = false;
            if (stack.updateLRUListLocked(r)) {
                Slog.w(TAG, "Activity " + r + " being launched, but already in LRU list");
            }
    
            // TODO(lifecycler): Resume or pause requests are done as part of launch transaction,
            // so updating the state should be done accordingly.
            if (andResume && readyToResume()) {
                // As part of the process of launching, ActivityThread also performs
                // a resume.
                stack.minimalResumeActivityLocked(r);
            } else {
                // This activity is not starting in the resumed state... which should look like we asked
                // it to pause+stop (but remain visible), and it has done so and reported back the
                // current icicle and other state.
                if (DEBUG_STATES) Slog.v(TAG_STATES,
                        "Moving to PAUSED: " + r + " (starting in paused state)");
                r.setState(PAUSED, "realStartActivityLocked");
            }
    
            // Launch the new version setup screen if needed.  We do this -after-
            // launching the initial activity (that is, home), so that it can have
            // a chance to initialize itself while in the background, making the
            // switch back to it faster and look better.
            if (isFocusedStack(stack)) {
                mService.getActivityStartController().startSetupActivity();
            }
    
            // Update any services we are bound to that might care about whether
            // their client may have activities.
            if (r.app != null) {
                mService.mServices.updateServiceConnectionActivitiesLocked(r.app);
            }
            ///M: Add debug trace tag
            Trace.traceEnd(TRACE_TAG_ACTIVITY_MANAGER);
            return true;
        }
    

    通过ActivityLifecycleItem(ActivityLifecycleItem extends ClientTransactionItem)这个类的实例去设置了Activity的状态(lifecycle的那几种状态),然后调用了mService.getLifecycleManager().scheduleTransaction(clientTransaction);这里的mService是AMS,mService.getLifecycleManager()返回的是ClientLifecycleManager类型,那么这句话其实调用了ClientLifecycleManager的scheduleTransaction()函数。

    在Android8.0中,是通过ApplicationThread.scheduleLaunchActivity()对相关数据进行封装,然后通过调用ActivityThread类的sendMessage()发送出去。
    但是在Android9.0中,引入了ClientLifecycleManager和ClientTransactionHandler来辅助管理Activity生命周期。

    /frameworks/base/services/core/java/com/android/server/am/ClientLifecycleManager.java - scheduleTransaction()

        void scheduleTransaction(ClientTransaction transaction) throws RemoteException {
            ///M: Add debug trace tag
            Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "CLM.scheduleTransaction");
            final IApplicationThread client = transaction.getClient();
            transaction.schedule();
            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();
            }
            ///M: Add debug trace tag
            Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
        }
    

    这里调用了ClientTransactionschedule()

    /frameworks/base/core/java/android/app/servertransaction/ClientTransaction.java - schedule()

        /**
         * Schedule the transaction after it was initialized. It will be send to client and all its
         * individual parts will be applied in the following sequence:
         * 1. The client calls {@link #preExecute(ClientTransactionHandler)}, which triggers all work
         *    that needs to be done before actually scheduling the transaction for callbacks and
         *    lifecycle state request.
         * 2. The transaction message is scheduled.
         * 3. The client calls {@link TransactionExecutor#execute(ClientTransaction)}, which executes
         *    all callbacks and necessary lifecycle transitions.
         */
        public void schedule() throws RemoteException {
            mClient.scheduleTransaction(this);
        }
    

    mClient(private IApplicationThread mClient;)是一个IApplicationThread类型,这里其实是一个Binder,ActivityThread的内部类ApplicationThread派生这个接口类,因此这里实际调用了ActivityThread的scheduleTransaction()方法。

    /frameworks/base/core/java/android/app/ActivityThread.java - scheduleTransaction(ClientTransaction transaction)

            public void scheduleTransaction(ClientTransaction transaction) throws RemoteException {
                ActivityThread.this.scheduleTransaction(transaction);
            }
    

    这里调用了ActivityThread的父类ClientTransactionHandler的scheduleTransaction()

    /frameworks/base/core/java/android/app/ClientTransactionHandler.java - scheduleTransaction()

        /** Prepare and schedule transaction for execution. */
        void scheduleTransaction(ClientTransaction transaction) {
            transaction.preExecute(this);
            sendMessage(ActivityThread.H.EXECUTE_TRANSACTION, transaction);
        }
    

    然后再接着调用了sendMessage(),这个函数是由ClientTransactionHandler的子类ActivityThread实现的,这里代入了一个ActivityThread.H.EXECUTE_TRANSACTION的参数。

    /frameworks/base/core/java/android/app/ActivityThread.java - sendMessage()

        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);
        }
    

    sendMessage()中调用了,ActivityThread的内部类H的sendMessage(),也是在H类里面去处理消息,也就是H类的handleMessage()函数。

    /frameworks/base/core/java/android/app/ActivityThread.java - handleMessage(Message msg)

            public void handleMessage(Message msg) {
                if (DEBUG_MESSAGES) Slog.v(TAG, ">>> handling: " + codeToString(msg.what));
                switch (msg.what) {
                    case BIND_APPLICATION:
                        Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "bindApplication");
                        AppBindData data = (AppBindData)msg.obj;
                        handleBindApplication(data);
                        Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
                        break;
                    case EXIT_APPLICATION:
                        if (mInitialApplication != null) {
                            mInitialApplication.onTerminate();
                        }
                        Looper.myLooper().quit();
                        break;
                    case RECEIVER:
                        Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "broadcastReceiveComp");
                        handleReceiver((ReceiverData)msg.obj);
                        Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
                        break;
                    case CREATE_SERVICE:
                        Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, ("serviceCreate: " + String.valueOf(msg.obj)));
                        handleCreateService((CreateServiceData)msg.obj);
                        Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
                        break;
                    case BIND_SERVICE:
                        Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "serviceBind");
                        handleBindService((BindServiceData)msg.obj);
                        Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
                        break;
                    case UNBIND_SERVICE:
                        Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "serviceUnbind");
                        handleUnbindService((BindServiceData)msg.obj);
                        Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
                        break;
                    case SERVICE_ARGS:
                        Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, ("serviceStart: " + String.valueOf(msg.obj)));
                        handleServiceArgs((ServiceArgsData)msg.obj);
                        Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
                        break;
                    case STOP_SERVICE:
                        Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "serviceStop");
                        handleStopService((IBinder)msg.obj);
                        Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
                        break;
                    case CONFIGURATION_CHANGED:
                        handleConfigurationChanged((Configuration) msg.obj);
                        break;
                    case CLEAN_UP_CONTEXT:
                        ContextCleanupInfo cci = (ContextCleanupInfo)msg.obj;
                        cci.context.performFinalCleanup(cci.who, cci.what);
                        break;
                    case GC_WHEN_IDLE:
                        scheduleGcIdler();
                        break;
                    case DUMP_SERVICE:
                        handleDumpService((DumpComponentInfo)msg.obj);
                        break;
                    case LOW_MEMORY:
                        Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "lowMemory");
                        handleLowMemory();
                        Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
                        break;
                    case PROFILER_CONTROL:
                        handleProfilerControl(msg.arg1 != 0, (ProfilerInfo)msg.obj, msg.arg2);
                        break;
                    case CREATE_BACKUP_AGENT:
                        Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "backupCreateAgent");
                        handleCreateBackupAgent((CreateBackupAgentData)msg.obj);
                        Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
                        break;
                    case DESTROY_BACKUP_AGENT:
                        Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "backupDestroyAgent");
                        handleDestroyBackupAgent((CreateBackupAgentData)msg.obj);
                        Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
                        break;
                    case SUICIDE:
                        Process.killProcess(Process.myPid());
                        break;
                    case REMOVE_PROVIDER:
                        Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "providerRemove");
                        completeRemoveProvider((ProviderRefCount)msg.obj);
                        Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
                        break;
                    case ENABLE_JIT:
                        ensureJitEnabled();
                        break;
                    case DISPATCH_PACKAGE_BROADCAST:
                        Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "broadcastPackage");
                        handleDispatchPackageBroadcast(msg.arg1, (String[])msg.obj);
                        Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
                        break;
                    case SCHEDULE_CRASH:
                        throw new RemoteServiceException((String)msg.obj);
                    case DUMP_HEAP:
                        handleDumpHeap((DumpHeapData) msg.obj);
                        break;
                    case DUMP_ACTIVITY:
                        handleDumpActivity((DumpComponentInfo)msg.obj);
                        break;
                    case DUMP_PROVIDER:
                        handleDumpProvider((DumpComponentInfo)msg.obj);
                        break;
                    case SLEEPING:
                        Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "sleeping");
                        handleSleeping((IBinder)msg.obj, msg.arg1 != 0);
                        Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
                        break;
                    case SET_CORE_SETTINGS:
                        Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "setCoreSettings");
                        handleSetCoreSettings((Bundle) msg.obj);
                        Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
                        break;
                    case UPDATE_PACKAGE_COMPATIBILITY_INFO:
                        handleUpdatePackageCompatibilityInfo((UpdateCompatibilityData)msg.obj);
                        break;
                    case UNSTABLE_PROVIDER_DIED:
                        handleUnstableProviderDied((IBinder)msg.obj, false);
                        break;
                    case REQUEST_ASSIST_CONTEXT_EXTRAS:
                        handleRequestAssistContextExtras((RequestAssistContextExtras)msg.obj);
                        break;
                    case TRANSLUCENT_CONVERSION_COMPLETE:
                        handleTranslucentConversionComplete((IBinder)msg.obj, msg.arg1 == 1);
                        break;
                    case INSTALL_PROVIDER:
                        handleInstallProvider((ProviderInfo) msg.obj);
                        break;
                    case ON_NEW_ACTIVITY_OPTIONS:
                        Pair<IBinder, ActivityOptions> pair = (Pair<IBinder, ActivityOptions>) msg.obj;
                        onNewActivityOptions(pair.first, pair.second);
                        break;
                    case ENTER_ANIMATION_COMPLETE:
                        handleEnterAnimationComplete((IBinder) msg.obj);
                        break;
                    case START_BINDER_TRACKING:
                        handleStartBinderTracking();
                        break;
                    case STOP_BINDER_TRACKING_AND_DUMP:
                        handleStopBinderTrackingAndDump((ParcelFileDescriptor) msg.obj);
                        break;
                    case LOCAL_VOICE_INTERACTION_STARTED:
                        handleLocalVoiceInteractionStarted((IBinder) ((SomeArgs) msg.obj).arg1,
                                (IVoiceInteractor) ((SomeArgs) msg.obj).arg2);
                        break;
                    case ATTACH_AGENT: {
                        Application app = getApplication();
                        handleAttachAgent((String) msg.obj, app != null ? app.mLoadedApk : null);
                        break;
                    }
                    case APPLICATION_INFO_CHANGED:
                        mUpdatingSystemConfig = true;
                        try {
                            handleApplicationInfoChanged((ApplicationInfo) msg.obj);
                        } finally {
                            mUpdatingSystemConfig = false;
                        }
                        break;
                    case RUN_ISOLATED_ENTRY_POINT:
                        handleRunIsolatedEntryPoint((String) ((SomeArgs) msg.obj).arg1,
                                (String[]) ((SomeArgs) msg.obj).arg2);
                        break;
                    case EXECUTE_TRANSACTION:
                        final ClientTransaction transaction = (ClientTransaction) msg.obj;
                        mTransactionExecutor.execute(transaction);
                        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;
                    case RELAUNCH_ACTIVITY:
                        handleRelaunchActivityLocally((IBinder) msg.obj);
                        break;
                }
                Object obj = msg.obj;
                if (obj instanceof SomeArgs) {
                    ((SomeArgs) obj).recycle();
                }
                if (DEBUG_MESSAGES) Slog.v(TAG, "<<< done: " + codeToString(msg.what));
            }
        }
    

    之前知道发送的是EXECUTE_TRANSACTION,那case EXECUTE_TRANSACTION里面去调用了mTransactionExecutor.execute(transaction)。也就是TransactionExecutor类的execute()

    /frameworks/base/core/java/android/app/servertransaction/TransactionExecutor.java - execute()

        /**
         * Resolve transaction.
         * First all callbacks will be executed in the order they appear in the list. If a callback
         * requires a certain pre- or post-execution state, the client will be transitioned accordingly.
         * Then the client will cycle to the final lifecycle state if provided. Otherwise, it will
         * either remain in the initial state, or last state needed by a callback.
         */
        public void execute(ClientTransaction transaction) {
            ///M: Add debug trace tag
            Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "TransactionExecutor.execute");
            final IBinder token = transaction.getActivityToken();
            log("Start resolving transaction for client: " + mTransactionHandler + ", token: " + token);
    
            executeCallbacks(transaction);
    
            executeLifecycleState(transaction);
            mPendingActions.clear();
            log("End resolving transaction");
            ///M: Add debug trace tag
            Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
        }
    

    这里需要先Callbacks,然后调用了executeLifecycleState(transaction)

    /frameworks/base/core/java/android/app/servertransaction/TransactionExecutor.java - executeLifecycleState()

        /** Transition to the final state if requested by the transaction. */
        private void executeLifecycleState(ClientTransaction transaction) {
            final ActivityLifecycleItem lifecycleItem = transaction.getLifecycleStateRequest();
            if (lifecycleItem == null) {
                // No lifecycle request, return early.
                return;
            }
            log("Resolving lifecycle state: " + lifecycleItem);
    
            final IBinder token = transaction.getActivityToken();
            final ActivityClientRecord r = mTransactionHandler.getActivityClient(token);
    
            if (r == null) {
                // Ignore requests for non-existent client records for now.
                return;
            }
    
            // Cycle to the state right before the final requested state.
            cycleToPath(r, lifecycleItem.getTargetState(), true /* excludeLastState */);
    
            // Execute the final transition with proper parameters.
            lifecycleItem.execute(mTransactionHandler, token, mPendingActions);
            lifecycleItem.postExecute(mTransactionHandler, token, mPendingActions);
        }
    

    接着调用了cycleToPath(),这里的第二个参数通过lifecycleItem.getTargetState()得到,在realStartActivityLocked()中创建的ActivityLifecycleItem 是 ResumeActivityItem类型的。

    /frameworks/base/core/java/android/app/servertransaction/TransactionExecutor.java - cycleToPath()

        /**
         * Transition the client between states with an option not to perform the last hop in the
         * sequence. This is used when resolving lifecycle state request, when the last transition must
         * be performed with some specific parameters.
         */
        private void cycleToPath(ActivityClientRecord r, int finish,
                boolean excludeLastState) {
            final int start = r.getLifecycleState();
            log("Cycle from: " + start + " to: " + finish + " excludeLastState:" + excludeLastState);
            final IntArray path = mHelper.getLifecyclePath(start, finish, excludeLastState);
            performLifecycleSequence(r, path);
        }
    

    cycleToPath()得到了IntArray 类型的变量path,这里记录了执行哪些生命周期函数,比如resume Activity之前需要先create Activity,然后调用performLifecycleSequence()

    /frameworks/base/core/java/android/app/servertransaction/TransactionExecutor.java - performLifecycleSequence()

        /** Transition the client through previously initialized state sequence. */
        private void performLifecycleSequence(ActivityClientRecord r, IntArray path) {
            final int size = path.size();
            for (int i = 0, state; i < size; i++) {
                state = path.get(i);
                log("Transitioning to state: " + state);
                switch (state) {
                    case ON_CREATE:
                        mTransactionHandler.handleLaunchActivity(r, mPendingActions,
                                null /* customIntent */);
                        break;
                    case ON_START:
                        mTransactionHandler.handleStartActivity(r, mPendingActions);
                        break;
                    case ON_RESUME:
                        mTransactionHandler.handleResumeActivity(r.token, false /* finalStateRequest */,
                                r.isForward, "LIFECYCLER_RESUME_ACTIVITY");
                        break;
                    case ON_PAUSE:
                        mTransactionHandler.handlePauseActivity(r.token, false /* finished */,
                                false /* userLeaving */, 0 /* configChanges */, mPendingActions,
                                "LIFECYCLER_PAUSE_ACTIVITY");
                        break;
                    case ON_STOP:
                        mTransactionHandler.handleStopActivity(r.token, false /* show */,
                                0 /* configChanges */, mPendingActions, false /* finalStateRequest */,
                                "LIFECYCLER_STOP_ACTIVITY");
                        break;
                    case ON_DESTROY:
                        mTransactionHandler.handleDestroyActivity(r.token, false /* finishing */,
                                0 /* configChanges */, false /* getNonConfigInstance */,
                                "performLifecycleSequence. cycling to:" + path.get(size - 1));
                        break;
                    case ON_RESTART:
                        mTransactionHandler.performRestartActivity(r.token, false /* start */);
                        break;
                    default:
                        throw new IllegalArgumentException("Unexpected lifecycle state: " + state);
                }
            }
        }
    

    performLifecycleSequence()中首先执行的是case ON_CREATE对应的部分,它调用了ClientTransactionHandler的handleLaunchActivity()函数,这个函数是由它的子类ActivityThread去实现的。

    /frameworks/base/core/java/android/app/ActivityThread.java - handleLaunchActivity()

        /**
         * Extended implementation of activity launch. Used when server requests a launch or relaunch.
         */
        @Override
        public Activity handleLaunchActivity(ActivityClientRecord r,
                PendingTransactionActions pendingActions, Intent customIntent) {
            ///M: Add debug trace tag.
            Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "handleLaunchActivity");
            // If we are getting ready to gc after going to the background, well
            // we are back active so skip it.
            unscheduleGcIdler();
            mSomeActivitiesChanged = true;
    
            if (r.profilerInfo != null) {
                mProfiler.setProfiler(r.profilerInfo);
                mProfiler.startProfiling();
            }
    
            // Make sure we are running with the most recent config.
            handleConfigurationChanged(null, null);
    
            if (localLOGV) Slog.v(
                TAG, "Handling launch of " + r);
    
            // Initialize before creating the activity
            if (!ThreadedRenderer.sRendererDisabled) {
                GraphicsEnvironment.earlyInitEGL();
            }
            WindowManagerGlobal.initialize();
    
            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 {
                    ActivityManager.getService()
                            .finishActivity(r.token, Activity.RESULT_CANCELED, null,
                                    Activity.DONT_FINISH_TASK_WITH_ACTIVITY);
                } catch (RemoteException ex) {
                    throw ex.rethrowFromSystemServer();
                }
            }
            ///M: Add debug trace tag.
            Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
            return a;
        }
    

    这里会调用performLaunchActivity()返回一个Activity对象。

    /frameworks/base/core/java/android/app/ActivityThread.java - performLaunchActivity()

        /**  Core implementation of activity launch. */
        private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {
            ActivityInfo aInfo = r.activityInfo;
            if (r.packageInfo == null) {
                r.packageInfo = getPackageInfo(aInfo.applicationInfo, r.compatInfo,
                        Context.CONTEXT_INCLUDE_CODE);
            }
    
            ComponentName component = r.intent.getComponent();
            if (component == null) {
                component = r.intent.resolveActivity(
                    mInitialApplication.getPackageManager());
                r.intent.setComponent(component);
            }
    
            if (r.activityInfo.targetActivity != null) {
                component = new ComponentName(r.activityInfo.packageName,
                        r.activityInfo.targetActivity);
            }
    
            ContextImpl appContext = createBaseContextForActivity(r);
            Activity activity = null;
            try {
                java.lang.ClassLoader cl = appContext.getClassLoader();
                activity = mInstrumentation.newActivity(
                        cl, component.getClassName(), r.intent);
                StrictMode.incrementExpectedActivityCount(activity.getClass());
                r.intent.setExtrasClassLoader(cl);
                r.intent.prepareToEnterProcess();
                if (r.state != null) {
                    r.state.setClassLoader(cl);
                }
            } catch (Exception e) {
                if (!mInstrumentation.onException(activity, e)) {
                    throw new RuntimeException(
                        "Unable to instantiate activity " + component
                        + ": " + e.toString(), e);
                }
            }
    
            try {
                Application app = r.packageInfo.makeApplication(false, mInstrumentation);
    
                if (localLOGV) Slog.v(TAG, "Performing launch of " + r);
                if (localLOGV) Slog.v(
                        TAG, r + ": app=" + app
                        + ", appName=" + app.getPackageName()
                        + ", pkg=" + r.packageInfo.getPackageName()
                        + ", comp=" + r.intent.getComponent().toShortString()
                        + ", dir=" + r.packageInfo.getAppDir());
    
                if (activity != null) {
                    CharSequence title = r.activityInfo.loadLabel(appContext.getPackageManager());
                    Configuration config = new Configuration(mCompatConfiguration);
                    if (r.overrideConfig != null) {
                        config.updateFrom(r.overrideConfig);
                    }
                    if (DEBUG_CONFIGURATION) Slog.v(TAG, "Launching activity "
                            + r.activityInfo.name + " with config " + config);
                    Window window = null;
                    if (r.mPendingRemoveWindow != null && r.mPreserveWindow) {
                        window = r.mPendingRemoveWindow;
                        r.mPendingRemoveWindow = null;
                        r.mPendingRemoveWindowManager = null;
                    }
                    appContext.setOuterContext(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);
    
                    if (customIntent != null) {
                        activity.mIntent = customIntent;
                    }
                    r.lastNonConfigurationInstances = null;
                    checkAndBlockForNetworkAccess();
                    activity.mStartedActivity = false;
                    int theme = r.activityInfo.getThemeResource();
                    if (theme != 0) {
                        activity.setTheme(theme);
                    }
    
                    activity.mCalled = false;
                    if (r.isPersistable()) {
                        mInstrumentation.callActivityOnCreate(activity, r.state, r.persistentState);
                    } else {
                        mInstrumentation.callActivityOnCreate(activity, r.state);
                    }
                    if (!activity.mCalled) {
                        throw new SuperNotCalledException(
                            "Activity " + r.intent.getComponent().toShortString() +
                            " did not call through to super.onCreate()");
                    }
                    r.activity = activity;
                }
                r.setState(ON_CREATE);
    
                mActivities.put(r.token, r);
    
            } catch (SuperNotCalledException e) {
                throw e;
    
            } catch (Exception e) {
                if (!mInstrumentation.onException(activity, e)) {
                    throw new RuntimeException(
                        "Unable to start activity " + component
                        + ": " + e.toString(), e);
                }
            }
    
            return activity;
        }
    

    这里调用了mInstrumentation.callActivityOnCreate()

    /frameworks/base/core/java/android/app/Instrumentation.java - callActivityOnCreate()

        /**
         * Perform calling of an activity's {@link Activity#onCreate}
         * method.  The default implementation simply calls through to that method.
         *
         * @param activity The activity being created.
         * @param icicle The previously frozen state (or null) to pass through to onCreate().
         */
        public void callActivityOnCreate(Activity activity, Bundle icicle) {
            prePerformCreate(activity);
            activity.performCreate(icicle);
            postPerformCreate(activity);
        }
    

    调用了Activity的performCreate()

        final void performCreate(Bundle icicle, PersistableBundle persistentState) {
            mCanEnterPictureInPicture = true;
            restoreHasCurrentPermissionRequest(icicle);
            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());
        }
    

    然后可以看到这里终于调用到了onCreate()
    下面是AMS -> Activity的总结

    在这里插入图片描述

    整个的启动过程我也画了一张简略的图,clientTransaction那里之前不是很理解,其中处理消息那一部分简略了一些。

    在这里插入图片描述

    那Activity与WMS的联系,可以看这篇博客,有机会我也会自己研究一番,这个作者的(一)(二)也写的相当好。
    Android9.0 Activity启动流程分析(三)

    参考资料

    相关文章

      网友评论

        本文标题:Android9.0源码学习 - Launcher Activi

        本文链接:https://www.haomeiwen.com/subject/umwnkqtx.html