Android O:应用启动流程

纪录一下Android 8.0版本应用启动的流程。

下面是桌面点击应用后,AMS的流程图。

《Android O:应用启动流程》 应用启动流程

相比Android 6.0,Android 8.0在添加了一个ActivityStarter类来处理Activity的启动。

对应上图,每个步骤的功能如下
1.ActivityManagerService.startActivityAsUser:添加上用户信息
2.ActivityStarter.startActivityMayWait:从pms获取要启动的Activity的在apk中的信息。
3.ActivityStarter.startActivityLocked,纪录启动的原因,启动的时间的一些变量中去。

    int startActivityLocked(IApplicationThread caller, Intent intent, Intent ephemeralIntent,
            String resolvedType, ActivityInfo aInfo, ResolveInfo rInfo,
            IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor,
            IBinder resultTo, String resultWho, int requestCode, int callingPid, int callingUid,
            String callingPackage, int realCallingPid, int realCallingUid, int startFlags,
            ActivityOptions options, boolean ignoreTargetSecurity, boolean componentSpecified,
            ActivityRecord[] outActivity, ActivityStackSupervisor.ActivityContainer container,
            TaskRecord inTask, String reason) {

        if (TextUtils.isEmpty(reason)) {
            throw new IllegalArgumentException("Need to specify a reason.");
        }
        mLastStartReason = reason;
        mLastStartActivityTimeMs = System.currentTimeMillis();
        mLastStartActivityRecord[0] = null;

        mLastStartActivityResult = startActivity(caller, intent, ephemeralIntent, resolvedType,
                aInfo, rInfo, voiceSession, voiceInteractor, resultTo, resultWho, requestCode,
                callingPid, callingUid, callingPackage, realCallingPid, realCallingUid, startFlags,
                options, ignoreTargetSecurity, componentSpecified, mLastStartActivityRecord,
                container, inTask);

        if (outActivity != null) {
            // mLastStartActivityRecord[0] is set in the call to startActivity above.
            outActivity[0] = mLastStartActivityRecord[0];
        }
        return mLastStartActivityResult;
    }

4.ActivityStarter.startActivity,新建sourceRecord,callinguid,calling pid等。另外要对activity的进行权限检查。将要启动的Activity信息封装到ActivityRecord中。
5.ActivityStarter.startActivity,这个函数名跟步骤4是一样的,但传入的参数不一样。主要是defer延迟layout,等startActivityUnchecked完成之后,再继续continueSurfaceLayout。

    private int startActivity(final ActivityRecord r, ActivityRecord sourceRecord,
            IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor,
            int startFlags, boolean doResume, ActivityOptions options, TaskRecord inTask,
            ActivityRecord[] outActivity) {
        int result = START_CANCELED;
        try {
            mService.mWindowManager.deferSurfaceLayout();
            result = startActivityUnchecked(r, sourceRecord, voiceSession, voiceInteractor,
                    startFlags, doResume, options, inTask, outActivity);
        } finally {
            // If we are not able to proceed, disassociate the activity from the task. Leaving an
            // activity in an incomplete state can lead to issues, such as performing operations
            // without a window container.
            if (!ActivityManager.isStartResultSuccessful(result)
                    && mStartActivity.getTask() != null) {
                mStartActivity.getTask().removeActivity(mStartActivity);
            }
            mService.mWindowManager.continueSurfaceLayout();
        }

        postStartActivityProcessing(r, result, mSupervisor.getLastStack().mStackId,  mSourceRecord,
                mTargetStack);

        return result;
    }

6.ActivityStarter.startActivityUnchecked。这个函数主要是对要启动ActivityRecord进行处理,找到或者新建合适的Task,找到Stack,并把他们推到最前面或者Focus。

7.ActivityStackSupervisor.resumeFocusedStackTopActivityLocked。这个函数是对Focused的stack的顶部Activity进行Resume的操作。

8.ActivityStack.resumeTopActivityInnerLocked。这个函数是Stack内部,对TopActivity进行Resume。

9.ActivityStackSupervisor.pauseBackStacks。暂停掉上个应用的Stack。例如如果应用从桌面启动,就是要暂停桌面。

问题思考

ActivityThread什么时候有了进程名?

在ActivityThread中,会调用attach方法,然后调用AMS的attachApplication
,让AMS跟应用进行绑定。AMS进而调用bindApplication,把应用的进程名告知给应用。应用在handleBindApplication调用Process.setArgV0设置进程名。

   public static void main(String[] args) {
        Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "ActivityThreadMain”);
       …….
        Looper.prepareMainLooper();
        ActivityThread thread = new ActivityThread();
        thread.attach(false);
        Looper.loop();
       …….
        throw new RuntimeException("Main thread loop unexpectedly exited");
    }

1.focus的stack和task是什么时候发生转换的?这时应用进程启动了吗?

2.AMS和WMS交互的时间点时什么?有什么交互的地方吗?

    原文作者:九九叔
    原文地址: https://www.jianshu.com/p/02b425277d3d
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞