大家好,欢迎来到IT知识分享网。
AMS 定义
ActivityManagerService(简称 AMS),是 Android 最核心的服务;因此其创建过程伴随在开机的过程中,其由 System_server 的 ServerThread 线程创建,创建完后就进入 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 思维导图及学习手册 获取方式:私信发送 “进阶”即可 直达获取
应用进程与 WMS 的通讯实现
- WindowManagerImpl & WindowManagerGlobal
- ViewRootImpl
- 从应用进程到管理者进程
- 从管理者进程到应用进程
应用进程之间的通讯实现
- 服务端编写 AIDL 文件
- 编写 Service
- 声明 Service
- 客户端编写 AIDL 文件
- 绑定服务,并调用
- IBinder实现原理
完整版 Android Framework 思维导图及学习手册 获取方式:私信发送 “进阶”即可 直达获取
既然选择了程序员这个行业,那么你一定要做好充足的准备;要想在人前显贵,背后所付出的辛劳和汗水就是必须的
Android 架构师之路还能漫长 与君共勉
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/123572.html