失眠必读系列——Activity 启动流程

283 阅读2分钟

注:基于AndroidQ-10.0-API29

WechatIMG203.png

Launcher点击app icon

LauncherActivity.java

startActivity

Activity.java

startActivity
startActivityForResult

Instrumentation.java

execStartActivity
ActivityTaskManager.getService().startActivity

这里拿到ATMS在客户端的代理对象ActivityTaskManagerProxy,由此进入服务端System Server进程的ATMS服务


AMS通知Launcher进入pause

ActivityTaskManagerService.java

startActivity
startActivityAsUser
startActivityAsUser

ActivityStarter.java

execute
startActivityMayWait
startActivity
startActivity
startActivity
startActivityUnchecked

ActivityStack.java

resumeTopActivityUncheckedLocked
resumeTopActivityInnerLocked
startPausingLocked

ClientLifecycleManager.java

scheduleTransaction(…PauseActivityItem…)

ClientTransaction.java

schedule

这里拿到ApplicationThread在服务端的代理对象ApplicationThreadProxy,由此进入客户端Launcher进程


ActivityThread.java / ApplicationThread内部类

scheduleTransaction

ClientTransactionHandler.java

scheduleTransaction
sendMessage(ActivityThread.H.EXECUTE_TRANSACTION, transaction);

ActivityThread.java

mH.sendMessage(msg);
mTransactionExecutor.execute(transaction);

TransactionExecutor.java

execute
executeCallbacks
item.execute

PauseActivityItem.java

execute
client.handlePauseActivity

ActivityThread.java

handlePauseActivity
performPauseActivity
performPauseActivityIfNeeded
mInstrumentation.callActivityOnPause

Instrumentation.java

callActivityOnPause
activity.performPause

Activity.java

performPause
onPause

TransactionExecutor.java

item.postExecute

PauseActivityItem.java

postExecute
ActivityTaskManager.getService().activityPaused(token)

这里拿到ATMS在客户端的代理对象ActivityTaskManagerProxy,由此进入服务端System Server进程的ATMS服务


Launcher通知AMS其进入pause后,AMS通知Zygote创建目标进程

ActivityTaskManagerService.java

activityPaused
stack.activityPausedLocked

ActivityStack.java

activityPausedLocke
completePauseLocked
mRootActivityContainer.resumeFocusedStacksTopActivities

RootActivityContainer.java

resumeFocusedStacksTopActivities

ActivityStack.java

resumeTopActivityUncheckedLocked
resumeTopActivityInnerLocked
mStackSupervisor.startSpecificActivityLocked

ActivityStackSupervisor.java

startSpecificActivityLocked
ActivityManagerInternal::startProcess

ActivityManagerService.java

class LocalService extends ActivityManagerInternal
startProcess
mProcessList.startProcessLocked

ProcessList.java

startProcessLocked
startProcessLocked
startProcessLocked
startProcessLocked
startProcess
Process.start

Process.java

ZYGOTE_PROCESS.start

ZygoteProcess.java

start
startViaZygote
zygoteSendArgsAndGetResult
attemptZygoteSendArgsAndGetResult
zygoteWriter.write(……)

Zygote进程fork出一个子进程,反射调用ActivityThread的main函数,至此目标进程启动


新进程启动,并通知AMS

ActivityThread.java

main
thread.attach(false, startSeq);
mgr.attachApplication(mAppThread, startSeq);

这里拿到AMS在客户端的代理对象ActivityManagerProxy,由此进入服务端System Server进程的AMS服务


AMS处理启动信息,并返回目标进程

ActivityManagerService.java

attachApplication
attachApplicationLocked
mAtmInternal.attachApplication

ActivityTaskManagerService.java

attachApplication
mRootActivityContainer.attachApplication

RootActivityContainer.java

mStackSupervisor.realStartActivityLocked
clientTransaction.addCallback(LaunchActivityItem.obtain(…), ….);
mService.getLifecycleManager().scheduleTransaction(clientTransaction);

ClientLifecycleManager.java

scheduleTransaction(…LaunchActivityItem…)

ClientTransaction.java

schedule

这里拿到ApplicationThread在服务端的代理对象ApplicationThreadProxy,由此进入客户端目标进程


目标进程收到启动通知,执行onCreate/onStart/onResume生命周期

ActivityThread.java / ApplicationThread内部类

scheduleTransaction

ClientTransactionHandler.java

scheduleTransaction
sendMessage(ActivityThread.H.EXECUTE_TRANSACTION, transaction);

ActivityThread.java

mH.sendMessage(msg);
mTransactionExecutor.execute(transaction);

TransactionExecutor.java

execute
executeCallbacks
item.execute

LaunchActivityItem.java

client.handleLaunchActivity

ActivityThread.java

handleLaunchActivity
performLaunchActivity

//1.创建activity
activity = mInstrumentation.newActivity(……)

//2.创建application,执行application的onCreate方法
app = mInstrumentation.newApplication(……)
instrumentation.callApplicationOnCreate(app)

//3.执行activity的onCreate方法
activity.attach(创建Phonewindow)
activity.setTheme
mInstrumentation.callActivityOnCreate

Instrumentation.java

activity.performCreate

Activity.java

onCreate
setContentView

PhoneWindow.java

installDecor()

自此onCreate走完,接下来看何时走onStart,我们回到前面的TransactionExecutor.java在execute方法中执行了executeCallbacks之后,即执行完onCreate之后,会继续执行executeLifecycleState方法,继续跟踪代码: TransactionExecutor.java

executeCallbacks(transaction);
executeLifecycleState(transaction);
cycleToPath
performLifecycleSequence

//当前状态ON_CREATE,final state为ON_RESUME
//得出这里进入ON_START
//执行完之后再进入ON_RESUME
for (int i = 0, state; i < size; i++) {
    ......
    switch (state) {
        case ON_CREATE:
            mTransactionHandler.handleLaunchActivity(r, mPendingActions,null);
            break;

        case ON_START:
            mTransactionHandler.handleStartActivity(r, mPendingActions);
            break;

        case ON_RESUME:
            mTransactionHandler.handleResumeActivity(r.token, false ,r.isForward, "LIFECYCLER_RESUME_ACTIVITY");
            break;

        ......
    }
}

目标进程进入ON_RESUME状态

1.执行onResume

//ActivityThread
performResumeActivity
r.activity.performResume

//Instrumentation
mInstrumentation.callActivityOnResume(this);

//Activity
activity.onResume();

2.addview

//ActivityThread
handleResumeActivity
wm.addView(decor, l);

//WindowManagerImpl
mGlobal.addView

//WindowManagerGlobal
root = new ViewRootImpl(view.getContext(), display);
root.setView(view, wparams, panelParentView);

//ViewRootImpl
requestLayout();
mWindowSession.addToDisplay

3.添加IdleHandler,通知Launcher进入stop

//ActivityThread
Looper.*myQueue*().addIdleHandler(new Idler());

//Idler implements MessageQueue.IdleHandler
am.activityIdle(a.token, a.createdConfig, stopProfiling);

//ATMS
mStackSupervisor.activityIdleInternalLocked

//ActivityStackSupervisor
stack.stopActivityLocked(r);

//ActivityStack
mService.getLifecycleManager().scheduleTransaction(…StopActivityItem…);

//ClientLifecycleManager
scheduleTransaction(…StopActivityItem…)

//ClientTransaction
schedule

上同...

自此简单版的Activity启动分析完毕!


结尾

失眠必读系列未完待续,有任何错误,虚心讨教,欢迎指正...


参考资料:
www.jianshu.com/p/16e450f10…
blog.csdn.net/qian520ao/a…