Android Framework 框架层 | AMS 定义与知识点梳理

Android Framework 框架层 | AMS 定义与知识点梳理_第1张图片

AMS 定义

ActivityManagerService(简称 AMS),是 Android核心服务;因此其创建过程伴随在开机过程中,其由 System_serverServerThread 线程创建,创建完后就进入 home activity 界面,也就是 AMS 启动的第一个 activity

从系统运行的角度看: AMS 可以分为 Client 端和 Service 端

  • Client 端运行在各个 app 进程,app 进程实现了具体的 Activity,Service 等,告诉系统我要那些 Activity,Service 等,并且调用系统接口来完成显示
  • Service 端运行在 SystemServer 进程,是系统级别的 ActivityManagerService 的具体实现,其响应 Client 端的系统调用请求,并且管理 Client 端各个 app 进程的生命周期

AMS 功能

AMS 主要负责系统中四大组件的启动、切换、及进程管理调度等工作;根据其主要的职能,可以从以下几个方面AMS 进行学习:

  • AMS 的创建及初始化过程
  • AMS 对于 Activity 的管理
  • AMS 对于 Broadcast 的管理
  • AMS 对于 Service 的管理
  • AMS 对于 ContentProvider 的管理
  • AMS 对于 Process 的管理

AMS 关键函数

  • AMS 的 main 函数: 创建 AMS 实例,其中最重要的工作是创建 Android 运行环境,得到一个 ActivityThread 和一个 Context对象

  • AMS 的 setSystemProcess 函数: 该函数注册 AMS 和 meminfo 等服务到 ServiceManager 中;另外,它为 SystemServer 创建了一个 ProcessRecord 对象;由于 AMS 是 Java 世界的进程管理及调度中心,要做到对 Java 进程一视同仁,尽管 SystemServer 贵为系统进程,此时也不得不将其并入 AMS 的管理范围内

  • AMS 的 installSystemProviders: 为 SystemServer 加载 SettingsProvider

  • AMS的systemReady: 做系统启动完毕前最后一些扫尾工作;该函数调用完毕后,HomeActivity 将呈现在用户面前

对AMS 调用轨迹分析是我们破解AMS的第一条线,希望读者反复阅读,以真正理解其中涉及的知识点,尤其是和 Android 运行环境及 Context 相关的知识,接下来深入了解下 AMS 的主要作用和启动流程

AMS 主要作用

统一调度 Activity

AMS 中的重要数据类:
  • ProcessReccord: 保存该进程中包含的APK信息、内存状态信息用于内存回收、组件列表
  • ActivityRecord: binder 类可用于IPC调用(此处为WMS中调用),保存所有Acitivity信息,包括基本属性信息(包名、进程名、文件路径、图标主题等)和运行状态信息(idle、stop、finishing等)
  • TaskRecord: 任务栈信息,管理Activity的启动和退出顺序

除此之外,在 frameworks\base\services\core\java\com\android\server\am 路径中,还有 serviceRecord、ProviderRecord、BoardRecord、ProcessRecord、UidRecord 等近50个 AMS 相关的类

重要变量

如后台的 Activity 和近期任务的 Activity 最多20个,onpause 必须在0.5秒内执行完,Activity 必须在10秒内完成启动并回调给 AMS

启动 Activity

Acitivity 的启动最终都会调用 startActivity(),总体上就是 ActivityThread和 AMS 和 WMS 的交互过程 Application 加载后,先加载 provider,然后才加载 Activity

AMS 启动流程

  • 系统启动后 Zygote 进程第一个 fork 出 SystemServer 进程
  • SystemServer->run()->createSystemContext(): 创建了系统的 ActivityThread 对象,运行环境 mSystemContext、systemUiContext
  • SystemServer->run()->startBootstrapServices()->ActivityManagerService.Lifecycle.startService(): AMS 在引导服务启动方法中,通过构造函数 new Activity ManagerService()进行了一些对象创建和初始化(除 activity 外3大组件的管理和调度对象创建
  • 内存、电池、权限、性能、cpu等的监控等相关对象创建),start()启动服务 (移除进程组、启动 cpu 线程、注册权限、电池等服务)
  • SystemServer->run()->startBootstrapServices()->setSystemServiceManager()、setInstaller()、initPowerManagement()、setSystemProcess():AMS 创建后进行了一系列相关的初始化和设置
  • setSystemProcess(): 将 framework-res.apk 的信息加入到 SystemServer 进程的 LoadedApk 中,并创建了 SystemServer 进程的 ProcessRecord,加入到 mPidsSelfLocked,由 AMS 统一管理
  • SystemServer->run()->startOtherServices() AMS 启动后的后续工作,主要调用 systemReady()和运行调用时传入的 goingCallback
  • systemReady()/goingCallback: 各种服务或进程等 AMS 启动完成后需进一步完成的工作及系统相关初始化
  • 桌面应用在 systemReady()方法中启动,systemui在goingCallback 中完成;当桌面应用启动完成后,发送开机广播 ACTION_BOOT_COMPLETED

总结

AMS (ActivityManagerService) Android 的核心服务之一,管理着四大组件;AMS 是 Binder 服务,但不是通过 AIDL 自动生成的;好了,今天有关于 AMS 的框架设计的阐述就到这里了;为了帮助大家了解更多 Android Framework 框架层 必备的技术知识,这里特别提供一份由腾讯大佬所整理的一张 Framework 思维导图及其配套的一份学习手册;有需要思维导图及学习笔记的朋友: 可以私信发送 “进阶” 即可 直达获取;希望大家看完之后能给大家一些帮助

内容展示如下:

Android Framework 思维导图

应用程序与 AMS 的通讯实现

  • 从应用程序进程到管理者进程
  • 应用程序进程向管理者进程发送消息
  • 从管理者进程到应用程序进程
  • 管理者进程向应用程序进程发送消息
  • 用户进程接收消息

Android Framework 框架层 | AMS 定义与知识点梳理_第2张图片

完整版 Android Framework 思维导图及学习手册 获取方式: 私信发送 “进阶” 即可 直达获取

应用进程与 WMS 的通讯实现

  • WindowManagerImpl & WindowManagerGlobal
  • ViewRootImpl
  • 从应用进程到管理者进程
  • 从管理者进程到应用进程

Android Framework 框架层 | AMS 定义与知识点梳理_第3张图片

应用进程之间的通讯实现

  • 服务端编写 AIDL 文件
  • 编写 Service
  • 声明 Service
  • 客户端编写 AIDL 文件
  • 绑定服务,并调用
  • IBinder实现原理

Android Framework 框架层 | AMS 定义与知识点梳理_第4张图片

完整版 Android Framework 思维导图及学习手册 获取方式: 私信发送 “进阶” 即可 直达获取

既然选择了程序员这个行业,那么你一定要做好充足的准备;要想在人前显贵,背后所付出的辛劳和汗水就是必须的

Android 架构师之路还能漫长,与君共勉

你可能感兴趣的:(架构师,Android开发,Android,Framework,android,java,开发语言,AMS,开源)