android开发浅谈之App启动过程二

一 启动app整体框架图

这是直接copy Gityuan同学的启动app的整体框架图:
在这里插入图片描述

启动流程:
1.点击桌面App图标,Launcher进程采用Binder IPC向system_server进程发起startActivity请求;
2.system_server进程接收到请求后,向zygote进程发送创建进程的请求;
3.Zygote进程fork出新的子进程,即App进程;
4.App进程,通过Binder IPC向sytem_server进程发起attachApplication请求;
5.system_server进程在收到请求后,进行一系列准备工作后,再通过binder IPC向App进程发送scheduleLaunchActivity请求;
6.App进程的binder线程(ApplicationThread)在收到请求后,通过handler向主线程发送LAUNCH_ACTIVITY消息;
7.主线程在收到Message后,通过发射机制创建目标Activity,并回调Activity.onCreate()等方法。
到此,App便正式启动,开始进入Activity生命周期,执行完onCreate/onStart/onResume方法,UI渲染结束后便可以看到App的主界面。

此图真是说的真是清晰,其中关键的是三个部分:
(1)Launcher进程,就是点击桌面App图标,启动应用;
(2)system_server进程,这部分,我主要从ams和wms二个角度来分析,这是这遍文章的重点;
(3)App进程,这个我主要是从ActivityThread类来分析;

此文章,我只讨论这三个部分,其源码基于android 10.0。

二 浅谈Launcher进程

Launcher进程,就是点击桌面App图标,启动应用。

此样例以点击桌面短信应用的图标,进入短信列表主界面为例:

2.1 添加日志:
Activity.startActivity的日志添加
frameworks\base\core\java\android\app\Activity.java

public void startActivity(Intent intent, @Nullable Bundle options) {

2.2 对应输出日志:

android.app.Activity.startActivity(Activity.java:5603)
com.android.launcher3.BaseDraggingActivity.startActivitySafely(BaseDraggingActivity.java:335)
com.android.launcher3.Launcher.startActivity(Launcher.java:4514)
com.android.launcher3.Launcher.startActivitySafely(Launcher.java:4482)
com.android.launcher3.touch.ItemClickHandler.startApp(ItemClickHandler.java:589)
com.android.launcher3.touch.ItemClickHandler.startAppShortcutOrInfoActivity(ItemClickHandler.java:529)
com.android.launcher3.touch.ItemClickHandler.onClickAppShortcut(ItemClickHandler.java:469)
com.android.launcher3.touch.ItemClickHandler.onClick(ItemClickHandler.java:163)
com.android.launcher3.touch.ItemClickHandler.lambda$oPqR0koj5OQZ6VtyqmfcFGp5X0Q(Unknown Source:0)
com.android.launcher3.touch.-$$Lambda$ItemClickHandler$oPqR0koj5OQZ6VtyqmfcFGp5X0Q.onClick(Unknown Source:0)
android.view.View.performClick(View.java:7285)
com.android.launcher3.BubbleTextView.performClick(BubbleTextView.java:624)
android.view.View.performClickInternal(View.java:7249)
android.view.View.access$3600(View.java:808)
android.view.View$PerformClick.run(View.java:27932)
android.os.Handler.handleCallback(Handler.java:883)
android.os.Handler.dispatchMessage(Handler.java:100)
android.os.Looper.loop(Looper.java:221)
android.app.ActivityThread.main(ActivityThread.java:7572)
java.lang.reflect.Method.invoke(Native Method)
com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:935)

2.3 其时序图:
在这里插入图片描述

三 浅谈启动的App进程

此部分,我们将此放在讨论顺序的第二位。其原因是因为,这部分比较简单,方便理解。

第一种情况,Activity.onCreate:

3.1.1 添加日志:
Activity.onCreate的日志添加
frameworks\base\core\java\android\app\Activity.java

protected void onCreate(@Nullable Bundle savedInstanceState) {

3.1.2 对应输出日志:

onCreate com.android.messaging.ui.conversationlist.ConversationListActivity@3e435a5
......
at android.app.Activity.onCreate(Activity.java:1458)
at androidx.core.app.ComponentActivity.onCreate(ComponentActivity.java:85)
at androidx.activity.ComponentActivity.onCreate(ComponentActivity.java:149)
at androidx.fragment.app.FragmentActivity.onCreate(FragmentActivity.java:313)
at androidx.appcompat.app.AppCompatActivity.onCreate(AppCompatActivity.java:106)
at com.trello.rxlifecycle3.components.support.RxAppCompatActivity.onCreate(RxAppCompatActivity.java:73)
at com.android.messaging.ui.BugleActionBarActivity.onCreate(BugleActionBarActivity.java:73)
at com.android.messaging.ui.conversationlist.ConversationListActivity.onCreate(ConversationListActivity.java:94)
at android.app.Activity.performCreate(Activity.java:7903)
at android.app.Activity.performCreate(Activity.java:7892)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1307)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3312)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3481)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2027)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:221)
at android.app.ActivityThread.main(ActivityThread.java:7572)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:935)

其中android.app.ActivityThread$H.handleMessage(ActivityThread.java:2027):
这个是响应EXECUTE_TRANSACTION消息:

  case EXECUTE_TRANSACTION:
      final ClientTransaction transaction = (ClientTransaction) msg.obj;
      mTransactionExecutor.execute(transaction);

3.1.3 其时序图:
在这里插入图片描述

第二种情况,Activity.onResume:

3.2.1 添加日志:
Activity.onResume的日志添加
frameworks\base\core\java\android\app\Activity.java

protected void onResume() {

3.2.2 对应输出日志:

android.app.Activity.onResume(Activity.java:1799)
androidx.fragment.app.FragmentActivity.onResume(FragmentActivity.java:456)
com.trello.rxlifecycle3.components.support.RxAppCompatActivity.onResume(RxAppCompatActivity.java:87)
com.android.messaging.ui.BugleActionBarActivity.onResume(BugleActionBarActivity.java:102)
com.android.messaging.ui.conversationlist.ConversationListActivity.onResume(ConversationListActivity.java:121)
android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1454)
android.app.Activity.performResume(Activity.java:8049)
android.app.ActivityThread.performResumeActivity(ActivityThread.java:4274)
android.app.ActivityThread.handleResumeActivity(ActivityThread.java:4316)
android.app.servertransaction.ResumeActivityItem.execute(ResumeActivityItem.java:52)
android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:176)
android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:97)
android.app.ActivityThread$H.handleMessage(ActivityThread.java:2027)
android.os.Handler.dispatchMessage(Handler.java:107)
android.os.Looper.loop(Looper.java:221)
android.app.ActivityThread.main(ActivityThread.java:7572)
java.lang.reflect.Method.invoke(Native Method)
com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:935)

四 浅谈启动的system_server进程

创建ActivityRecord

1 添加日志:
ActivityRecord.ActivityRecord的日志添加
frameworks\base\services\core\java\com\android\server\wm\ActivityRecord.java

ActivityRecord(ActivityTaskManagerService _service, WindowProcessController _caller,
            int _launchedFromPid, int _launchedFromUid, String _launchedFromPackage, Intent _intent,
            String _resolvedType, ActivityInfo aInfo, Configuration _configuration,
            ActivityRecord _resultTo, String _resultWho, int _reqCode, boolean _componentSpecified,
            boolean _rootVoiceInteraction, ActivityStackSupervisor supervisor,
            ActivityOptions options, ActivityRecord sourceRecord) {

2 调用过程:

com.android.server.wm.ActivityRecord.<init>(ActivityRecord.java:960)
com.android.server.wm.ActivityStarter.startActivity(ActivityStarter.java:971)
com.android.server.wm.ActivityStarter.startActivity(ActivityStarter.java:608)
com.android.server.wm.ActivityStarter.startActivityMayWait(ActivityStarter.java:1502)
com.android.server.wm.ActivityStarter.execute(ActivityStarter.java:539)
com.android.server.wm.ActivityTaskManagerService.startActivityAsUser(ActivityTaskManagerService.java:1264)
com.android.server.wm.ActivityTaskManagerService.startActivityAsUser(ActivityTaskManagerService.java:1238)
com.android.server.wm.ActivityTaskManagerService.startActivity(ActivityTaskManagerService.java:1215)
android.app.IActivityTaskManager$Stub.onTransact(IActivityTaskManager.java:1866)
android.os.Binder.execTransactInternal(Binder.java:1021)
android.os.Binder.execTransact(Binder.java:994)

3 调用过程简单分析:
ActivityTaskManagerService.startActivity

public final int startActivity(IApplicationThread caller, String callingPackage,
        Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode,
        int startFlags, ProfilerInfo profilerInfo, Bundle bOptions) {
    return startActivityAsUser(caller, callingPackage, intent, resolvedType, resultTo,
            resultWho, requestCode, startFlags, profilerInfo, bOptions,
            UserHandle.getCallingUserId());
}

ActivityTaskManagerService.startActivityAsUser

public int startActivityAsUser(IApplicationThread caller, String callingPackage,
        Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode,
        int startFlags, ProfilerInfo profilerInfo, Bundle bOptions, int userId) {
    return startActivityAsUser(caller, callingPackage, intent, resolvedType, resultTo,
            resultWho, requestCode, startFlags, profilerInfo, bOptions, userId,
            true /*validateIncomingUser*/);
}
int startActivityAsUser(IApplicationThread caller, String callingPackage,
        Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode,
        int startFlags, ProfilerInfo profilerInfo, Bundle bOptions, int userId,
        boolean validateIncomingUser) {
	....
    // TODO: Switch to user app stacks here.
    return getActivityStartController().obtainStarter(intent, "startActivityAsUser")
            .setCaller(caller)
            .setCallingPackage(callingPackage)
            .setResolvedType(resolvedType)
            .setResultTo(resultTo)
            .setResultWho(resultWho)
            .setRequestCode(requestCode)
            .setStartFlags(startFlags)
            .setProfilerInfo(profilerInfo)
            .setActivityOptions(bOptions)
            .setMayWait(userId)
            .execute();
}

ActivityStarter.execute

/**
 * Starts an activity based on the request parameters provided earlier.
 * @return The starter result.
 */
int execute() {
    try {
        // TODO(b/64750076): Look into passing request directly to these methods to allow
        // for transactional diffs and preprocessing.
        if (mRequest.mayWait) {
            return startActivityMayWait(mRequest.caller, mRequest.callingUid,
                    mRequest.callingPackage, mRequest.realCallingPid, mRequest.realCallingUid,
                    mRequest.intent, mRequest.resolvedType,
                    mRequest.voiceSession, mRequest.voiceInteractor, mRequest.resultTo,
                    mRequest.resultWho, mRequest.requestCode, mRequest.startFlags,
                    mRequest.profilerInfo, mRequest.waitResult, mRequest.globalConfig,
                    mRequest.activityOptions, mRequest.ignoreTargetSecurity, mRequest.userId,
                    mRequest.inTask, mRequest.reason,
                    mRequest.allowPendingRemoteAnimationRegistryLookup,
                    mRequest.originatingPendingIntent, mRequest.allowBackgroundActivityStart);

ActivityStarter.startActivityMayWait

private int startActivityMayWait(IApplicationThread caller, int callingUid,
        String callingPackage, int requestRealCallingPid, int requestRealCallingUid,
        Intent intent, String resolvedType, IVoiceInteractionSession voiceSession,
        IVoiceInteractor voiceInteractor, IBinder resultTo, String resultWho, int requestCode,
        int startFlags, ProfilerInfo profilerInfo, WaitResult outResult,
        Configuration globalConfig, SafeActivityOptions options, boolean ignoreTargetSecurity,
        int userId, TaskRecord inTask, String reason,
        boolean allowPendingRemoteAnimationRegistryLookup,
        PendingIntentRecord originatingPendingIntent, boolean allowBackgroundActivityStart) {
        ....
        final ActivityRecord[] outRecord = new ActivityRecord[1];
        int res = startActivity(caller, intent, ephemeralIntent, resolvedType, aInfo, rInfo,
                voiceSession, voiceInteractor, resultTo, resultWho, requestCode, callingPid,
                callingUid, callingPackage, realCallingPid, realCallingUid, startFlags, options,
                ignoreTargetSecurity, componentSpecified, outRecord, inTask, reason,
                allowPendingRemoteAnimationRegistryLookup, originatingPendingIntent,
                allowBackgroundActivityStart);

ActivityStarter.startActivity

private int startActivity(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,
        SafeActivityOptions options, boolean ignoreTargetSecurity, boolean componentSpecified,
        ActivityRecord[] outActivity, TaskRecord inTask, String reason,
        boolean allowPendingRemoteAnimationRegistryLookup,
        PendingIntentRecord originatingPendingIntent, boolean allowBackgroundActivityStart) {
        ....
        mLastStartActivityResult = startActivity(caller, intent, ephemeralIntent, resolvedType,
        aInfo, rInfo, voiceSession, voiceInteractor, resultTo, resultWho, requestCode,
        callingPid, callingUid, callingPackage, realCallingPid, realCallingUid, startFlags,
        options, ignoreTargetSecurity, componentSpecified, mLastStartActivityRecord,
        inTask, allowPendingRemoteAnimationRegistryLookup, originatingPendingIntent,
        allowBackgroundActivityStart);
private int startActivity(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,
        SafeActivityOptions options,
        boolean ignoreTargetSecurity, boolean componentSpecified, ActivityRecord[] outActivity,
        TaskRecord inTask, boolean allowPendingRemoteAnimationRegistryLookup,
        PendingIntentRecord originatingPendingIntent, boolean allowBackgroundActivityStart) {
        ....
        // 创建ActivityRecord 对象
        ActivityRecord r = new ActivityRecord(mService, callerApp, callingPid, callingUid,
        callingPackage, intent, resolvedType, aInfo, mService.getGlobalConfiguration(),
        resultRecord, resultWho, requestCode, componentSpecified, voiceSession != null,
        mSupervisor, checkedOptions, sourceRecord);

创建ActivityStack

1 添加日志:
ActivityStack.ActivityStack的日志添加
frameworks\base\services\core\java\com\android\server\wm\ActivityStack.java

ActivityStack(ActivityDisplay display, int stackId, ActivityStackSupervisor supervisor,
        int windowingMode, int activityType, boolean onTop) {

2 调用过程:

com.android.server.wm.ActivityStack.<init>(ActivityStack.java:535)
com.android.server.wm.ActivityDisplay.createStackUnchecked(ActivityDisplay.java:553)
com.android.server.wm.ActivityDisplay.createStack(ActivityDisplay.java:543)
com.android.server.wm.ActivityDisplay.getOrCreateStack(ActivityDisplay.java:449)
com.android.server.wm.ActivityDisplay.getOrCreateStack(ActivityDisplay.java:468)
com.android.server.wm.RootActivityContainer.getLaunchStack(RootActivityContainer.java:1767)
com.android.server.wm.ActivityStarter.getLaunchStack(ActivityStarter.java:2930)
com.android.server.wm.ActivityStarter.computeStackFocus(ActivityStarter.java:2833)
com.android.server.wm.ActivityStarter.setTaskFromReuseOrCreateNewTask(ActivityStarter.java:2539)
com.android.server.wm.ActivityStarter.startActivityUnchecked(ActivityStarter.java:1898)
com.android.server.wm.ActivityStarter.startActivity(ActivityStarter.java:1608)
com.android.server.wm.ActivityStarter.startActivity(ActivityStarter.java:1004)
com.android.server.wm.ActivityStarter.startActivity(ActivityStarter.java:608)
com.android.server.wm.ActivityStarter.startActivityMayWait(ActivityStarter.java:1502)
com.android.server.wm.ActivityStarter.execute(ActivityStarter.java:539)
com.android.server.wm.ActivityTaskManagerService.startActivityAsUser(ActivityTaskManagerService.java:1264)
com.android.server.wm.ActivityTaskManagerService.startActivityAsUser(ActivityTaskManagerService.java:1238)
com.android.server.wm.ActivityTaskManagerService.startActivity(ActivityTaskManagerService.java:1215)
android.app.IActivityTaskManager$Stub.onTransact(IActivityTaskManager.java:1866)
android.os.Binder.execTransactInternal(Binder.java:1021)
android.os.Binder.execTransact(Binder.java:994)

3 调用过程简单分析:

接上面分析:
ActivityStarter.startActivity

private int startActivity(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,
    SafeActivityOptions options,
    boolean ignoreTargetSecurity, boolean componentSpecified, ActivityRecord[] outActivity,
    TaskRecord inTask, boolean allowPendingRemoteAnimationRegistryLookup,
    PendingIntentRecord originatingPendingIntent, boolean allowBackgroundActivityStart) {
    ....
    final int res = startActivity(r, sourceRecord, voiceSession, voiceInteractor, startFlags,
    true /* doResume */, 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) {
    int result = START_CANCELED;
    final ActivityStack startedActivityStack;
    try {
        mService.mWindowManager.deferSurfaceLayout();
        result = startActivityUnchecked(r, sourceRecord, voiceSession, voiceInteractor,
                startFlags, doResume, options, inTask, outActivity, restrictedBgActivity);

ActivityStarter.startActivityUnchecked

// Note: This method should only be called from {@link startActivity}.
private int startActivityUnchecked(final ActivityRecord r, ActivityRecord sourceRecord,
        IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor,
        int startFlags, boolean doResume, ActivityOptions options, TaskRecord inTask,
        ActivityRecord[] outActivity, boolean restrictedBgActivity) {
        ....
       // Should this be considered a new task?
       int result = START_SUCCESS;
       if (mStartActivity.resultTo == null && mInTask == null && !mAddingToTask
               && (mLaunchFlags & FLAG_ACTIVITY_NEW_TASK) != 0) {
           newTask = true;
           String packageName= mService.mContext.getPackageName();
           if (mPerf != null) {
               mStartActivity.perfActivityBoostHandler =
                   mPerf.perfHint(BoostFramework.VENDOR_HINT_FIRST_LAUNCH_BOOST,
                                       packageName, -1, BoostFramework.Launch.BOOST_V1);
           }
           result = setTaskFromReuseOrCreateNewTask(taskToAffiliate);//认为是新建的task

ActivityStarter.setTaskFromReuseOrCreateNewTask

private int setTaskFromReuseOrCreateNewTask(TaskRecord taskToAffiliate) {
	....
    mTargetStack = computeStackFocus(mStartActivity, true, mLaunchFlags, mOptions);

ActivityStarter.computeStackFocus

private ActivityStack computeStackFocus(ActivityRecord r, boolean newTask, int launchFlags,
        ActivityOptions aOptions) {
    final TaskRecord task = r.getTaskRecord();
    ActivityStack stack = getLaunchStack(r, launchFlags, task, aOptions);

ActivityStarter.getLaunchStack

private ActivityStack getLaunchStack(ActivityRecord r, int launchFlags, TaskRecord task,
        ActivityOptions aOptions) {
    // We are reusing a task, keep the stack!
    if (mReuseTask != null) {
        return mReuseTask.getStack();
    }

    if (((launchFlags & FLAG_ACTIVITY_LAUNCH_ADJACENT) == 0)
             || mPreferredDisplayId != DEFAULT_DISPLAY) {
        final boolean onTop = aOptions == null || !aOptions.getAvoidMoveToFront();
        final ActivityStack stack =
                mRootActivityContainer.getLaunchStack(r, aOptions, task, onTop, mLaunchParams,
                        mRequest.realCallingPid, mRequest.realCallingUid);
        return stack;
    }

RootActivityContainer.getLaunchStack

<T extends ActivityStack> T getLaunchStack(@Nullable ActivityRecord r,
        @Nullable ActivityOptions options, @Nullable TaskRecord candidateTask, boolean onTop,
        @Nullable LaunchParamsController.LaunchParams launchParams, int realCallingPid,
        int realCallingUid) {
        ....
        final ActivityDisplay display = getActivityDisplayOrCreate(displayId);
        if (display != null) {
            stack = display.getOrCreateStack(r, options, candidateTask, activityType, onTop);
            if (stack != null) {
                return stack;
            }
        }

ActivityDisplay.getOrCreateStack

<T extends ActivityStack> T getOrCreateStack(@Nullable ActivityRecord r,
        @Nullable ActivityOptions options, @Nullable TaskRecord candidateTask, int activityType,
        boolean onTop) {
	....
    return getOrCreateStack(windowingMode, activityType, onTop);
}
<T extends ActivityStack> T getOrCreateStack(int windowingMode, int activityType,
        boolean onTop) {
    if (!alwaysCreateStack(windowingMode, activityType)) {
        T stack = getStack(windowingMode, activityType);
        if (stack != null) {
            return stack;
        }
    }
    return createStack(windowingMode, activityType, onTop);
}

ActivityDisplay.createStack

<T extends ActivityStack> T createStack(int windowingMode, int activityType, boolean onTop) {
	....
	return createStackUnchecked(windowingMode, activityType, stackId, onTop);

ActivityDisplay.createStackUnchecked

<T extends ActivityStack> T createStackUnchecked(int windowingMode, int activityType,
        int stackId, boolean onTop) {
	....
	//创建ActivityStack
    return (T) new ActivityStack(this, stackId,
            mRootActivityContainer.mStackSupervisor, windowingMode, activityType, onTop);
}

创建TaskStack

1 添加日志:
TaskStack.TaskStack的日志添加
frameworks\base\services\core\java\com\android\server\wm\TaskStack.java

TaskStack(WindowManagerService service, int stackId, ActivityStack activityStack) {
    super(service);

2 调用过程:

com.android.server.wm.TaskStack.<init>(TaskStack.java:173)
com.android.server.wm.ActivityStack.createTaskStack(ActivityStack.java:560)
com.android.server.wm.ActivityStack.<init>(ActivityStack.java:547)
com.android.server.wm.ActivityDisplay.createStackUnchecked(ActivityDisplay.java:553)
com.android.server.wm.ActivityDisplay.createStack(ActivityDisplay.java:543)
com.android.server.wm.ActivityDisplay.getOrCreateStack(ActivityDisplay.java:449)
com.android.server.wm.ActivityDisplay.getOrCreateStack(ActivityDisplay.java:468)
com.android.server.wm.RootActivityContainer.getLaunchStack(RootActivityContainer.java:1767)
com.android.server.wm.ActivityStarter.getLaunchStack(ActivityStarter.java:2930)
com.android.server.wm.ActivityStarter.computeStackFocus(ActivityStarter.java:2833)
com.android.server.wm.ActivityStarter.setTaskFromReuseOrCreateNewTask(ActivityStarter.java:2539)
com.android.server.wm.ActivityStarter.startActivityUnchecked(ActivityStarter.java:1898)
com.android.server.wm.ActivityStarter.startActivity(ActivityStarter.java:1608)
com.android.server.wm.ActivityStarter.startActivity(ActivityStarter.java:1004)
com.android.server.wm.ActivityStarter.startActivity(ActivityStarter.java:608)
com.android.server.wm.ActivityStarter.startActivityMayWait(ActivityStarter.java:1502)
com.android.server.wm.ActivityStarter.execute(ActivityStarter.java:539)
com.android.server.wm.ActivityTaskManagerService.startActivityAsUser(ActivityTaskManagerService.java:1264)
com.android.server.wm.ActivityTaskManagerService.startActivityAsUser(ActivityTaskManagerService.java:1238)
com.android.server.wm.ActivityTaskManagerService.startActivity(ActivityTaskManagerService.java:1215)
android.app.IActivityTaskManager$Stub.onTransact(IActivityTaskManager.java:1866)
android.os.Binder.execTransactInternal(Binder.java:1021)
android.os.Binder.execTransact(Binder.java:994)

3 调用过程简单分析:

接上面分析:

ActivityStack.

ActivityStack(ActivityDisplay display, int stackId, ActivityStackSupervisor supervisor,
        int windowingMode, int activityType, boolean onTop) {
        ....
        createTaskStack(display.mDisplayId, onTop, mTmpRect2);

ActivityStack.createTaskStack

void createTaskStack(int displayId, boolean onTop, Rect outBounds) {
    final DisplayContent dc = mWindowManager.mRoot.getDisplayContent(displayId);
	....
    mTaskStack = new TaskStack(mWindowManager, mStackId, this);
    dc.setStackOnDisplay(mStackId, onTop, mTaskStack);

创建TaskRecord

1 添加日志:
TaskRecord.TaskRecord的日志添加
frameworks\base\services\core\java\com\android\server\wm\TaskRecord.java

/**
 * Don't use constructor directly. Use {@link #create(ActivityTaskManagerService, int,
 * ActivityInfo, Intent, TaskDescription)} instead.
 */
TaskRecord(ActivityTaskManagerService service, int _taskId, ActivityInfo info, Intent _intent,
        IVoiceInteractionSession _voiceSession, IVoiceInteractor _voiceInteractor) {

2 调用过程:

com.android.server.wm.TaskRecord.<init>(TaskRecord.java:375)
com.android.server.wm.TaskRecord$TaskRecordFactory.create(TaskRecord.java:2874)
com.android.server.wm.TaskRecord.create(TaskRecord.java:2850)
com.android.server.wm.ActivityStack.createTaskRecord(ActivityStack.java:6057)
com.android.server.wm.ActivityStarter.setTaskFromReuseOrCreateNewTask(ActivityStarter.java:2546)
com.android.server.wm.ActivityStarter.startActivityUnchecked(ActivityStarter.java:1898)
com.android.server.wm.ActivityStarter.startActivity(ActivityStarter.java:1608)
com.android.server.wm.ActivityStarter.startActivity(ActivityStarter.java:1004)
com.android.server.wm.ActivityStarter.startActivity(ActivityStarter.java:608)
com.android.server.wm.ActivityStarter.startActivityMayWait(ActivityStarter.java:1502)
com.android.server.wm.ActivityStarter.execute(ActivityStarter.java:539)
com.android.server.wm.ActivityTaskManagerService.startActivityAsUser(ActivityTaskManagerService.java:1264)
com.android.server.wm.ActivityTaskManagerService.startActivityAsUser(ActivityTaskManagerService.java:1238)
com.android.server.wm.ActivityTaskManagerService.startActivity(ActivityTaskManagerService.java:1215)
android.app.IActivityTaskManager$Stub.onTransact(IActivityTaskManager.java:1866)
android.os.Binder.execTransactInternal(Binder.java:1021)
android.os.Binder.execTransact(Binder.java:994)

3 调用过程简单分析:

接上面分析:
ActivityStarter.setTaskFromReuseOrCreateNewTask

private int setTaskFromReuseOrCreateNewTask(TaskRecord taskToAffiliate) {
	......
    mTargetStack = computeStackFocus(mStartActivity, true, mLaunchFlags, mOptions);

    // Do no move the target stack to front yet, as we might bail if
    // isLockTaskModeViolation fails below.

    if (mReuseTask == null) {
        final boolean toTop = !mLaunchTaskBehind && !mAvoidMoveToFront;
        final TaskRecord task = mTargetStack.createTaskRecord(
                mSupervisor.getNextTaskIdForUserLocked(mStartActivity.mUserId),
                mNewTaskInfo != null ? mNewTaskInfo : mStartActivity.info,
                mNewTaskIntent != null ? mNewTaskIntent : mIntent, mVoiceSession,
                mVoiceInteractor, toTop, mStartActivity, mSourceRecord, mOptions);

ActivityStack.createTaskRecord

TaskRecord createTaskRecord(int taskId, ActivityInfo info, Intent intent,
        IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor,
        boolean toTop, ActivityRecord activity, ActivityRecord source,
        ActivityOptions options) {
    final TaskRecord task = TaskRecord.create(
            mService, taskId, info, intent, voiceSession, voiceInteractor);
    // add the task to stack first, mTaskPositioner might need the stack association
    addTask(task, toTop, "createTaskRecord");

TaskRecord.create

static TaskRecord create(ActivityTaskManagerService service, int taskId, ActivityInfo info,
        Intent intent, IVoiceInteractionSession voiceSession,
        IVoiceInteractor voiceInteractor) {
    return getTaskRecordFactory().create(
            service, taskId, info, intent, voiceSession, voiceInteractor);
}

TaskRecord$TaskRecordFactory.create

static class TaskRecordFactory {

    TaskRecord create(ActivityTaskManagerService service, int taskId, ActivityInfo info,
            Intent intent, IVoiceInteractionSession voiceSession,
            IVoiceInteractor voiceInteractor) {
        //创建TaskRecord
        return new TaskRecord(
                service, taskId, info, intent, voiceSession, voiceInteractor);
    }

创建Task

1 添加日志:
Task.Task的日志添加
frameworks\base\services\core\java\com\android\server\wm\Task.java

Task(int taskId, TaskStack stack, int userId, WindowManagerService service, int resizeMode,
        boolean supportsPictureInPicture, TaskDescription taskDescription,
        TaskRecord taskRecord) {
    super(service);

2 调用过程:

com.android.server.wm.Task.<init>(Task.java:123)
com.android.server.wm.TaskRecord.createTask(TaskRecord.java:565)
com.android.server.wm.ActivityStack.createTaskRecord(ActivityStack.java:6069)
com.android.server.wm.ActivityStarter.setTaskFromReuseOrCreateNewTask(ActivityStarter.java:2546)
com.android.server.wm.ActivityStarter.startActivityUnchecked(ActivityStarter.java:1898)
com.android.server.wm.ActivityStarter.startActivity(ActivityStarter.java:1608)
com.android.server.wm.ActivityStarter.startActivity(ActivityStarter.java:1004)
com.android.server.wm.ActivityStarter.startActivity(ActivityStarter.java:608)
com.android.server.wm.ActivityStarter.startActivityMayWait(ActivityStarter.java:1502)
com.android.server.wm.ActivityStarter.execute(ActivityStarter.java:539)
com.android.server.wm.ActivityTaskManagerService.startActivityAsUser(ActivityTaskManagerService.java:1264)
com.android.server.wm.ActivityTaskManagerService.startActivityAsUser(ActivityTaskManagerService.java:1238)
com.android.server.wm.ActivityTaskManagerService.startActivity(ActivityTaskManagerService.java:1215)
android.app.IActivityTaskManager$Stub.onTransact(IActivityTaskManager.java:1866)
android.os.Binder.execTransactInternal(Binder.java:1021)
android.os.Binder.execTransact(Binder.java:994)

3 调用过程简单分析:

接上面分析:
ActivityStarter.setTaskFromReuseOrCreateNewTask

private int setTaskFromReuseOrCreateNewTask(TaskRecord taskToAffiliate) {
......
    if (mReuseTask == null) {
        final boolean toTop = !mLaunchTaskBehind && !mAvoidMoveToFront;
        final TaskRecord task = mTargetStack.createTaskRecord(
                mSupervisor.getNextTaskIdForUserLocked(mStartActivity.mUserId),
                mNewTaskInfo != null ? mNewTaskInfo : mStartActivity.info,
                mNewTaskIntent != null ? mNewTaskIntent : mIntent, mVoiceSession,
                mVoiceInteractor, toTop, mStartActivity, mSourceRecord, mOptions);

ActivityStack.createTaskRecord

TaskRecord createTaskRecord(int taskId, ActivityInfo info, Intent intent,
        IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor,
        boolean toTop, ActivityRecord activity, ActivityRecord source,
        ActivityOptions options) {
    final TaskRecord task = TaskRecord.create(
            mService, taskId, info, intent, voiceSession, voiceInteractor);
    // add the task to stack first, mTaskPositioner might need the stack association
    addTask(task, toTop, "createTaskRecord");
	......
    if (!mStackSupervisor.getLaunchParamsController()
            .layoutTask(task, info.windowLayout, activity, source, options)
            && !matchParentBounds() && task.isResizeable() && !isLockscreenShown) {
        task.updateOverrideConfiguration(getRequestedOverrideBounds());
    }
    task.createTask(toTop, (info.flags & FLAG_SHOW_FOR_ALL_USERS) != 0);
    return task;
}

TaskRecord.createTask

void createTask(boolean onTop, boolean showForAllUsers) {
....
    //创建Task
	mTask = new Task(taskId, stack, userId, mService.mWindowManager, mResizeMode,
	        mSupportsPictureInPicture, lastTaskDescription, this);

创建WindowToken

1 添加日志:
WindowToken.WindowToken的日志添加
frameworks\base\services\core\java\com\android\server\wm\WindowToken.java

WindowToken(WindowManagerService service, IBinder _token, int type, boolean persistOnEmpty,
        DisplayContent dc, boolean ownerCanManageAppTokens) {
    this(service, _token, type, persistOnEmpty, dc, ownerCanManageAppTokens,
            false /* roundedCornersOverlay */);
    Slog.v(TAG, "WindowToken this:" + this);
}

2 调用过程:

WindowManager: WindowToken this:AppWindowToken{46441a7 token=Token{3f8da66 ActivityRecord{c4817a8 u0 com.android.messaging/.ui.conversationlist.ConversationListActivity t6}}}
com.android.server.wm.WindowToken.<init>(WindowToken.java:113)
com.android.server.wm.AppWindowToken.<init>(AppWindowToken.java:374)
com.android.server.wm.AppWindowToken.<init>(AppWindowToken.java:347)
com.android.server.wm.ActivityRecord.createAppWindow(ActivityRecord.java:1216)
com.android.server.wm.ActivityRecord.createAppWindowToken(ActivityRecord.java:1149)
com.android.server.wm.ActivityStack.startActivityLocked(ActivityStack.java:3565)
com.android.server.wm.ActivityStarter.startActivityUnchecked(ActivityStarter.java:1928)
com.android.server.wm.ActivityStarter.startActivity(ActivityStarter.java:1608)
com.android.server.wm.ActivityStarter.startActivity(ActivityStarter.java:1004)
com.android.server.wm.ActivityStarter.startActivity(ActivityStarter.java:608)
com.android.server.wm.ActivityStarter.startActivityMayWait(ActivityStarter.java:1502)
com.android.server.wm.ActivityStarter.execute(ActivityStarter.java:539)
com.android.server.wm.ActivityTaskManagerService.startActivityAsUser(ActivityTaskManagerService.java:1264)
com.android.server.wm.ActivityTaskManagerService.startActivityAsUser(ActivityTaskManagerService.java:1238)
com.android.server.wm.ActivityTaskManagerService.startActivity(ActivityTaskManagerService.java:1215)
android.app.IActivityTaskManager$Stub.onTransact(IActivityTaskManager.java:1866)
android.os.Binder.execTransactInternal(Binder.java:1021)
android.os.Binder.execTransact(Binder.java:994)

3 调用过程简单分析:

接上面分析:
ActivityStarter.startActivityUnchecked

// Note: This method should only be called from {@link startActivity}.
private int startActivityUnchecked(final ActivityRecord r, ActivityRecord sourceRecord,
        IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor,
        int startFlags, boolean doResume, ActivityOptions options, TaskRecord inTask,
        ActivityRecord[] outActivity, boolean restrictedBgActivity) {
        ....
        mTargetStack.startActivityLocked(mStartActivity, topFocused, newTask, mKeepCurTransition,
        mOptions);

ActivityStack.startActivityLocked

void startActivityLocked(ActivityRecord r, ActivityRecord focusedTopActivity,
        boolean newTask, boolean keepCurTransition, ActivityOptions options) {
    ....
    // Slot the activity into the history stack and proceed
    if (DEBUG_ADD_REMOVE) Slog.i(TAG, "Adding activity " + r + " to stack to task " + task,
            new RuntimeException("here").fillInStackTrace());
    // TODO: Need to investigate if it is okay for the controller to already be created by the
    // time we get to this point. I think it is, but need to double check.
    // Use test in b/34179495 to trace the call path.
    if (r.mAppWindowToken == null) {
        r.createAppWindowToken();
    }

ActivityRecord.createAppWindowToken

void createAppWindowToken() {
....
    mAppWindowToken = createAppWindow(mAtmService.mWindowManager, appToken,
            task.voiceSession != null, container.getDisplayContent(),
            ActivityTaskManagerService.getInputDispatchingTimeoutLocked(this)
                    * 1000000L, fullscreen,
            (info.flags & FLAG_SHOW_FOR_ALL_USERS) != 0, appInfo.targetSdkVersion,
            info.screenOrientation, mRotationAnimationHint,
            mLaunchTaskBehind, isAlwaysFocusable());

ActivityRecord.createAppWindow

AppWindowToken createAppWindow(WindowManagerService service, IApplicationToken token,
        boolean voiceInteraction, DisplayContent dc, long inputDispatchingTimeoutNanos,
        boolean fullscreen, boolean showForAllUsers, int targetSdk, int orientation,
        int rotationAnimationHint, boolean launchTaskBehind,
        boolean alwaysFocusable) {
    return new AppWindowToken(service, token, mActivityComponent, voiceInteraction, dc,
            inputDispatchingTimeoutNanos, fullscreen, showForAllUsers, targetSdk, orientation,
            rotationAnimationHint, launchTaskBehind, alwaysFocusable,
            this);
}

AppWindowToken.

AppWindowToken(WindowManagerService service, IApplicationToken token,
        ComponentName activityComponent, boolean voiceInteraction, DisplayContent dc,
        long inputDispatchingTimeoutNanos, boolean fullscreen, boolean showForAllUsers,
        int targetSdk, int orientation, int rotationAnimationHint,
        boolean launchTaskBehind, boolean alwaysFocusable,
        ActivityRecord activityRecord) {
    this(service, token, activityComponent, voiceInteraction, dc, fullscreen);
AppWindowToken(WindowManagerService service, IApplicationToken token,
        ComponentName activityComponent, boolean voiceInteraction, DisplayContent dc,
        boolean fillsParent) {
    super(service, token != null ? token.asBinder() : null, TYPE_APPLICATION, true, dc,
            false /* ownerCanManageAppTokens */);

创建AppWindowToken

1 添加日志:
AppWindowToken.AppWindowToken的日志添加
frameworks\base\services\core\java\com\android\server\wm\AppWindowToken.java

AppWindowToken(WindowManagerService service, IApplicationToken token,
        ComponentName activityComponent, boolean voiceInteraction, DisplayContent dc,
        long inputDispatchingTimeoutNanos, boolean fullscreen, boolean showForAllUsers,
        int targetSdk, int orientation, int rotationAnimationHint,
        boolean launchTaskBehind, boolean alwaysFocusable,
        ActivityRecord activityRecord) {
    this(service, token, activityComponent, voiceInteraction, dc, fullscreen);
    Slog.v(TAG, "AppWindowToken this:" + this);
}

2 调用过程:

WindowManager: AppWindowToken this:AppWindowToken{46441a7 token=Token{3f8da66 ActivityRecord{c4817a8 u0 com.android.messaging/.ui.conversationlist.ConversationListActivity t6}}}
com.android.server.wm.AppWindowToken.<init>(AppWindowToken.java:349)
com.android.server.wm.ActivityRecord.createAppWindow(ActivityRecord.java:1216)
com.android.server.wm.ActivityRecord.createAppWindowToken(ActivityRecord.java:1149)
com.android.server.wm.ActivityStack.startActivityLocked(ActivityStack.java:3565)
com.android.server.wm.ActivityStarter.startActivityUnchecked(ActivityStarter.java:1928)
com.android.server.wm.ActivityStarter.startActivity(ActivityStarter.java:1608)
com.android.server.wm.ActivityStarter.startActivity(ActivityStarter.java:1004)
com.android.server.wm.ActivityStarter.startActivity(ActivityStarter.java:608)
com.android.server.wm.ActivityStarter.startActivityMayWait(ActivityStarter.java:1502)
com.android.server.wm.ActivityStarter.execute(ActivityStarter.java:539)
com.android.server.wm.ActivityTaskManagerService.startActivityAsUser(ActivityTaskManagerService.java:1264)
com.android.server.wm.ActivityTaskManagerService.startActivityAsUser(ActivityTaskManagerService.java:1238)
com.android.server.wm.ActivityTaskManagerService.startActivity(ActivityTaskManagerService.java:1215)
android.app.IActivityTaskManager$Stub.onTransact(IActivityTaskManager.java:1866)
android.os.Binder.execTransactInternal(Binder.java:1021)
android.os.Binder.execTransact(Binder.java:994)

3 调用过程简单分析:

接上面分析:
ActivityRecord.createAppWindow

AppWindowToken createAppWindow(WindowManagerService service, IApplicationToken token,
        boolean voiceInteraction, DisplayContent dc, long inputDispatchingTimeoutNanos,
        boolean fullscreen, boolean showForAllUsers, int targetSdk, int orientation,
        int rotationAnimationHint, boolean launchTaskBehind,
        boolean alwaysFocusable) {
    return new AppWindowToken(service, token, mActivityComponent, voiceInteraction, dc,
            inputDispatchingTimeoutNanos, fullscreen, showForAllUsers, targetSdk, orientation,
            rotationAnimationHint, launchTaskBehind, alwaysFocusable,
            this);
}

添加window(DecorView@1e0ebb5[messaging])

1 添加日志:
WindowManagerService.addWindow的日志添加
frameworks\base\services\core\java\com\android\server\wm\WindowManagerService.java

public int addWindow(Session session, IWindow client, int seq,
        LayoutParams attrs, int viewVisibility, int displayId, Rect outFrame,
        Rect outContentInsets, Rect outStableInsets, Rect outOutsets,
        DisplayCutout.ParcelableWrapper outDisplayCutout, InputChannel outInputChannel,
        InsetsState outInsetsState) {

2 调用过程:

com.android.server.wm.WindowManagerService.addWindow(WindowManagerService.java:1359)
com.android.server.wm.Session.addToDisplay(Session.java:159)
android.view.ViewRootImpl.setView(ViewRootImpl.java:934)
android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:390)
android.view.WindowManagerImpl.addView(WindowManagerImpl.java:98)
com.android.server.policy.PhoneWindowManager.addSplashScreen(PhoneWindowManager.java:2826)
com.android.server.wm.SplashScreenStartingData.createStartingSurface(SplashScreenStartingData.java:56)
com.android.server.wm.AppWindowToken$1.run(AppWindowToken.java:2259)
android.os.Handler.handleCallback(Handler.java:883)
android.os.Handler.dispatchMessage(Handler.java:100)
android.os.Looper.loop(Looper.java:221)
android.os.HandlerThread.run(HandlerThread.java:67)
com.android.server.ServiceThread.run(ServiceThread.java:44)

3 调用过程简单分析:

接上面分析:
AppWindowToken$1.run

private final Runnable mAddStartingWindow = new Runnable() {

    @Override
    public void run() {
        // Can be accessed without holding the global lock
        final StartingData startingData;
        synchronized (mWmService.mGlobalLock) {
            // There can only be one adding request, silly caller!
            mWmService.mAnimationHandler.removeCallbacks(this);

            if (mStartingData == null) {
                // Animation has been canceled... do nothing.
                if (DEBUG_STARTING_WINDOW) {
                    Slog.v(TAG, "startingData was nulled out before handling"
                            + " mAddStartingWindow: " + AppWindowToken.this);
                }
                return;
            }
            startingData = mStartingData;
        }

        if (DEBUG_STARTING_WINDOW) {
            Slog.v(TAG, "Add starting " + this + ": startingData=" + startingData);
        }

        WindowManagerPolicy.StartingSurface surface = null;
        try {
            surface = startingData.createStartingSurface(AppWindowToken.this);

SplashScreenStartingData.createStartingSurface

StartingSurface createStartingSurface(AppWindowToken atoken) {
    return mService.mPolicy.addSplashScreen(atoken.token, mPkg, mTheme, mCompatInfo,
            mNonLocalizedLabel, mLabelRes, mIcon, mLogo, mWindowFlags,
            mMergedOverrideConfiguration, atoken.getDisplayContent().getDisplayId());
}

PhoneWindowManager.addSplashScreen

public StartingSurface addSplashScreen(IBinder appToken, String packageName, int theme,
        CompatibilityInfo compatInfo, CharSequence nonLocalizedLabel, int labelRes, int icon,
        int logo, int windowFlags, Configuration overrideConfig, int displayId) {
    ....
        params.setTitle("Splash Screen " + packageName);
        addSplashscreenContent(win, context);

        wm = (WindowManager) context.getSystemService(WINDOW_SERVICE);
        view = win.getDecorView();

        if (DEBUG_SPLASH_SCREEN) Slog.d(TAG, "Adding splash screen window for "
            + packageName + " / " + appToken + ": " + (view.getParent() != null ? view : null));

        wm.addView(view, params);

WindowManagerImpl.addView

public void addView(@NonNull View view, @NonNull ViewGroup.LayoutParams params) {
    android.util.SeempLog.record_vg_layout(383,params);
    applyDefaultToken(params);
    mGlobal.addView(view, params, mContext.getDisplay(), mParentWindow);
}

WindowManagerGlobal.addView

public void addView(View view, ViewGroup.LayoutParams params,
        Display display, Window parentWindow) {
    ....
    ViewRootImpl root;
    ....
    root = new ViewRootImpl(view.getContext(), display);
    view.setLayoutParams(wparams);
    mViews.add(view);
    mRoots.add(root);
    mParams.add(wparams);

    // do this last because it fires off messages to start doing things
    try {
        root.setView(view, wparams, panelParentView);

ViewRootImpl.setView

/**
 * We have one child
 */
public void setView(View view, WindowManager.LayoutParams attrs, View panelParentView) {
....
    res = mWindowSession.addToDisplay(mWindow, mSeq, mWindowAttributes,
            getHostVisibility(), mDisplay.getDisplayId(), mTmpFrame,
            mAttachInfo.mContentInsets, mAttachInfo.mStableInsets,
            mAttachInfo.mOutsets, mAttachInfo.mDisplayCutout, mInputChannel,
            mTempInsets);
    setFrame(mTmpFrame);

Session.addToDisplay

public int addToDisplay(IWindow window, int seq, WindowManager.LayoutParams attrs,
        int viewVisibility, int displayId, Rect outFrame, Rect outContentInsets,
        Rect outStableInsets, Rect outOutsets,
        DisplayCutout.ParcelableWrapper outDisplayCutout, InputChannel outInputChannel,
        InsetsState outInsetsState) {
    return mService.addWindow(this, window, seq, attrs, viewVisibility, displayId, outFrame,
            outContentInsets, outStableInsets, outOutsets, outDisplayCutout, outInputChannel,
            outInsetsState);
}

WindowManagerService.addWindow

public int addWindow(Session session, IWindow client, int seq,
        LayoutParams attrs, int viewVisibility, int displayId, Rect outFrame,
        Rect outContentInsets, Rect outStableInsets, Rect outOutsets,
        DisplayCutout.ParcelableWrapper outDisplayCutout, InputChannel outInputChannel,
        InsetsState outInsetsState) {

WindowManagerService.updateFocusedWindowLocked

1 添加日志:
WindowManagerService.updateFocusedWindowLocked的日志添加
frameworks\base\services\core\java\com\android\server\wm\WindowManagerService.java

boolean updateFocusedWindowLocked(int mode, boolean updateInputWindows) {
    Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "wmUpdateFocus");
    boolean changed = mRoot.updateFocusedWindowLocked(mode, updateInputWindows);

2 调用过程:

com.android.server.wm.WindowManagerService.updateFocusedWindowLocked(WindowManagerService.java:5595)
com.android.server.wm.ActivityDisplay.setFocusedApp(ActivityDisplay.java:1466)
com.android.server.wm.ActivityTaskManagerService.setResumedActivityUncheckLocked(ActivityTaskManagerService.java:5878)
com.android.server.wm.ActivityStack.onActivityStateChanged(ActivityStack.java:605)
com.android.server.wm.TaskRecord.onActivityStateChanged(TaskRecord.java:2007)
com.android.server.wm.ActivityRecord.setState(ActivityRecord.java:1920)
com.android.server.wm.ActivityStack.minimalResumeActivityLocked(ActivityStack.java:1698)
com.android.server.wm.ActivityStackSupervisor.realStartActivityLocked(ActivityStackSupervisor.java:942)
com.android.server.wm.ActivityStackSupervisor.startSpecificActivityLocked(ActivityStackSupervisor.java:1009)
com.android.server.wm.ActivityStack.resumeTopActivityInnerLocked(ActivityStack.java:3404)
com.android.server.wm.ActivityStack.resumeTopActivityUncheckedLocked(ActivityStack.java:2906)
com.android.server.wm.RootActivityContainer.resumeFocusedStacksTopActivities(RootActivityContainer.java:1189)
com.android.server.wm.ActivityStack.completePauseLocked(ActivityStack.java:2050)
com.android.server.wm.ActivityStack.activityPausedLocked(ActivityStack.java:1977)
com.android.server.wm.ActivityTaskManagerService.activityPaused(ActivityTaskManagerService.java:1925)
android.app.IActivityTaskManager$Stub.onTransact(IActivityTaskManager.java:2361)
android.os.Binder.execTransactInternal(Binder.java:1021)
android.os.Binder.execTransact(Binder.java:994)

3 调用过程简单分析:
接上面分析:

ActivityTaskManagerService.activityPaused

public final void activityPaused(IBinder token) {
    final long origId = Binder.clearCallingIdentity();
    synchronized (mGlobalLock) {
        ActivityStack stack = ActivityRecord.getStackLocked(token);
        if (stack != null) {
            stack.activityPausedLocked(token, false);

ActivityStack.activityPausedLocked

final void activityPausedLocked(IBinder token, boolean timeout) {
	....
	completePauseLocked(true /* resumeNext */, null /* resumingActivity */);

ActivityStack.completePauseLocked

private void completePauseLocked(boolean resumeNext, ActivityRecord resuming) {
	....
	mRootActivityContainer.resumeFocusedStacksTopActivities(topStack, prev, null);

RootActivityContainer.resumeFocusedStacksTopActivities

boolean resumeFocusedStacksTopActivities(
            ActivityStack targetStack, ActivityRecord target, ActivityOptions targetOptions) {
    if (targetStack != null && (targetStack.isTopStackOnDisplay()
            || getTopDisplayFocusedStack() == targetStack)) {
        result = targetStack.resumeTopActivityUncheckedLocked(target, targetOptions);
    }

ActivityStack.resumeTopActivityUncheckedLocked

boolean resumeTopActivityUncheckedLocked(ActivityRecord prev, ActivityOptions options) {
	....
	mInResumeTopActivity = true;
    result = resumeTopActivityInnerLocked(prev, options);

ActivityStack.resumeTopActivityInnerLocked

private boolean resumeTopActivityInnerLocked(ActivityRecord prev, ActivityOptions options) {
	.....
	if (DEBUG_STATES) Slog.d(TAG_STATES, "resumeTopActivityLocked: Restarting " + next);
     mStackSupervisor.startSpecificActivityLocked(next, true, true);

ActivityStackSupervisor.startSpecificActivityLocked

void startSpecificActivityLocked(ActivityRecord r, boolean andResume, boolean checkConfig) {
	....
	realStartActivityLocked(r, wpc, andResume, checkConfig);

ActivityStackSupervisor.realStartActivityLocked

boolean realStartActivityLocked(ActivityRecord r, WindowProcessController proc,
        boolean andResume, boolean checkConfig) throws RemoteException {
    ....
    // 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);

ActivityStack.minimalResumeActivityLocked

void minimalResumeActivityLocked(ActivityRecord r) {
    if (DEBUG_STATES) Slog.v(TAG_STATES, "Moving to RESUMED: " + r + " (starting new instance)"
            + " callers=" + Debug.getCallers(5));
    r.setState(RESUMED, "minimalResumeActivityLocked");
    r.completeResumeLocked();

ActivityRecord.setState

void setState(ActivityState state, String reason) {
	....
	if (parent != null) {
        parent.onActivityStateChanged(this, state, reason);
    }

TaskRecord.onActivityStateChanged

/**
 * This should be called when an child activity changes state. This should only
 * be called from
 * {@link ActivityRecord#setState(ActivityState, String)} .
 * @param record The {@link ActivityRecord} whose state has changed.
 * @param state The new state.
 * @param reason The reason for the change.
 */
void onActivityStateChanged(ActivityRecord record, ActivityState state, String reason) {
    final ActivityStack parent = getStack();

    if (parent != null) {
        parent.onActivityStateChanged(record, state, reason);
    }
}

ActivityStack.onActivityStateChanged

void onActivityStateChanged(ActivityRecord record, ActivityState state, String reason) {
	....
    setResumedActivity(record, reason + " - onActivityStateChanged");
    if (record == mRootActivityContainer.getTopResumedActivity()) {
        // TODO(b/111361570): Support multiple focused apps in WM
        mService.setResumedActivityUncheckLocked(record, reason);
    }
    mStackSupervisor.mRecentTasks.add(record.getTaskRecord());

ActivityTaskManagerService.setResumedActivityUncheckLocked

/** Update AMS states when an activity is resumed. */
void setResumedActivityUncheckLocked(ActivityRecord r, String reason) {
	....
    mLastResumedActivity = r;
    r.getDisplay().setFocusedApp(r, true);

ActivityDisplay.setFocusedApp

void setFocusedApp(ActivityRecord r, boolean moveFocusNow) {
	....
    final AppWindowToken newFocus;
	....
    newFocus = mService.mWindowManager.mRoot.getAppWindowToken(token);
	....
    final boolean changed = mDisplayContent.setFocusedApp(newFocus);
    if (moveFocusNow && changed) {
        mService.mWindowManager.updateFocusedWindowLocked(UPDATE_FOCUS_NORMAL,
                true /*updateInputWindows*/);
    }

WindowManagerService.updateFocusedWindowLocked

boolean updateFocusedWindowLocked(int mode, boolean updateInputWindows) {
	....
    boolean changed = mRoot.updateFocusedWindowLocked(mode, updateInputWindows);

创建WindowState

1 添加日志:
WindowState.WindowState的日志添加
frameworks\base\services\core\java\com\android\server\wm\WindowState.java

WindowState(WindowManagerService service, Session s, IWindow c, WindowToken token,
        WindowState parentWindow, int appOp, int seq, WindowManager.LayoutParams a,
        int viewVisibility, int ownerId, boolean ownerCanAddInternalSystemWindow,
        PowerManagerWrapper powerManagerWrapper) {
    super(service);
    android.util.Slog.v("WindowState", "WindowState this:" + this);

2 调用过程:

WindowState: WindowState thisWindow{3c18d8f u0 null}
com.android.server.wm.WindowState.<init>(WindowState.java:758)
com.android.server.wm.WindowState.<init>(WindowState.java:739)
com.android.server.wm.WindowManagerService.addWindow(WindowManagerService.java:1563)
com.android.server.wm.Session.addToDisplay(Session.java:159)
android.view.ViewRootImpl.setView(ViewRootImpl.java:934)
android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:390)
android.view.WindowManagerImpl.addView(WindowManagerImpl.java:98)
com.android.server.policy.PhoneWindowManager.addSplashScreen(PhoneWindowManager.java:2826)
com.android.server.wm.SplashScreenStartingData.createStartingSurface(SplashScreenStartingData.java:56)
com.android.server.wm.AppWindowToken$1.run(AppWindowToken.java:2259)
android.os.Handler.handleCallback(Handler.java:883)
android.os.Handler.dispatchMessage(Handler.java:100)
android.os.Looper.loop(Looper.java:221)
android.os.HandlerThread.run(HandlerThread.java:67)
com.android.server.ServiceThread.run(ServiceThread.java:44)

3 调用过程简单分析:

接上面分析:
WindowManagerService.addWindow

public int addWindow(Session session, IWindow client, int seq,
        LayoutParams attrs, int viewVisibility, int displayId, Rect outFrame,
        Rect outContentInsets, Rect outStableInsets, Rect outOutsets,
        DisplayCutout.ParcelableWrapper outDisplayCutout, InputChannel outInputChannel,
        InsetsState outInsetsState) {
    ....
    //创建WindowState
    final WindowState win = new WindowState(this, session, client, token, parentWindow,
        appOp[0], seq, attrs, viewVisibility, session.mUid,
        session.mCanAddInternalSystemWindow);

WindowState.

WindowState(WindowManagerService service, Session s, IWindow c, WindowToken token,
        WindowState parentWindow, int appOp, int seq, WindowManager.LayoutParams a,
        int viewVisibility, int ownerId, boolean ownerCanAddInternalSystemWindow) {
    this(service, s, c, token, parentWindow, appOp, seq, a, viewVisibility, ownerId,
            ownerCanAddInternalSystemWindow, new PowerManagerWrapper() {
                @Override
                public void wakeUp(long time, @WakeReason int reason, String details) {
                    service.mPowerManager.wakeUp(time, reason, details);
                }

                @Override
                public boolean isInteractive() {
                    return service.mPowerManager.isInteractive();
                }
            });
}

WindowManagerService.updateFocusedWindowLocked

1 添加日志:
WindowManagerService.updateFocusedWindowLocked的日志添加
frameworks\base\services\core\java\com\android\server\wm\WindowManagerService.java

boolean updateFocusedWindowLocked(int mode, boolean updateInputWindows) {
    Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "wmUpdateFocus");
    boolean changed = mRoot.updateFocusedWindowLocked(mode, updateInputWindows);

2 调用过程:

com.android.server.wm.WindowManagerService.updateFocusedWindowLocked(WindowManagerService.java:5595)
com.android.server.wm.WindowManagerService.relayoutWindow(WindowManagerService.java:2349)
com.android.server.wm.Session.relayout(Session.java:194)
android.view.ViewRootImpl.relayoutWindow(ViewRootImpl.java:7227)
android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2348)
android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1791)
android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7895)
android.view.Choreographer$CallbackRecord.run(Choreographer.java:1041)
android.view.Choreographer.doCallbacks(Choreographer.java:864)
android.view.Choreographer.doFrame(Choreographer.java:798)
android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1026)
android.os.Handler.handleCallback(Handler.java:883)
android.os.Handler.dispatchMessage(Handler.java:100)
android.os.Looper.loop(Looper.java:221)
android.os.HandlerThread.run(HandlerThread.java:67)
com.android.server.ServiceThread.run(ServiceThread.java:44)

3 调用过程简单分析:
接上面分析:
Choreographer$FrameDisplayEventReceiver.run

private final class FrameDisplayEventReceiver extends DisplayEventReceiver
        implements Runnable {
	....
    @Override
    public void run() {
        mHavePendingVsync = false;
        doFrame(mTimestampNanos, mFrame);
    }

Choreographer.doFrame

void doFrame(long frameTimeNanos, int frame) {
....
    try {
        mIsDoFrameProcessing = true;
        Trace.traceBegin(Trace.TRACE_TAG_VIEW, "Choreographer#doFrame");
        AnimationUtils.lockAnimationClock(frameTimeNanos / TimeUtils.NANOS_PER_MS);

        mFrameInfo.markInputHandlingStart();
        doCallbacks(Choreographer.CALLBACK_INPUT, frameTimeNanos);

        mFrameInfo.markAnimationsStart();
        doCallbacks(Choreographer.CALLBACK_ANIMATION, frameTimeNanos);
        doCallbacks(Choreographer.CALLBACK_INSETS_ANIMATION, frameTimeNanos);

        mFrameInfo.markPerformTraversalsStart();
        doCallbacks(Choreographer.CALLBACK_TRAVERSAL, frameTimeNanos);

Choreographer.doCallbacks

void doCallbacks(int callbackType, long frameTimeNanos) {
....
    for (CallbackRecord c = callbacks; c != null; c = c.next) {
        if (DEBUG_FRAMES) {
            Log.d(TAG, "RunCallback: type=" + callbackType
                    + ", action=" + c.action + ", token=" + c.token
                    + ", latencyMillis=" + (SystemClock.uptimeMillis() - c.dueTime));
        }
        c.run(frameTimeNanos);

ViewRootImpl$TraversalRunnable.run

final class TraversalRunnable implements Runnable {
    @Override
    public void run() {
        doTraversal();

ViewRootImpl.doTraversal

void doTraversal() {
....
	performTraversals();

ViewRootImpl.performTraversals

private void performTraversals() {
	....
	relayoutResult = relayoutWindow(params, viewVisibility, insetsPending);

ViewRootImpl.relayoutWindow

private int relayoutWindow(WindowManager.LayoutParams params, int viewVisibility,
        boolean insetsPending) throws RemoteException {
        ....
        int relayoutResult = mWindowSession.relayout(mWindow, mSeq, params,
            (int) (mView.getMeasuredWidth() * appScale + 0.5f),
            (int) (mView.getMeasuredHeight() * appScale + 0.5f), viewVisibility,
            insetsPending ? WindowManagerGlobal.RELAYOUT_INSETS_PENDING : 0, frameNumber,
            mTmpFrame, mPendingOverscanInsets, mPendingContentInsets, mPendingVisibleInsets,
            mPendingStableInsets, mPendingOutsets, mPendingBackDropFrame, mPendingDisplayCutout,
            mPendingMergedConfiguration, mSurfaceControl, mTempInsets);

Session.relayout

public int relayout(IWindow window, int seq, WindowManager.LayoutParams attrs,
        int requestedWidth, int requestedHeight, int viewFlags, int flags, long frameNumber,
        Rect outFrame, Rect outOverscanInsets, Rect outContentInsets, Rect outVisibleInsets,
        Rect outStableInsets, Rect outsets, Rect outBackdropFrame,
        DisplayCutout.ParcelableWrapper cutout, MergedConfiguration mergedConfiguration,
        SurfaceControl outSurfaceControl, InsetsState outInsetsState) {
    ....
    int res = mService.relayoutWindow(this, window, seq, attrs,
        requestedWidth, requestedHeight, viewFlags, flags, frameNumber,
        outFrame, outOverscanInsets, outContentInsets, outVisibleInsets,
        outStableInsets, outsets, outBackdropFrame, cutout,
        mergedConfiguration, outSurfaceControl, outInsetsState);

WindowManagerService.relayoutWindow

public int relayoutWindow(Session session, IWindow client, int seq, LayoutParams attrs,
        int requestedWidth, int requestedHeight, int viewVisibility, int flags,
        long frameNumber, Rect outFrame, Rect outOverscanInsets, Rect outContentInsets,
        Rect outVisibleInsets, Rect outStableInsets, Rect outOutsets, Rect outBackdropFrame,
        DisplayCutout.ParcelableWrapper outCutout, MergedConfiguration mergedConfiguration,
        SurfaceControl outSurfaceControl, InsetsState outInsetsState) {
    ....
    if (focusMayChange) {
       if (updateFocusedWindowLocked(UPDATE_FOCUS_NORMAL, true /*updateInputWindows*/)) {
           imMayMove = false;
       }
   }

WindowManagerService.updateFocusedWindowLocked

boolean updateFocusedWindowLocked(int mode, boolean updateInputWindows) {
....
    boolean changed = mRoot.updateFocusedWindowLocked(mode, updateInputWindows);

添加window(DecorView@d0f2db9[ConversationListActivity])

1 添加日志:
ViewRootImpl.setView的日志添加
frameworks\base\core\java\android\view\ViewRootImpl.java

public void setView(View view, WindowManager.LayoutParams attrs, View panelParentView) {
    android.util.Slog.v("ViewRootImpl", "setView view:" + view);
    android.util.Slog.v("ViewRootImpl", "setView this:" + this);

2 调用过程:

android.view.ViewRootImpl.setView(ViewRootImpl.java:823)
android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:390)
android.view.WindowManagerImpl.addView(WindowManagerImpl.java:98)
android.app.ActivityThread.handleResumeActivity(ActivityThread.java:4375)
android.app.servertransaction.ResumeActivityItem.execute(ResumeActivityItem.java:52)
android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:176)
android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:97)
android.app.ActivityThread$H.handleMessage(ActivityThread.java:2027)
android.os.Handler.dispatchMessage(Handler.java:107)
android.os.Looper.loop(Looper.java:221)
android.app.ActivityThread.main(ActivityThread.java:7572)
java.lang.reflect.Method.invoke(Native Method)
com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:935)

3 调用过程简单分析:

接上面分析:
TransactionExecutor.execute

public void execute(ClientTransaction transaction) {
	....
	executeLifecycleState(transaction);

TransactionExecutor.executeLifecycleState

/** Transition to the final state if requested by the transaction. */
private void executeLifecycleState(ClientTransaction transaction) {
....
    // Execute the final transition with proper parameters.
    lifecycleItem.execute(mTransactionHandler, token, mPendingActions);

ResumeActivityItem.execute

public void execute(ClientTransactionHandler client, IBinder token,
        PendingTransactionActions pendingActions) {
    Trace.traceBegin(TRACE_TAG_ACTIVITY_MANAGER, "activityResume");
    client.handleResumeActivity(token, true /* finalStateRequest */, mIsForward,
            "RESUME_ACTIVITY");

ActivityThread.handleResumeActivity

public void handleResumeActivity(IBinder token, boolean finalStateRequest, boolean isForward,
        String reason) {
    ....
        if (r.window == null && !a.mFinished && willBeVisible) {
        r.window = r.activity.getWindow();
        View decor = r.window.getDecorView();
        decor.setVisibility(View.INVISIBLE);
        ViewManager wm = a.getWindowManager();
        WindowManager.LayoutParams l = r.window.getAttributes();
        a.mDecor = decor;
        l.type = WindowManager.LayoutParams.TYPE_BASE_APPLICATION;
        l.softInputMode |= forwardBit;
        if (r.mPreserveWindow) {
            a.mWindowAdded = true;
            r.mPreserveWindow = false;
            // Normally the ViewRoot sets up callbacks with the Activity
            // in addView->ViewRootImpl#setView. If we are instead reusing
            // the decor view we have to notify the view root that the
            // callbacks may have changed.
            ViewRootImpl impl = decor.getViewRootImpl();
            if (impl != null) {
                impl.notifyChildRebuilt();
            }
        }
        if (a.mVisibleFromClient) {
            if (!a.mWindowAdded) {
                a.mWindowAdded = true;
                wm.addView(decor, l);

WindowManagerImpl.addView

public void addView(@NonNull View view, @NonNull ViewGroup.LayoutParams params) {
    ....
    mGlobal.addView(view, params, mContext.getDisplay(), mParentWindow);
}

WindowManagerGlobal.addView

public void addView(View view, ViewGroup.LayoutParams params,
        Display display, Window parentWindow) {
    ....
    root = new ViewRootImpl(view.getContext(), display);
    view.setLayoutParams(wparams);
    mViews.add(view);
    mRoots.add(root);
    mParams.add(wparams);
    // do this last because it fires off messages to start doing things
    try {
        root.setView(view, wparams, panelParentView);

ViewRootImpl.setView

public void setView(View view, WindowManager.LayoutParams attrs, View panelParentView) {

创建WindowState

这部分和上面完全一样:

参考资料

1.startActivity启动过程分析
http://gityuan.com/2016/03/12/start-activity/
2.以Window视角来看startActivity
http://gityuan.com/2017/01/22/start-activity-wms/
3.android开发浅谈之App启动过程
https://blog.csdn.net/hfreeman2008/article/details/112134467?spm=1001.2014.3001.5501

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hfreeman2008

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值