【私人备忘录】Android P ActivityManagerService(一)Activity启动代码流程

一、Launcher通过AIDL通知ActivityManagerService,它要启动一个Activity;

Launcher.java
startActivitySafely() → startActivity()
Activity.java
startActivity() → startActivityForResult(mInstrumentation.execStartActivity())
Instrumentation.java
execStartActivity(ActivityManager.getService().startActivity())
ActivityManagerService.java
startActivity() → startActivityAsUser()
ActivityStarter.java
execute() → startActivityMayWait(int res = startActivity()) → startActivity(mLastStartActivityResult = startActivity()) → startActivity(result = startActivityUnchecked()) → startActivityUnchecked(mSupervisor.resumeFocusedStackTopActivityLocked())
ActivityStackSupervisor.java
resumeFocusedStackTopActivityLocked()
ActivityStack.java
resumeTopActivityUncheckedLocked(result = resumeTopActivityInnerLocked()) → resumeTopActivityInnerLocked(pausing |= startPausingLocked()) → startPausingLocked()

备注:
1、ActivityManager使用AIDL调用ActivityManagerService,老版本是直接调用Binder。

二、ActivityManagerService通过AIDL通知Launcher进入Paused状态;

ActivityStack.java
startPausingLocked(mService.getLifecycleManager().scheduleTransaction())
ClientLifecycleManager.java
scheduleTransaction(transactionWithState()) → scheduleTransaction(transaction.schedule())
ClientTransaction.java
schedule(mClient.scheduleTransaction(this))
ActivityThread.java
scheduleTransaction(ActivityThread.this.scheduleTransaction())
ClientTransactionHandler.java
scheduleTransaction(sendMessage(ActivityThread.H.EXECUTE_TRANSACTION, transaction))
ActivityThread.java
handleMessage(case EXECUTE_TRANSACTION)
TransactionExecutor.java
execute(executeLifecycleState(transaction))
1、lifecycleItem.execute(mTransactionHandler, token, mPendingActions) → PauseActivityItem.execute()→ ClientTransactionHandler.handlePauseActivity()
2、lifecycleItem.postExecute(mTransactionHandler, token, mPendingActions) → PauseActivityItem.postExecute(ActivityManager.getService().activityPaused(token))
ActivityThread.java
handlePauseActivity(performPauseActivity()) → performPauseActivityIfNeeded(mInstrumentation.callActivityOnPause())
Instrumentation.java
callActivityOnPause(activity.performPause())
Activity.java
performPause() → onPause()

备注:
1、mClient是IApplicationThread,ActivityThread中ApplicationThread extends IApplicationThread.Stub
2、lifecycleItem是从startPausingLocked中传入的PauseActivityItem.obtain(prev.finishing, userLeaving, prev.configChangeFlags, pauseImmediately)

三、Launcher通过AIDL通知ActivityManagerService它已经Pause了,于是ActivityManagerService就创建一个新的进程,用来启动一个ActivityThread实例,即将要启动的Activity就是在这个ActivityThread实例中运行

ActivityManager.getService().activityPaused(token)
ActivityManagerService.java
activityPaused(stack.activityPausedLocked())
ActivityStack.java
activityPausedLocked(completePauseLocked(true, null)) → completePauseLocked(mStackSupervisor.resumeFocusedStackTopActivityLocked())
ActivityStackSupervisor.java
resumeFocusedStackTopActivityLocked(return targetStack.resumeTopActivityUncheckedLocked())
ActivityStack.java
resumeTopActivityUncheckedLocked() → resumeTopActivityInnerLocked(mStackSupervisor.startSpecificActivityLocked(next, true, true))
ActivityStackSupervisor.java
startSpecificActivityLocked(mService.startProcessLocked())
ActivityManagerService.java
startProcessLocked() → startProcess(startResult = Process.start())
Process.java
start(return zygoteProcess.start())
ZygoteProcess.java
start() → startViaZygote() → zygoteSendArgsAndGetResult()
ActivityThread.java
main()

备注:
1、startProcessLocked方法中关键代码:
final String entryPoint = "android.app.ActivityThread";
return startProcessLocked(hostingType, hostingNameStr, entryPoint, app, uid, gids,
                    runtimeFlags, mountExternal, seInfo, requiredAbi, instructionSet, invokeWith,
                    startTime);
2、zygoteSendArgsAndGetResult函数通过socket和zygote进程搞来搞去,不是这篇重点,根据当年传入的参数,接着要走ActivityThread的main函数了

四、ActivityThread通过AIDL将一个ApplicationThread类型的Binder对象传递给ActivityManagerService,以便以后ActivityManagerService能够通过这个Binder对象和它进行通信

ActivityThread.java
main(thread.attach(false, startSeq)) → attach(mgr.attachApplication(mAppThread, startSeq))
ActivityManagerService.java
attachApplication() → attachApplicationLocked(mStackSupervisor.attachApplicationLocked(app))

五、ActivityManagerService通过AIDL通知ActivityThread,现在一切准备就绪,它可以真正执行Activity的启动操作了。

ActivityStackSupervisor.java
attachApplicationLocked() → realStartActivityLocked(mService.getLifecycleManager().scheduleTransaction(clientTransaction))
ActivityThread.java
scheduleTransaction(ActivityThread.this.scheduleTransaction())
ClientTransactionHandler.java
scheduleTransaction(sendMessage(ActivityThread.H.EXECUTE_TRANSACTION, transaction))
ActivityThread.java
handleMessage(case EXECUTE_TRANSACTION)
TransactionExecutor.java
execute(executeCallbacks(transaction) && executeLifecycleState(transaction))
1、executeCallbacks()
LaunchActivityItem.execute(ActivityThread.handleLaunchAcitivity(final Activity a = performLaunchActivity(r, customIntent)))
ActivityThread.java
performLaunchActivity(mInstrumentation.callActivityOnCreate())
Instrumentation.java
callActivityOnCreate(activity.performCreate(icicle, persistentState))
Activity.java
performCreate() → onCreate()
2、executeLifecycleState()

备注:
1、realStartActivityLocked中的scheduleTransaction中的mClient是与系统进程通信的服务端,即ActivityThread.ApplicationThread,即此处调用的是ActivityThread.ApplicationThread.scheduleTransaction
2、executeCallbacks中的lifecycleItem是realStartActivityLocked中加入的clientTransaction.addCallback(LaunchActivityItem.obtain())
3、executeLifecycleState中先执行cycleToPath走onStart流程,然后onResume等等,由于本文主要记载activity启动过程AMS的运转,所以到onCreate就行了。
4、ActivityThread继承了ClientTransactionHandler,将原先放在ActivityThread里面的handleLaunchActivity、handlerStartActivity等等抽取出来,放到ClientTransactionHandler类中,作为抽象方法。
5、新增了:
ClientLifecycleManager:作为ActivityStackSupervisor和ClientTransaction的桥梁
ClientTransactionHandler: 由ActivityThread实现。
ClientTransaction:管理ClientTransactionItem
TransactionExecutor:执行ClientTransactionItem
TransactionExecutorHelper:协助TransactionExecutor执行ClientTransactionItem
ClientTransactionItem:真正执行生命周期的类,每一个生命周期对应一个Item

发布了15 篇原创文章 · 获赞 107 · 访问量 19万+

猜你喜欢

转载自blog.csdn.net/llleahdizon/article/details/89947580