AMS
AMS 基础
AMS 是什么?
ActivityManagerService 是 Android 系统中一个特别重要的系统服务,也是我们上层 APP 打交道最多的系统服务之一。ActivityManagerService(以下简称 AMS) 主要负责四大组件的启动、切换、调度以及应用进程的管理和调度工作。所有的 APP 应用都需要与 AMS 打交道。
AMS 的启动?
AMS 的启动是在 SystemServer 进程中启动的
- Zygote 进程 fork 出 system_server 进程
- 在 SystemServer.main 调用 startBootstrapServices()
- startBootstrapServices() 中初始化 ActivityTaskManagerService(ATMS) 和 ActivityManagerService(AMS)
Activity 任务栈管理
- ActivityRecord 存储了 Activity 的所有信息,包括 AMS 引用、Manifest 节点信息、Activity 状态、Activity 资源信息和 Activity 进程相关信息;还含有该 ActivityRecord 所在的 TaskRecord。
- TaskRecord 描述的是一个 Activity 任务栈,存储了任务栈的所有信息,包括任务栈的唯一标识符、任务栈的倾向性、任务栈中的 Activity 记录和 AMS 引用等;还含有 ActivityStack,也就是当前 Activity 任务栈所归属的 ActivityStack。
- ActivityStack 管理系统所有 Activity,维护了 Activity 的所有状态
ActivityRecord 用来记录一个 Activity 的所有信息,TaskRecord 中包含一个或多个 ActivityRecord,TaskRecord 用来表示 Activity 任务栈,用来管理栈中的 ActivityRecord;而 ActivityStack 又包含了一个或多个 TaskRecord,它是 TaskRecord 的管理者,ActivityStack 包含一个或多个 TaskRecord。
点击一个 APP 到 View 呈现中间发生了什么?
1、Launcher 进程 start 目标 Activity
Launcher 进程通过 ATMS(ATMSsystem_server 进程) 启动目标 Activity,这个过程涉及了 IPC,通过 binder 机制。
具体通过 Activity/Instrumentatation/ATMS/ActivityStarter/RootWindowContainer 等一串调用链条。
- Instrumentation:监控应用与系统相关的交互行为
- AMS:组件管理调度中心,四大组件的生命周期
- ActivityStarter:Activity 启动的控制器,处理 Intent 与 Flag 对 Activity 启动的影响
- ActivityStackSupervisior:用来管理多个任务栈,高版本才有。用来管理多个 ActivityStack,
- ActivityStack:用来管理任务栈里的 Activity
- ActivityThread:Activity、Service、BroadcastReceiver 的启动、切换、调度和各种操作都在这个类完成
system_server 进程如何启动的?
system_server 进程是 Zygote 进程孵化的第一个 Java 进程,主要用来启动系统的服务,几十个
ATMS 和 AMS 的拆分,ATMS 的作用?
Android10 及以上,AMS 拆分了,将 Activity 相关的转移到了 ATMS 中处理
servicemanager 是如何管理系统服务的 (binder 大总管)?如何启动的(init.rc 启动的)?,管理所有 binder server 服务
2、ATMS 处理:ATMS 处理请求及通过 socket 让 Zygote 进程 fork 一个 App 进程,可选
ATMS 收到启动请求后,交付 ActivityStarter 处理 Intent 和 Flag 等信息,然后交给 ActivityStackSupervisor/ActivityStack 处理 Activity 进栈相关流程;同时以 Socket 方式请求 Zygote 进程 fork 出应用进程。
如果目标 Activity 的进程未启动,ATMS 会请求 Zygote 进程启动需要的应用程序进程。
3、Zygote fork 应用进程 (如何需要的话)
Zygote 进程 fork 出 App 进程,在新进程里反射创建 ActivityThread 对象调用 main,这个就是应用的主线程,在主线程里开启 Looper 消息循环,开始处理创建 Activity。
- 创建 application, 这里又通过 Binder,attachApplication 到 ATMS,把 ApplicationThread 传递给了 AMS(App 进程的 BinderProxy)
匿名 Binder,利用 AMS,在 attachApplication 将 ApplicationThread 带给了 AMS,这样 AMS 就可以和 App 进程通信了
- ActivityThread 利用 ClassLoader 去加载 Activity,创建 Activity 实例,并回调 Activity 的 onCreate()
Zygote 进程如何启动?作用?
Zygote 进程是 init 进程 fork 启动的,Zygote 进程会启动 Android 虚拟机,加载一些系统资源,fork 出 system_server 进程和应用进程。
为什么通过 Zygote 创建进程的 IPC 不是用 Binder 而是 Socket?
- binder 是多线程,fork 不允许多线程,容易出现死锁
- 繁琐,要打开 binder 驱动,注册到 ServiceManager 中,AMS 再从 ServiceManager 拿 Zygote 的 binder 代理对象
- Zygote Java 进程启动后,会创建一个 ZygoteServer 端的 Socket,这个 Socket 会等待 AMS 请求 Zygote 来创建新的进程
- Zygote 进程 fork 出应用进程,应用进程就会获得 Zygote 进程在启动时创建的虚拟机实例,还会创建 Binder 线程池和消息循环,这样运行在应用进程中的应用程序就可以方便地使用 Binder 进行进程间通信及消息处理了,