- ARouter
router-annotation 路由注解模块
- src.main.java
- com.alibaba.android.arouter
- facade 提供注解和枚举的包
- annotation 存放各种注解类的包
- Autowired.java 自动注入的注解
- Interceptor.java 拦截器的注解
- Param.java(废弃) 参数注解: 被 Autowired 淘汰
- Route.java 路由信息注解
- enums 包含各种枚举类型的包
- RouteType.java 路由类型的枚举
- TypeKind.java 类型种类的枚举
- model 包含模型类的包
- RouteMeta.java 路由元信息的模型类
- TypeWrapper.java 存储目标对象的泛型类型信息的类
- annotation 存放各种注解类的包
- facade 提供注解和枚举的包
- com.alibaba.android.arouter
- src.main.java
arouter-api ARouter框架的API模块
- src.main.java
- com.alibaba.android.arouter
- base 基础功能相关的包
- UniqueKeyTreeMap.java 唯一键树形映射的类
- core 核心功能相关的包
- AutowiredLifecyleCallback.java(废弃) 自动注入生命周期回调的类
- AutowiredServiceImpl.java 自动注入服务的实现类
- InstrumentationHook.java(废弃) 仪表钩子的类
- InterceptorServiceImpl.java 拦截器服务的实现类
- LogisticsCenter.java 物流中心的类
- Warehouse.java 仓库的类
- exception 异常相关的包
- HandlerException.java 处理异常的类
- InitException.java 初始化异常的类
- NoRouteFoundException.java 未找到路由的异常类
- facade 提供各种服务和回调的包
- callback 回调相关的包
- InterceptorCallback.java 拦截器回调的接口
- NavigationCallback.java 导航回调的接口
- NoRouteFoundException.java 未找到路由的异常接口
- callback 回调相关的包
- service 服务相关的包
- AutowiredService.java 自动注入服务的接口
- ClassLoaderService.java 类加载器服务的接口
- DegradeService.java 降级服务的接口
- InterceptorService.java 拦截器服务的接口
- PathReplaceService.java 路径替换服务的接口
- PretreatmentService.java 预处理服务的接口
- SerializationService.java 序列化服务的接口
- template 模板相关的包
- IInterceptor.java 拦截器接口
- IInterceptorGroup.java 拦截器分组接口
- Ilogger.java 日志记录器接口
- IPolicy.java 策略接口
- IProvider.java 提供者接口
- IProviderGroup.java 提供者分组接口
- IRouteGroup.java 路由分组接口
- IRouteRoot.java 路由根接口
- Isyringe.java 注射器接口
- Postcard.java 路由信息封装类
- launcher 启动器: 包含一些用于启动ARouter框架的类和线程管理相关的类。
- _Arouter.java ARouter框架的内部启动类,用于初始化ARouter。
- Arouter.java ARouter框架的启动类,用于初始化ARouter。
- thread (线程)包含了与线程管理相关的类。
- CancelableCountDownLatch.java 可取消的倒计时计数器,用于线程同步。
- DefaultPoolExecutor.java 默认的线程池执行器,用于执行异步任务。
- DefaultThreadFactory.java 默认线程工厂,用于创建线程。
- utils 工具类。
- ClassUtils.java 用于操作类的实用工具类。
- Consts.java 包含一些常量值的类。
- DefaultLogger.java 默认的日志记录器类。
- MapUtils.java 用于操作地图数据的实用工具类。
- PackageUtils.java 用于操作包信息的实用工具类。
- TextUtils.java 用于操作文本数据的实用工具类。
- base 基础功能相关的包
- com.alibaba.android.arouter
- src.main.java
arouter-compiler
- src.main.java
- com.alibaba.android.arouter
- compiler 编译相关的包
- entity 实体类相关的包
- RouteDoc.java 路由文档实体类
- processor 处理器相关的包
- AutowiredProcessor.java 自动注入处理器
- BaseProcessor.java 基础处理器
- InterceptorProcessor.java 拦截器处理器
- RouteProcessor.java 路由处理器
- utils 工具类相关的包
- Consts.java 常量类
- Logger.java 日志记录器类
- TypeUtils.java 类型工具类
- entity 实体类相关的包
- compiler 编译相关的包
- com.alibaba.android.arouter
- src.main.java
从零开始写一个 ARouter - utils 工具类
- ARouter
router-annotation 路由注解模块
- src.main.java
- com.alibaba.android.arouter
- facade 提供注解和枚举的包
- annotation 存放各种注解类的包
- Autowired.java 自动注入的注解
- Interceptor.java 拦截器的注解
- Param.java(废弃) 参数注解: 被 Autowired 淘汰
- Route.java 路由信息注解
- enums 包含各种枚举类型的包
- RouteType.java 路由类型的枚举
- TypeKind.java 类型种类的枚举
- model 包含模型类的包
- RouteMeta.java 路由元信息的模型类
- TypeWrapper.java 存储目标对象的泛型类型信息的类
- annotation 存放各种注解类的包
- facade 提供注解和枚举的包
- com.alibaba.android.arouter
- src.main.java
arouter-api ARouter框架的API模块
- src.main.java
- com.alibaba.android.arouter
- base 基础功能相关的包
- UniqueKeyTreeMap.java 唯一键树形映射的类
- core 核心功能相关的包
- AutowiredLifecyleCallback.java(废弃) 自动注入生命周期回调的类
- AutowiredServiceImpl.java 自动注入服务的实现类
- InstrumentationHook.java(废弃) 仪表钩子的类
- InterceptorServiceImpl.java 拦截器服务的实现类
- LogisticsCenter.java 物流中心的类
- Warehouse.java 仓库的类
- exception 异常相关的包
- HandlerException.java 处理异常的类
- InitException.java 初始化异常的类
- NoRouteFoundException.java 未找到路由的异常类
- facade 提供各种服务和回调的包
- callback 回调相关的包
- InterceptorCallback.java 拦截器回调的接口
- NavigationCallback.java 导航回调的接口
- NoRouteFoundException.java 未找到路由的异常接口
- callback 回调相关的包
- service 服务相关的包
- AutowiredService.java 自动注入服务的接口
- ClassLoaderService.java 类加载器服务的接口
- DegradeService.java 降级服务的接口
- InterceptorService.java 拦截器服务的接口
- PathReplaceService.java 路径替换服务的接口
- PretreatmentService.java 预处理服务的接口
- SerializationService.java 序列化服务的接口
- template 模板相关的包
- IInterceptor.java 拦截器接口
- IInterceptorGroup.java 拦截器分组接口
- Ilogger.java 日志记录器接口
- IPolicy.java 策略接口
- IProvider.java 提供者接口
- IProviderGroup.java 提供者分组接口
- IRouteGroup.java 路由分组接口
- IRouteRoot.java 路由根接口
- Isyringe.java 注射器接口
- Postcard.java 路由信息封装类
- launcher 启动器: 包含一些用于启动ARouter框架的类和线程管理相关的类。
- _Arouter.java ARouter框架的内部启动类,用于初始化ARouter。
- Arouter.java ARouter框架的启动类,用于初始化ARouter。
- thread (线程)包含了与线程管理相关的类。
- CancelableCountDownLatch.java 可取消的倒计时计数器,用于线程同步。
- DefaultPoolExecutor.java 默认的线程池执行器,用于执行异步任务。
- DefaultThreadFactory.java 默认线程工厂,用于创建线程。
- utils 工具类。
- ClassUtils.java 用于操作类的实用工具类。
- Consts.java 包含一些常量值的类。
- DefaultLogger.java 默认的日志记录器类。
- MapUtils.java 用于操作地图数据的实用工具类。
- PackageUtils.java 用于操作包信息的实用工具类。
- TextUtils.java 用于操作文本数据的实用工具类。
- base 基础功能相关的包
- com.alibaba.android.arouter
- src.main.java
arouter-compiler
- src.main.java
- com.alibaba.android.arouter
- compiler 编译相关的包
- entity 实体类相关的包
- RouteDoc.java 路由文档实体类
- processor 处理器相关的包
- AutowiredProcessor.java 自动注入处理器
- BaseProcessor.java 基础处理器
- InterceptorProcessor.java 拦截器处理器
- RouteProcessor.java 路由处理器
- utils 工具类相关的包
- Consts.java 常量类
- Logger.java 日志记录器类
- TypeUtils.java 类型工具类
- entity 实体类相关的包
- compiler 编译相关的包
- com.alibaba.android.arouter
- src.main.java
从零开始写一个 ARouter - compiler 编译模块
ARouter
router-annotation 路由注解模块
- src.main.java
- com.alibaba.android.arouter
- facade 提供注解和枚举的包
- annotation 存放各种注解类的包
- Autowired.java 自动注入的注解
- Interceptor.java 拦截器的注解
- Param.java(废弃) 参数注解: 被 Autowired 淘汰
- Route.java 路由信息注解
- enums 包含各种枚举类型的包
- RouteType.java 路由类型的枚举
- TypeKind.java 类型种类的枚举
- model 包含模型类的包
- RouteMeta.java 路由元信息的模型类
- TypeWrapper.java 存储目标对象的泛型类型信息的类
- annotation 存放各种注解类的包
- facade 提供注解和枚举的包
- com.alibaba.android.arouter
- src.main.java
arouter-api ARouter框架的API模块
- src.main.java
- com.alibaba.android.arouter
- base 基础功能相关的包
- UniqueKeyTreeMap.java 唯一键树形映射的类
- core 核心功能相关的包
- AutowiredLifecyleCallback.java(废弃) 自动注入生命周期回调的类
- AutowiredServiceImpl.java 自动注入服务的实现类
- InstrumentationHook.java(废弃) 仪表钩子的类
- InterceptorServiceImpl.java 拦截器服务的实现类
- LogisticsCenter.java 物流中心的类
- Warehouse.java 仓库的类
- exception 异常相关的包
- HandlerException.java 处理异常的类
- InitException.java 初始化异常的类
- NoRouteFoundException.java 未找到路由的异常类
- facade 提供各种服务和回调的包
- callback 回调相关的包
- InterceptorCallback.java 拦截器回调的接口
- NavigationCallback.java 导航回调的接口
- NoRouteFoundException.java 未找到路由的异常接口
- callback 回调相关的包
- service 服务相关的包
- AutowiredService.java 自动注入服务的接口
- ClassLoaderService.java 类加载器服务的接口
- DegradeService.java 降级服务的接口
- InterceptorService.java 拦截器服务的接口
- PathReplaceService.java 路径替换服务的接口
- PretreatmentService.java 预处理服务的接口
- SerializationService.java 序列化服务的接口
- template 模板相关的包
- IInterceptor.java 拦截器接口
- IInterceptorGroup.java 拦截器分组接口
- Ilogger.java 日志记录器接口
- IPolicy.java 策略接口
- IProvider.java 提供者接口
- IProviderGroup.java 提供者分组接口
- IRouteGroup.java 路由分组接口
- IRouteRoot.java 路由根接口
- Isyringe.java 注射器接口
- Postcard.java 路由信息封装类
- launcher 启动器: 包含一些用于启动ARouter框架的类和线程管理相关的类。
- _Arouter.java ARouter框架的内部启动类,用于初始化ARouter。
- Arouter.java ARouter框架的启动类,用于初始化ARouter。
- thread (线程)包含了与线程管理相关的类。
- CancelableCountDownLatch.java 可取消的倒计时计数器,用于线程同步。
- DefaultPoolExecutor.java 默认的线程池执行器,用于执行异步任务。
- DefaultThreadFactory.java 默认线程工厂,用于创建线程。
- utils 工具类。
- ClassUtils.java 用于操作类的实用工具类。
- Consts.java 包含一些常量值的类。
- DefaultLogger.java 默认的日志记录器类。
- MapUtils.java 用于操作地图数据的实用工具类。
- PackageUtils.java 用于操作包信息的实用工具类。
- TextUtils.java 用于操作文本数据的实用工具类。
- base 基础功能相关的包
- com.alibaba.android.arouter
- src.main.java
arouter-compiler
- src.main.java
- com.alibaba.android.arouter
- compiler 编译相关的包
- entity 实体类相关的包
- RouteDoc.java 路由文档实体类
- processor 处理器相关的包
- AutowiredProcessor.java 自动注入处理器
- BaseProcessor.java 基础处理器
- InterceptorProcessor.java 拦截器处理器
- RouteProcessor.java 路由处理器
- utils 工具类相关的包
- Consts.java 常量类
- Logger.java 日志记录器类
- TypeUtils.java 类型工具类
- entity 实体类相关的包
- compiler 编译相关的包
- com.alibaba.android.arouter
- src.main.java
Android Framework 专项 - AMS 学习路线指南
ActivityManagerService (AMS) 是 Android Framework 中最核心、最庞大的系统服务。设计一套科学的 AMS 学习路线,建议遵循“从宏观到微观,从模型到流程”的原则。
第一阶段:夯实底座(前置必备知识)
在直接阅读 AMS 源码前,必须先掌握 Android 的 IPC 机制和基础通信模型。
| 模块 | 关键考点 | 学习目的 |
|---|---|---|
| Binder 机制 | mmap、AIDL 通信、Stub/Proxy 模式 | 理解 App 进程如何跨进程调用系统服务。 |
| Handler 机制 | Looper 循环、MessageQueue、同步屏障 | 理解 ActivityThread 如何接收并处理来自 AMS 的指令。 |
| Zygote 进程 | Fork 机制、AppRuntime 启动 | 理解 Android 进程是如何被孵化出来的。 |
第二阶段:数据模型(理解“三驾马车”)
不要一上来就跟代码流程,先理解 AMS 是如何通过对象来描述 Activity 运行状态的。
| 核心类 | 职责描述 | 对应现实模型 |
|---|---|---|
| ActivityRecord | 记录单个 Activity 的所有状态(Intent, State, TaskAffinity)。 | 个人档案 |
| TaskRecord | 任务栈,管理一组相关的 ActivityRecord。 | 文件夹 |
| ActivityStack | 管理 TaskRecord 的集合(在 Android 10+ 已被 Task 取代)。 | 文件柜 |
| ProcessRecord | 描述应用进程信息(UID, PID, 包含的所有组件)。 | 容器 |
第三阶段:核心流程(模拟启动链路)
这是 AMS 最具挑战性的部分,建议分阶段拆解 startActivity 的完整生命周期。
| 学习步骤 | 核心关键点 | 推荐工具 |
|---|---|---|
| 1. 进程内调用 | ContextImpl -> Instrumentation -> ATMS 代理。 | 静态代码追踪 |
| 2. 栈管理逻辑 | 判断启动模式 (LaunchMode)、计算目标 Task、处理 Flag。 | dumpsys activity |
| 3. 进程创建 | AMS 发现进程不存在 -> 请求 Zygote -> 进程启动。 | Logcat 过滤线程 ID |
| 4. 事务分发 | ClientTransaction 封装、TransactionExecutor 执行回调。 | 事务断点调试 |
第四阶段:进阶与演进(现代架构分析)
了解 AMS 的现代演进,特别是 Android 10+ 的重大变化。
| 进阶专题 | 核心内容 | 学习意义 |
|---|---|---|
| AMS 与 ATMS 拆分 | 职责分离原理、进程管理与组件管理的分离。 | 适配 API 29+ 源码。 |
| 多窗口与折叠屏 | DisplayContent、多焦点管理逻辑。 | 掌握现代 UI 架构适配原理。 |
| OOM Adj 算法 | 进程优先级(Cached, Empty, Visible)的动态调节。 | 性能优化与后台存活研究。 |
💡 学习建议:
- 不要迷失在细节里:AMS 的代码量极大,初期应以“理清调用时序图”为主,忽略细枝末节的逻辑判断。
- 多用 dumpsys:运行
adb shell dumpsys activity activities可以实时查看当前的栈结构,将抽象的对象可视化。 - 对照版本:Android 10 之后的
startActivity逻辑基本都在ATMS中,阅读源码时务必注意系统版本。
Activity 启动的整体流程与第一个阶段解读参数
Activity 的启动过程是 Android Framework 中最复杂的流程之一,它涉及多个进程间的通信(IPC)。
1. 启动流程涉及的四个角色
- Launcher 进程或 App 进程:发起启动 Activity 的请求(通过
startActivity)。 - **System_Server 进程 (AMS)**:核心控制中心。负责解析 Intent、管理 Activity 栈(Task/Stack)、权限检查等。
- Zygote 进程:孵化器。如果目标 App 进程尚未启动,AMS 会请求 Zygote Fork 出一个新的进程。
- 目标 App 进程:Activity 最终运行的地方。在
ActivityThread中完成初始化并回调onCreate。
2. 第一阶段:从 App 到 AMS 的跳转
当我们在代码中调用 startActivity(intent) 时,实际上经历了一系列的“套路”:
2.1 ContextImpl.startActivity
所有的 Context 子类(Activity, Service 等)最终都会调用到 ContextImpl 的实现中。
2.2 Instrumentation.execStartActivity
Instrumentation 是 Activity 的“管家”,负责监控 App 与系统的所有交互。在这里,它会通过 ActivityTaskManager.getService() 获取到 IActivityTaskManager 的 Binder 代理对象。
2.3 跨进程调用 (IPC)
通过 Binder 机制,请求从当前进程“跳”到了 System_Server 进程中的 ActivityTaskManagerService (ATMS)。
3. 核心参数解读
在进入 AMS 内部前,有几个关键概念必须厘清:
- ActivityRecord:在 AMS 端,每一个 Activity 实例都对应一个
ActivityRecord对象,它记录了该 Activity 的所有信息。 - TaskRecord:任务栈。一个 Task 可以包含多个 Activity,遵循后进先出(LIFO)原则。
- ActivityStack:管理 Task 的层级结构。
4. 源码关键点 (API 29+)
在 Android 10 以后,Activity 的启动逻辑从 ActivityManagerService 大量迁移到了 ActivityTaskManagerService。
1 | // ATMS 端的入口方法 |
接下来的文档中,我们将详细解析 ActivityStarter 如何处理 Flag 以及如何决定 Activity 该落入哪个 Task。
Activity 生命周期事务封装 (ClientTransaction)
在 Android 8.0 之后,系统引入了 ClientTransaction 机制来重构 Activity 的生命周期管理。这是一种基于“事务”的设计模式,将原本散落在 AMS 中的各种生命周期指令进行了统一封装。
1. 为什么需要事务封装?
在旧版本中,AMS 直接调用应用进程的 IApplicationThread 接口(如 scheduleLaunchActivity)。这种方式扩展性差,且难以处理复杂的复合状态切换。
引入事务后,AMS 只需要发送一个 ClientTransaction,其中包含了:
- Callback:如
LaunchActivityItem(创建 Activity)。 - FinalState:如
ResumeActivityItem(最终状态)。
2. 核心组件
- ClientTransaction:事务容器。
- ClientTransactionHandler:在应用进程中(通常是
ActivityThread)负责执行事务。 - TransactionExecutor:事务执行器,负责按照正确的逻辑顺序(例如先 Create 再 Resume)调度事务中的各项指令。
3. 生命周期执行链路
- AMS 服务端:创建
ClientTransaction,并添加对应的生命周期 Item。 - 跨进程传递:通过
IApplicationThread.scheduleTransaction发送到目标 App 进程。 - App 客户端:
ActivityThread收到后,交给TransactionExecutor执行。 - 执行逻辑:
executeCallbacks():执行如LaunchActivityItem等初始化操作。executeLifecycleState():执行如ResumeActivityItem等状态变更操作。
4. 总结
生命周期事务封装是 Android 系统现代化的重要体现。它不仅让 AMS 的逻辑更加简洁,也为后续的 多窗口模式 和 折叠屏 复杂状态切换提供了坚实的底层架构支持。
WMS 源代码流程分析
本指南将从源代码角度分析 WindowManagerService (WMS) 的核心工作流程,并配合时序图进行说明。
1. WMS 的启动与初始化 (SystemServer)
WMS 是在 SystemServer 进程中启动的系统核心服务。
- 路径:
frameworks/base/services/java/com/android/server/SystemServer.java - 代码关键点:
1
2
3// 在 startOtherServices 方法中
wm = WindowManagerService.main(context, inputManager, !mFirstBoot, mOnlyCore, new PhoneWindowManager(), mActivityManagerService.getAppTransition());
ServiceManager.addService(Context.WINDOW_SERVICE, wm);
2. 窗口添加流程 (WindowManager.addView)
这是应用进程请求 WMS 显示 UI 的核心路径。
2.1 时序图:addView 过程
1 | sequenceDiagram |
2.2 核心步骤解析
- WindowManagerGlobal: 应用进程内的单例,管理所有窗口的 View 和 ViewRootImpl。
- ViewRootImpl: 连接 WindowManager 和控制台的纽带,负责触发绘制和与 WMS 通信。
- Session: 每个应用进程在 WMS 中对应一个 Session 对象,用于跨进程通信。
- addWindow: WMS 内部方法,负责创建
WindowState并维护 Z-order 堆栈。
3. 布局与 Surface 分配 (Relayout)
窗口添加后,需要确定具体大小并获得绘图“画布”(Surface)。
3.1 时序图:Relayout 过程
1 | sequenceDiagram |
4. 关键类及其关系
| 类名 | 职责 |
|---|---|
IWindowSession |
App -> WMS 的单向通道,处理添加、删除、布局请求。 |
IWindow |
WMS -> App 的回调通道,处理窗口缩放、焦点变化等。 |
WindowState |
WMS 为每个窗口维护的“身份证”,包含位置、层级、可见性等。 |
WindowToken |
窗口的归类令牌,用于管理 Activity 或 Dialog 等一组窗口的生命周期。 |
DisplayContent |
对应一个物理屏幕,管理该屏幕下的所有窗口堆栈。 |
5. 总结
WMS 的核心逻辑在于 管理 与 协调:
- 管理: 维护窗口的大小、位置、层级(Z-Order)。
- 协调: 向上承接 View 系统(App),向下通过 SurfaceFlinger 申请显示资源,同时与 InputManagerService 协作分发触摸事件。
AMS 与 ATMS 的区别解析
自 Android 10 (API 29) 开始,Google 对原本庞大的 ActivityManagerService (AMS) 进行了结构性重构,将其核心的 Activity 管理职能抽离出来,成立了 ActivityTaskManagerService (ATMS)。
1. 为什么要进行拆分?
在早期的 Android 版本中,AMS 承载了太多的职责。这种“巨石”设计导致了严重的工程问题:
| 核心痛点 | 详细解析与举例 |
|---|---|
| 代码耦合严重 | 现象:Activity 栈管理逻辑与广播分发逻辑共用同一个线程/锁。 举例:在计算复杂的 Task 切换(如分屏模式下的 Activity 移动)时,如果逻辑出错产生死锁或耗时过长,会直接阻塞同一进程内的广播分发 Handler,导致无关的广播接收者出现 ANR。 |
| 职责不清晰 | 现象:WMS 需要频繁跨模块获取 Activity 状态。 举例:WMS 在准备窗口切换动画时,必须知道 Activity 是否可见。旧版 WMS 需通过繁琐的 IPC 调用 AMS 的 ActivityRecord 状态,这不仅产生了大量的跨模块冗余代码,还增加了同步状态时的延迟。拆分后,ATMS 与 WMS 深度融合,共同管理 WindowContainer 层级结构。 |
| 维护成本极高 | 现象:单文件行数爆炸,合并冲突不断。 举例: ActivityManagerService.java 的源码量曾一度突破 30,000 行。开发者 A 在修复 Service 粘性启动的 Bug,开发者 B 在优化 Activity 的启动速度,由于两人都在操作同一个文件,导致每次版本合并时都会产生极其复杂的代码冲突。 |
核心管理对象:Record 体系
为了实现职责分离,AMS 与 ATMS 分别维护了不同的核心数据对象:
| 对象名称 | 所属服务 | 核心职责 |
|---|---|---|
| ProcessRecord | AMS | 进程管家。描述一个应用进程的实体,记录了进程的 PID、UID、包含的组件(Service, Receiver)、进程优先级(Adj)以及内存状态。AMS 通过它来决定系统内存不足时该“杀掉”哪个进程。 |
| ActivityRecord | ATMS | Activity 档案。描述一个 Activity 实例的最小单位。记录了 Intent、所属 Task、状态(Resumed, Paused 等)、对应的 WindowToken。它与应用端的 Activity 实例一一对应。 |
| TaskRecord | ATMS | 任务容器。描述一个“最近任务”或“任务栈”。管理一组相关的 ActivityRecord,决定了 Activity 的回退顺序(LIFO,后进先出)以及在多窗口模式下的显示分组。 |
2. AMS vs ATMS 职责对比
| 维度 | ActivityManagerService (AMS) | ActivityTaskManagerService (ATMS) |
|---|---|---|
| 核心职责 | 管理应用生命周期(进程、四大组件中的后三者)。 | 专门管理 Activity 及其容器(Task, Stack, Display)。 |
| 组件管理 | Service, BroadcastReceiver, ContentProvider。 | Activity 启动、生命周期、Task 切换。 |
| 进程管理 | 负责 OOM Adjuster、进程启动与回收。 | 不直接参与进程管理。 |
| 交互对象 | 主要与 ProcessRecord 交互。 |
主要与 ActivityRecord、TaskRecord 交互。 |
| WMS 关系 | 间接交互。 | 强绑定。与 WMS 共同管理窗口 and Activity。 |
3. 架构演进的关键点
3.1 跨进程通信的变化
- Android 9 以前:App -> AMS (startActivity)。
- Android 10 以后:App -> ATMS (startActivity)。
3.2 内部协作流程
- ATMS 负责判断 Activity 应该在哪个 Task 启动,并管理其生命周期状态。
- 当需要启动一个新的进程来承载 Activity 时,ATMS 会回调 AMS 的
startProcessAsync方法。 - AMS 负责与 Zygote 通信并完成进程的创建。
4. 总结:一句话区分
- ATMS 是“Activity 管家”:只关心 Activity 怎么跳、怎么显示、怎么分组。
- AMS 是“应用管家”:关心进程还在不在、Service 跑没跑、广播发没发。
这种拆分使得 Android 系统在支持 多窗口模式 (Multi-Window) 和 折叠屏 (Foldables) 时,逻辑更加清晰和独立。
Handler 与 ActivityThread 的协作机制
在 AMS 管理 Activity 生命周期的过程中,Handler 扮演了“线程切换器”的关键角色。理解 ActivityThread 如何通过 Handler 接收并执行来自 AMS 的指令,是掌握 Framework 通信模型的核心。
1. 协作模型:从 Binder 线程到主线程
AMS 运行在 system_server 进程中,通过 IApplicationThread (Binder 接口) 向应用进程发送指令。
| 步骤 | 运行环境 | 执行动作 |
|---|---|---|
| 1. 跨进程调用 | Binder 线程池 | 应用进程收到 AMS 的 Binder 调用(如 scheduleTransaction)。 |
| 2. 线程切换 | Handler 发送消息 | Binder 线程不直接操作 UI,而是将任务通过 H (Handler) 发送到主线程。 |
| 3. 消息排队 | MessageQueue |
任务作为 Message 进入主线程的消息队列,遵循优先级排序。 |
| 4. 执行任务 | 主线程 (Looper) | Looper 取出消息并回调 handleMessage,最终执行 Activity 的生命周期。 |
2. ActivityThread 内部的管家:类 H
在 ActivityThread 源码中,定义了一个内部类 H,它继承自 Handler。它是应用进程中最重要的消息处理中心。
| 核心消息常量 (Message Type) | 对应场景 |
|---|---|
| EXECUTE_TRANSACTION | Android 9.0+ 引入,统一处理绝大多数生命周期事务(Start, Resume 等)。 |
| BIND_APPLICATION | 应用进程启动后的初始化指令。 |
| EXIT_APPLICATION | 请求应用退出。 |
| RECEIVER | 广播处理指令。 |
1 | // ActivityThread.java 中的内部类 H |
3. 同步屏障 (Sync Barrier) 在 AMS 场景下的应用
当 AMS 请求启动一个 Activity 或执行渲染任务时,为了保证 UI 能够以 60fps/120fps 的频率流畅刷新,系统会使用同步屏障机制。
| 概念 | 作用机制 | 在 AMS 场景的应用 |
|---|---|---|
| 插入屏障 | 在 MessageQueue 头部插入一个 target 为空的特殊消息。 |
当 Choreographer 接收到 VSync 信号,或者 AMS 触发界面刷新时发送。 |
| 优先异步 | 此时 Looper 会跳过普通消息,只执行标记为 isAsynchronous 的消息。 |
确保 UI 绘制任务、某些关键生命周期事务不会被队列中积压的普通消息(如日志、数据上报)阻塞。 |
| 移除屏障 | 渲染完成后移除,恢复普通消息的处理。 | 保证系统吞吐量与 UI 流畅度的平衡。 |
4. 总结:为什么要通过 Handler?
- 线程安全:Android 的 UI 控件是非线程安全的,必须保证所有对 Activity 状态的修改都在主线程完成。
- 异步缓冲:AMS 往往是“发后即忘”的异步调用。Handler 提供的消息队列可以缓冲来自系统的密集请求,防止应用进程因瞬间过载而崩溃。
- 优先级调度:配合同步屏障,Handler 机制能确保最重要的“显示”任务永远被优先执行。
ActivityThread 接收并处理 AMS 指令全过程
在 Android 的系统架构中,AMS(System Server 进程)与 ActivityThread(应用进程)之间的通信是典型的 C/S 架构。AMS 作为服务端下发指令,ActivityThread 作为客户端接收并执行。
1. 通信架构:Binder 边界
AMS 并不直接持有 ActivityThread 对象,而是通过 IApplicationThread 这一 Binder 接口进行通信。
| 角色 | 实现类 | 物理位置 | 职责 |
|---|---|---|---|
| Binder 服务端 | ActivityThread.ApplicationThread |
应用进程 | 继承自 IApplicationThread.Stub,开启 Binder 线程池等待调用。 |
| Binder 代理端 | ApplicationThreadProxy |
System Server 进程 | AMS 持有该代理,用于向 App 进程发送指令。 |
2. 指令接收流程:从 Binder 线程到主线程
当 AMS 发起一个指令(如启动 Activity)时,数据流转如下:
第一步:Binder 线程接收
AMS 调用 app.thread.scheduleTransaction(transaction)。此时,App 进程中的 Binder 线程池 会随机选择一个线程来执行 ApplicationThread 对应的接口方法。
第二步:向主线程分发
由于 Binder 线程不能直接操作 UI 或执行 Activity 生命周期,ApplicationThread 会通过内部类 H(Handler)将任务发送到主线程。
1 | // ActivityThread.java 内部代码逻辑 |
第三步:主线程消息循环 (Looper)
主线程的 Looper 不断从 MessageQueue 中取出消息。当收到 EXECUTE_TRANSACTION 时,回调 H 的 handleMessage。
第四步:执行具体逻辑
对于生命周期相关的指令,ActivityThread 会委派给 TransactionExecutor 执行,最终调用到 Activity 的 onCreate/onStart 等方法。
3. 核心处理中心:类 H
ActivityThread 内部维护的 Handler H 是所有系统指令的汇聚点。它处理的消息类型决定了应用的行为。
| 关键消息 (What) | 来源与作用 |
|---|---|
| BIND_APPLICATION | AMS 要求进程进行初始化(创建 Application, 加载 Provider)。 |
| EXECUTE_TRANSACTION | Android 9.0+ 引入,聚合了几乎所有生命周期回调(Launch, Resume, Stop 等)。 |
| RECEIVER | 处理非动态注册的广播接收者。 |
| SERVICE_ARGS | 启动或分发 Service 任务。 |
4. 协作机制总结
| 关键环节 | 核心机制 | 核心目的 |
|---|---|---|
| 跨进程传输 | Binder | 实现 System Server 与 App 进程的通信边界。 |
| 线程切换 | Handler (类 H) | 将异步的系统指令切换到单线程的 UI 线程执行,确保线程安全。 |
| 顺序保证 | MessageQueue | 确保来自系统的多个指令(如先 Create 后 Resume)按序执行。 |
| 事务封装 | ClientTransaction | 在现代 Android 版本中简化生命周期管理,支持复杂的组合状态切换。 |
💡 面试要点:
- ActivityThread 的主线程循环是什么?
答:是Looper.loop(),它不仅处理用户交互,还处理来自 AMS 的所有生命周期指令。 - 为什么 ApplicationThread 里的方法不直接改 UI?
答:因为 ApplicationThread 的方法运行在 Binder 线程 中,而 Android 的 UI 系统是非线程安全的,必须通过 Handler 切换到主线程。 - Handler H 的作用?
答:它是应用进程的“神经中枢”,负责将系统的异步调用同步化到主线程执行。