Android AMS(一)服务启动过程

411 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第 2 天,点击查看活动详情

AMS,全称 ActivityManagerService,负责 Android 系统四大组件(Activities、Services、Broadcast receivers、Content prviders)以及应用进程的生命周期管理,类似于操作系统中的进程管理调度模块。

AMS 运行在 system_server 进程中。

基于源码 tag:android-13.0.0_r8

启动过程

启动调用时序

源文件:frameworks/base/services/java/com/android/server/SystemServer.java

SystemServer::main() -> run() -> startBootstrapService(TimingsTraceAndSlog) -> ActivityManagerService.Lifecycle.startService(SystemServiceManager, ActivityTaskManagerService)

说明:开机时,将会加载 system_server 进程,AMS 将会完成注册和初始化。

初始化

一个系统服务,一般继承自 SystemService。但 AMS 并没有这么做,而是通过一个内部静态类 ActivityManagerService.Lifecycle 继承 SystemService,间接完成服务的初始化和注册。

个人理解,这样做是为了降低了 SystemService 子类的复杂度,方便理解整体结构,掌握核心流程——查看 ActivityManagerService.java 源文件发现有 18480 行。如果不这么做,阅读源码时想必会比较痛苦。

说到源码行数,其实安卓团队考虑到 AMS 的复杂度越来越高,在 Android 10 以后,将一部分职责(管理 Activities及它的容器,如任务栈、显示器)抽离出来,新增了一个系统服务 ActivityTaskManagerService,简称 ATMS,目前并未开放给开发者使用。

此处为了简化理解,笔者并未把 ATMS 单独拎出来讲,因为它的出现本质上是为了降低源码的理解复杂度,避免 AMS 越来越臃肿。但还请读者记住这点区别。

初始化主要看两个地方:ActivityManagerService(Context,ActivityTaskManagerService)start()。初始化了三个重要的服务:

  • 电池电量统计服务 BatteryStatsService:收集了运行时所有会影响电池性能的信息。
  • 应用权限管理服务 AppOpsService:管理应用的各种权限。
  • 进程状态统计服务 ProcessStatsService:追踪长期执行的进程,确保系统资源不被滥用,阻止进程恶意的行为。

如何使用

应用无法直接获取 AMS 服务,但可以通过其代理类 ActivityManager 访问 AMS 的部分能力。

获取服务

熟悉应用开发的应该很了解,可以通过 Context.getSystemService(String) 获取到系统提供的服务。

如果希望获取 AMS 相关的服务,则可以,

val ams = context.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager

应用层通过 ActivityManager,利用 AIDL(一种 binder 通信的应用方式)发起跨进程调用,从而访问 AMS 服务,使用其提供的能力。