当前位置: 首页 > news >正文

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

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 思维导图及学习手册 获取方式: 私信发送 “进阶” 即可 直达获取

应用进程与 WMS 的通讯实现

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

应用进程之间的通讯实现

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

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

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

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

相关文章:

  • 工业场景全流程!机器学习开发并部署服务到云端
  • 真无线耳机哪个好?真无线耳机性价比排行榜
  • IDL学习:语法基础-程序控制
  • 市场调研团体怎么使用无人系统生产更安全
  • [ 常用工具篇 ] AntSword 蚁剑安装及使用详解
  • 百度校园招聘历年经典面试题汇总:测试开发
  • 支撑Java NIO 与 NodeJS的底层技术
  • vue2+element 通用表格组件封装
  • Symbol Table
  • LeetCode所有大于等于节点的值之和
  • 基站天线交叉极化比测量的不确定度评定
  • RTL8367/N/RB/S/SC系列千兆交换机方案选型参考
  • GO 调用 python3 (基于ubuntu) 实现人脸识别
  • 澳利率攀升,加息步伐将在某个时候放缓
  • AOP实现系统告警
  • (三)从jvm层面了解线程的启动和停止
  • es6
  • es6要点
  • JDK9: 集成 Jshell 和 Maven 项目.
  • Js基础——数据类型之Null和Undefined
  • Python语法速览与机器学习开发环境搭建
  • react-native 安卓真机环境搭建
  • Sequelize 中文文档 v4 - Getting started - 入门
  • Spark in action on Kubernetes - Playground搭建与架构浅析
  • SpiderData 2019年2月25日 DApp数据排行榜
  • 测试开发系类之接口自动化测试
  • 从0到1:PostCSS 插件开发最佳实践
  • 短视频宝贝=慢?阿里巴巴工程师这样秒开短视频
  • 浮现式设计
  • 三栏布局总结
  • 推荐一款sublime text 3 支持JSX和es201x 代码格式化的插件
  • 教程:使用iPhone相机和openCV来完成3D重建(第一部分) ...
  • 资深实践篇 | 基于Kubernetes 1.61的Kubernetes Scheduler 调度详解 ...
  • # 达梦数据库知识点
  • #include
  • (4)logging(日志模块)
  • (a /b)*c的值
  • (ZT)出版业改革:该死的死,该生的生
  • (附源码)apringboot计算机专业大学生就业指南 毕业设计061355
  • (附源码)计算机毕业设计SSM智能化管理的仓库管理
  • (更新)A股上市公司华证ESG评级得分稳健性校验ESG得分年均值中位数(2009-2023年.12)
  • (紀錄)[ASP.NET MVC][jQuery]-2 純手工打造屬於自己的 jQuery GridView (含完整程式碼下載)...
  • (接口自动化)Python3操作MySQL数据库
  • (十二)springboot实战——SSE服务推送事件案例实现
  • (未解决)jmeter报错之“请在微信客户端打开链接”
  • (已更新)关于Visual Studio 2019安装时VS installer无法下载文件,进度条为0,显示网络有问题的解决办法
  • (原創) 物件導向與老子思想 (OO)
  • *** 2003
  • ***通过什么方式***网吧
  • ..回顾17,展望18
  • .NET 8 中引入新的 IHostedLifecycleService 接口 实现定时任务
  • .Net Core与存储过程(一)
  • .net FrameWork简介,数组,枚举
  • .Net Remoting(分离服务程序实现) - Part.3
  • .net 受管制代码