Activity启动流程
Activity启动流程
前言
Activity的启动分为两种
- Activity中通过startActivity()方法启动一个Activity
- 从桌面通过点击应用图标启动一个APP然后显示Activity
重点关注以下几个类的源码:
- ActivityStarter
- ActivityStackSupervisor
- ActivityStack
- ActivityManagerService
- ActivityThread
重点关注以下方法:
- ActivityStarter.execute()
- ActivityStackSupervisor.realStartActivityLocked()
- ActivityStack.resumeTopActivityUncheckedLocked()
- ActivityThread.handleLaunchActivity()
一、Launcher向AMS发送启动Activity
Launcher进程通过点击图标生成Intent,然后调用startActivity()方法
startActivity()最终会调用到Instrumentation的execStartActivity()方法
在execStartActivity()中,会通过Binder IPC调用ATMS(ActivityTaskManagerService)的startActivity()方法
具体的Binder调用过程是:获取IActivityTaskManager的单例对象
- 获取IActivityTaskManager的单例对象
1 | IActivityTaskManager.Stub.asInterface(ServiceManager.getService(Context.ACTIVITY_TASK_SERVICE)) |
- 通过该Binder代理对象调用ATMS的startActivity()方法
Launcher
Launcher本身是一个Activity,在用户点击应用图标时,调用startActivitySafely方法,最后调用到Activity.startActivity(),函数调用如下
1 | // Launcher.java |
Activity
继续在Activity当中调用
1 | // Activity.java |
Instrumentation
Instrumentation.execStartActivity()函数中传入了mMainThread.getApplicationThread(),它获取到的是ActivityThread的内部类ApplicationThread,这是一个Binder对象,之后AMS通过此对象与App的通信。
1 | // Instrumentation.java |
ActivityTaskManager
1 | // ActivityTaskManager.java |
这是一个使用Singleton模式的私有静态常量,用于确保IActivityTaskManager只有一个实例。
- Singleton模式: 使用Singleton
确保IActivityTaskManager服务只有一个实例,这有助于节省系统资源并保证一致性。 - 延迟初始化: 服务实例不是在类加载时就创建的,而是在首次调用get()方法时才会创建,这是延迟初始化的一个例子。
- ServiceManager: 使用ServiceManager.getService(Context.ACTIVITY_TASK_SERVICE)获取系统级的ACTIVITY_TASK_SERVICE服务。
- AIDL: IActivityTaskManager.Stub.asInterface(b)是典型的AIDL(Android接口定义语言)用法,用于跨进程通信。它将IBinder对象转换为IActivityTaskManager接口。
工作流程
- 当调用ActivityTaskManager.getService()时,它会返回IActivityTaskManagerSingleton的实例。
- 如果是首次调用,Singleton会调用create()方法:通过ServiceManager获取ACTIVITY_TASK_SERVICE的IBinder对象。将IBinder对象转换为IActivityTaskManager接口。
- 后续调用会直接返回已创建的实例,无需重新创建。
二、AMS启动Activity并通知Launcher进入Paused状态
ActivityTaskManagerService
1 | // ActivityTaskManagerService.java |
ActivityStartController
1 | public class ActivityStartController { |
ActivityStarter
1 | class ActivityStarter { |
- execute() 方法:
这是ActivityStarter的入口方法。它根据mRequest.mayWait决定调用startActivityMayWait()还是startActivity()。通常情况下,我们关注不需要等待的情况,即调用startActivity()。 - startActivity() 方法 (1️⃣和2️⃣):
这里有两个重载的startActivity方法。它们处理不同的参数,但最终都会调用到第三个startActivity方法。 - startActivity() 方法 (3️⃣):
这个方法进一步处理启动Activity的请求,并调用下一个startActivity方法。 - startActivity() 方法 (4️⃣):
这个方法创建ActivityRecord对象(如果还没有的话),并调用startActivityUnchecked()。 - startActivityUnchecked() 方法 (5️⃣):
这是实际启动Activity的核心方法。它执行以下关键步骤:setInitialState(): 设置初始状态computeLaunchingTaskFlags() (6️⃣): 计算启动任务的标志computeSourceStack() (7️⃣): 计算源栈getReusableIntentActivity(): 尝试复用已存在的ActivitymRootActivityContainer.resumeFocusedStacksTopActivities() (8️⃣): 恢复焦点栈的顶部Activity - computeLaunchingTaskFlags() (6️⃣):
这个方法计算启动任务的标志,决定新Activity如何与现有任务交互。 - computeSourceStack() (7️⃣):
计算源栈,确定新Activity应该放在哪个任务栈中。 - resumeFocusedStacksTopActivities() (8️⃣):
这个方法负责恢复焦点栈的顶部Activity,实际上是将新启动的Activity带到前台。
RootActivityContainer
1 | class RootActivityContainer extends ConfigurationContainer |
ActivityStack
1 | class ActivityStack extends ConfigurationContainer { |
ActivityStackSupervisor
1 | public class ActivityStackSupervisor implements RecentTasks.Callbacks { |
标注1️⃣调用的其实是 ActivityManagerService内部类LocalService 的startProcess 方法,开始创建进程
1 | public class ActivityManagerService extends IActivityManager.Stub |
标注1️⃣调用:LocalService.startProcessLocked 方法。
在 LocalService.startProcessLocked 方法中又把进程创建的工作委派给了 ProcessList。
标注2️⃣调用:ProcessList的startProcessLocked方法
ProcessList
1 | public final class ProcessList { |
标注9️⃣ : 创建AppZygote
标注8️⃣: 启动新的进程,入口是:ActivityThread.main(), 其中appZygote.getProcess()获取的是ChildZygoteProcess这个对象,ChildZygoteProcess又是ZygoteProcess的子类,也即是最终会调用ZygoteProcess.start方法
ZygoteProcess
1 | public class ZygoteProcess { |
此时还处于 system_server进程,这个类的目的是创建本地的 Socket 连接对象,连接到 Zygote 进程的 Socket 方法,然后通过字符输入流,把创建进程所需要的参数发送过去。
三、Zygote 进程接收请求并创建 Launcher 进程
有空再说
插曲
ATMS(ActivityTaskManagerService)和AMS(ActivityManagerService)之间的关系:
历史背景:在Android 10之前,AMS负责管理所有四大组件(Activity、Service、BroadcastReceiver和ContentProvider)以及进程生命周期。
职责分离:从Android 10开始,Google将Activity和Task相关的管理职责从AMS中分离出来,创建了ATMS。这样做的目的是为了优化系统性能和代码结构。
当前职责:ATMS: 主要负责Activity和Task的管理,包括Activity栈管理、生命周期控制等。AMS: 仍然负责管理Service、BroadcastReceiver、ContentProvider以及进程生命周期。
协作关系:ATMS和AMS紧密协作。例如,当需要启动一个新的Activity时,ATMS会处理Activity相关的逻辑,但可能需要AMS来处理进程创建等相关操作。
系统服务:两者都是系统级的服务,运行在system_server进程中。
接口变化:对于应用开发者来说,这种变化大多是透明的。但在系统层面,一些原本通过AMS进行的Activity相关操作现在需要通过ATMS来完成。
代码位置:ATMS: 位于
frameworks/base/services/core/java/com/android/server/wm/
目录下 AMS: 仍位于
frameworks/base/services/core/java/com/android/server/am/
目录下未来趋势:这种分离是为了更好地支持多窗口和折叠屏等新特性,也为未来可能的架构优化铺平了道路。
Activity启动流程概括
- 点击桌面App图标,Launcher进程采用Binder IPC向system_server(AMS)进程发起startActivity请求;
- system_server(AMS)进程接收到请求后,交付 ActivityStarter 处理 Intent 和 Flag 等信息,然后再交给 ActivityStackSupervisior/ActivityStack 处理 Activity 进栈相关流程。同时以 Socket 方式请求 Zygote 进程 fork 新进程。
- Zygote 接收到新进程创建请求后 fork 出新进程。
- App进程,通过Binder IPC向sytem_server(AMS)进程发起attachApplication请求;
- system_server(AMS)进程在收到请求后,进行一系列准备工作后,调用ActivityStackSupervisior的realStartActivityLocked,接着通过binder IPC向App进程调用ApplicationThread的scheduleTransaction方法;
- App进程的binder线程(ApplicationThread)在收到请求后,调用ActivityThread的scheduleTransaction()方法,接着通过handler向主线程发送ActivityThread.H.EXECUTE_TRANSACTION消息;
- 主线程在收到Message后,ActivityThread经过一些内部逻辑处理,最终调用handleLaunchActivity()、handleResumeActivity()方法,这俩方法又分别调用performLaunchActivity()、performResumeActivity()方法。
performLaunchActivity()方法里面逻辑顺序:
- 创建ContextImpl 的实例appContext
- 利用 ClassLoader 去加载 Activity并创建 Activity 实例。
- 调用Activity 的attach方法,并把appContext 传进attach与Activity绑定,
扩展:Activity 的attach方法里面会创建PhoneWindow实例,获取WindowManage实例,实际上是WindowManagerImpl(在SystemServiceRegistry里registerService中可以看到Context.WINDOW_SERVICE对应的是WindowManagerImpl) - 创建Application实例,并在LoadedApk类中调用Instrumentation 的callApplicationOnCreate去调用Application的onCreate()方法
接着调用Instrumentation 的callActivityOnCreate()方法调用Activity的onCreate()方法
handleResumeActivity()方法里面逻辑顺序:
- 首先会执行performResumeActivity去调用Activity的onStart()、onResume(),返回ActivityClientRecord实例,通过此实例获取Activity
- 从Activity中获取PhoneWindow,
- 然后从PhoneWindow中获取到DecorView
- 接着从Activity中获取WindowManager(实际上是WindowManagerImpl)
- 再继续WindowManagerImpl调用addView()方法把DecorView添加进去
- WindowManagerImpld的addView()方法会调用到WindowManagerGlobal的addView()方法,在此方法中会创建ViewRootImpl的实例。
- 最终会调用ViewRootImpl的setView()方法加载DecorView,执行绘制流程。
到此,App便正式启动,UI渲染结束后便可以看到App的主界面。
参考文档: https://blog.csdn.net/yushuyou/article/details/128985837