从零开始写一个 ARouter - launcher 启动器

  • 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 存储目标对象的泛型类型信息的类
    • 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 未找到路由的异常接口
          • 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 (线程)包含了与线程管理相关的类。
          • utils 工具类。
            • ClassUtils.java 用于操作类的实用工具类。
            • Consts.java 包含一些常量值的类。
            • DefaultLogger.java 默认的日志记录器类。
            • MapUtils.java 用于操作地图数据的实用工具类。
            • PackageUtils.java 用于操作包信息的实用工具类。
            • TextUtils.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 类型工具类

从零开始写一个 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 存储目标对象的泛型类型信息的类
    • 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 未找到路由的异常接口
          • 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 工具类。
    • 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 类型工具类

从零开始写一个 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 存储目标对象的泛型类型信息的类
    • 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 未找到路由的异常接口
          • 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 用于操作文本数据的实用工具类。
  • arouter-compiler

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)的动态调节。 性能优化与后台存活研究。

💡 学习建议:

  1. 不要迷失在细节里:AMS 的代码量极大,初期应以“理清调用时序图”为主,忽略细枝末节的逻辑判断。
  2. 多用 dumpsys:运行 adb shell dumpsys activity activities 可以实时查看当前的栈结构,将抽象的对象可视化。
  3. 对照版本:Android 10 之后的 startActivity 逻辑基本都在 ATMS 中,阅读源码时务必注意系统版本。

Activity 启动的整体流程与第一个阶段解读参数

Activity 的启动过程是 Android Framework 中最复杂的流程之一,它涉及多个进程间的通信(IPC)。

1. 启动流程涉及的四个角色

  1. Launcher 进程或 App 进程:发起启动 Activity 的请求(通过 startActivity)。
  2. **System_Server 进程 (AMS)**:核心控制中心。负责解析 Intent、管理 Activity 栈(Task/Stack)、权限检查等。
  3. Zygote 进程:孵化器。如果目标 App 进程尚未启动,AMS 会请求 Zygote Fork 出一个新的进程。
  4. 目标 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
2
3
4
5
6
7
8
// ATMS 端的入口方法
@Override
public final int startActivity(IApplicationThread caller, String callingPackage,
Intent intent, String resolvedType, IBinder resultTo, String resultWho,
int requestCode, int startFlags, ProfilerInfo profilerInfo, Bundle bOptions) {
// ... 调用执行链
return startActivityAsUser(...);
}

接下来的文档中,我们将详细解析 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. 生命周期执行链路

  1. AMS 服务端:创建 ClientTransaction,并添加对应的生命周期 Item。
  2. 跨进程传递:通过 IApplicationThread.scheduleTransaction 发送到目标 App 进程。
  3. App 客户端ActivityThread 收到后,交给 TransactionExecutor 执行。
  4. 执行逻辑
    • 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
sequenceDiagram
participant App as 应用进程 (Activity/View)
participant WMGlobal as WindowManagerGlobal
participant VRI as ViewRootImpl
participant Session as Session (WMS Proxy)
participant WMS as WindowManagerService

App->>WMGlobal: addView(view, params)
WMGlobal->>VRI: new ViewRootImpl()
VRI->>VRI: setView()
VRI->>Session: addToDisplay()
Session->>WMS: addWindow()
WMS->>WMS: 验证权限 & Token
WMS->>WMS: 创建 WindowState 实例
WMS-->>VRI: 返回操作结果 (OK/Err)

2.2 核心步骤解析

  1. WindowManagerGlobal: 应用进程内的单例,管理所有窗口的 View 和 ViewRootImpl。
  2. ViewRootImpl: 连接 WindowManager 和控制台的纽带,负责触发绘制和与 WMS 通信。
  3. Session: 每个应用进程在 WMS 中对应一个 Session 对象,用于跨进程通信。
  4. addWindow: WMS 内部方法,负责创建 WindowState 并维护 Z-order 堆栈。

3. 布局与 Surface 分配 (Relayout)

窗口添加后,需要确定具体大小并获得绘图“画布”(Surface)。

3.1 时序图:Relayout 过程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
sequenceDiagram
participant VRI as ViewRootImpl
participant Session as Session (WMS Proxy)
participant WMS as WindowManagerService
participant WinState as WindowState
participant SF as SurfaceFlinger

VRI->>VRI: performTraversals()
VRI->>Session: relayout()
Session->>WMS: relayoutWindow()
WMS->>WinState: createSurfaceControl()
WinState->>SF: 请求分配 Layer
SF-->>WinState: 返回 SurfaceControl Native 句柄
WMS-->>VRI: 填充应用端的 Surface 对象
VRI->>VRI: 开始应用层绘制 (Canvas/OpenGL)

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 交互。 主要与 ActivityRecordTaskRecord 交互。
WMS 关系 间接交互。 强绑定。与 WMS 共同管理窗口 and Activity。

3. 架构演进的关键点

3.1 跨进程通信的变化

  • Android 9 以前:App -> AMS (startActivity)。
  • Android 10 以后:App -> ATMS (startActivity)。

3.2 内部协作流程

  1. ATMS 负责判断 Activity 应该在哪个 Task 启动,并管理其生命周期状态。
  2. 当需要启动一个新的进程来承载 Activity 时,ATMS 会回调 AMSstartProcessAsync 方法。
  3. 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
2
3
4
5
6
7
8
9
10
11
12
// ActivityThread.java 中的内部类 H
class H extends Handler {
public void handleMessage(Message msg) {
switch (msg.what) {
case EXECUTE_TRANSACTION:
final ClientTransaction transaction = (ClientTransaction) msg.obj;
mTransactionExecutor.execute(transaction);
break;
// ... 其他消息处理
}
}
}

3. 同步屏障 (Sync Barrier) 在 AMS 场景下的应用

当 AMS 请求启动一个 Activity 或执行渲染任务时,为了保证 UI 能够以 60fps/120fps 的频率流畅刷新,系统会使用同步屏障机制。

概念 作用机制 在 AMS 场景的应用
插入屏障 MessageQueue 头部插入一个 target 为空的特殊消息。 Choreographer 接收到 VSync 信号,或者 AMS 触发界面刷新时发送。
优先异步 此时 Looper 会跳过普通消息,只执行标记为 isAsynchronous 的消息。 确保 UI 绘制任务、某些关键生命周期事务不会被队列中积压的普通消息(如日志、数据上报)阻塞。
移除屏障 渲染完成后移除,恢复普通消息的处理。 保证系统吞吐量与 UI 流畅度的平衡。

4. 总结:为什么要通过 Handler?

  1. 线程安全:Android 的 UI 控件是非线程安全的,必须保证所有对 Activity 状态的修改都在主线程完成。
  2. 异步缓冲:AMS 往往是“发后即忘”的异步调用。Handler 提供的消息队列可以缓冲来自系统的密集请求,防止应用进程因瞬间过载而崩溃。
  3. 优先级调度:配合同步屏障,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
2
3
4
5
// ActivityThread.java 内部代码逻辑
public void scheduleTransaction(ClientTransaction transaction) {
// 这里的 this 指向 H (Handler)
sendMessage(ActivityThread.H.EXECUTE_TRANSACTION, transaction);
}

第三步:主线程消息循环 (Looper)

主线程的 Looper 不断从 MessageQueue 中取出消息。当收到 EXECUTE_TRANSACTION 时,回调 HhandleMessage

第四步:执行具体逻辑

对于生命周期相关的指令,ActivityThread 会委派给 TransactionExecutor 执行,最终调用到 ActivityonCreate/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 版本中简化生命周期管理,支持复杂的组合状态切换。

💡 面试要点:

  1. ActivityThread 的主线程循环是什么?
    答:是 Looper.loop(),它不仅处理用户交互,还处理来自 AMS 的所有生命周期指令。
  2. 为什么 ApplicationThread 里的方法不直接改 UI?
    答:因为 ApplicationThread 的方法运行在 Binder 线程 中,而 Android 的 UI 系统是非线程安全的,必须通过 Handler 切换到主线程。
  3. Handler H 的作用?
    答:它是应用进程的“神经中枢”,负责将系统的异步调用同步化到主线程执行。