安卓Framework面经(4/20)AMS深入浅出
牛客高级系列专栏:
安卓(安卓系统开发也要掌握)
- 想通关安卓面试,请看:《150道安卓高频面试题目录及答案链接》
- 想通关安卓系统面试,请看:《140道安卓系统Framework面试题目录及答案链接》
- 想进阶安卓开发,请看:《Android进阶知识体系解析_15大安卓进阶必备知识点》
- 想了解安卓APP完整开发流程,请看:《安卓APP完整开发流程》
- 想掌握安卓App性能优化,请看:《安卓性能优化讲解和实战专栏》
- 想掌握Gradle语法,制作Gradle插件,请看:《安卓Gradle语法解析和实践大全》
嵌入式
- 想通关嵌入式面试,请看: 《111道嵌入式面试题目录及答案链接》
- 想多掌握几个嵌入式项目,请看:《6个嵌入式项目交流分享(附源码)》
- 本人是2020年毕业于广东工业大学研究生:许乔丹,有国内大厂CVTE和世界500强企业安卓开发经验,该专栏整理本人从嵌入式Linux转Android系统开发过程中对常见安卓系统开发面试题的理解;
- 1份外卖价格助您提高安卓面试准备效率,为您面试保驾护航!!
正文开始⬇
AMS是所有系统服务中,最常见的系统服务之一,也是日常开发中经常打交道的服务!
面试题预览
- AMS是什么?⭐⭐⭐⭐⭐
- AMS在Android起到什么作用,简单的分析下Android的源码。⭐⭐⭐⭐⭐
- 简述ActivityManagerService是什么时候初始化的?⭐⭐⭐
- 简述Binder、ActivityManagerNative、ActivityManagerService三者的关系⭐⭐⭐⭐
- 简述AMS的注册流程⭐⭐⭐⭐
- 简述ActivityThread和ApplicationThread,以及关系和区别⭐⭐⭐
- ActivityManagerService和zygote进程通信是如何实现的⭐⭐⭐
- 系统是如何存AMS服务对象的,以及应用层如何拿到AMS应用的?⭐⭐
- AMS与servicemanage进程是什么关系,app启动流程讲一讲。⭐⭐⭐⭐⭐
- 简述从点击图标到app启动的流程。⭐⭐⭐⭐⭐
1 概述
ActivityManagerService(以后简称AMS)是Android中最核心的服务,主要负责系统中四大组件的启动、切换、调度及应用进程的管理和调度等工作,其职责与操作系统中的进程管理和调度模块相类似。所有的APP应用都需要 与AMS互动。AMS服务架构几个重要组成部分:
- 服务代理:由ActivityManagerProxy实现,用于与Server端提供的系统服务进行进程间通信;
- 服务中枢:ActivityManagerNative继承自Binder并实现IActivityManager,它提供了服务接口和Binder接口的相互转化功能,并在内部存储服务代理对像,并提供了getDefault方法返回服务代理 ;
- Client:由ActivityManager封装一部分服务接口供Client调用。ActivityManager内部通过调用ActivityManagerNative的getDefault方法,可以得到一个ActivityManagerProxy对像的引用,进而通过该代理对像调用远程服务的方法 ;
- Server:由ActivityManagerService实现,提供Server端的系统服务; AMS服务运行在system_server进程中,AMS由SystemServer的ServerThread线程初始化,可以在SystemServer类中找到相关的启动代码。 Activity启动或停止会通知AMS,AMS决定是否执行动作。当Activity的数量>20时,最早入栈的Activity会被AMS给忘记,从而给新加进来了activity入栈。
2 AMS家族图谱
AMS由ActivityManagerNative(以后简称AMN)类派生,并实现Watchdog.Monitor和BatteryStatsImpl.BatteryCallback接口。而ActivityManagerNative继承自Binder并实现IActivityManager,它提供了服务接口和Binder接口的相互转化功能,并在内部存储服务代理对像,并提供了getDefault方法返回服务代理。
客户端使用ActivityManager类。由于AMS是系统核心服务,很多API不能开放供客户端使用,所以设计者没有让ActivityManager直接加入AMS家族。在ActivityManager类内部通过调用AMN的getDefault函数得到一个ActivityManagerProxy对象,通过它可与AMS通信。
3 AMS注册流程
其中ServiceManager就是一个服务端的角色,而AMS则是一个客户端的角色。
4 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主要代码位于:
- frameworks\base\core\java\android\app
- frameworks\base\services\java\com\android\server\am
5 AMS的重要数据结构
5.1 ActivityRecord
Activity管理的最小单位,它对应着一个用户界面 ActivityRecord是应用层Activity组件在AMS中的代表,每一个在应用中启动的Activity,在AMS中都有一个ActivityRecord实例来与之对应,这个ActivityRecord伴随着Activity的启动而创建,也伴随着Activity的终止而销毁。
5.2 TaskRecord
TaskRecord即任务栈,每一个TaskRecord都可能存在一个或多个ActivityRecord,栈顶的ActivityRecord表示当前可见的界面。一个App是可能有多个TaskRecord存在的,一般情况下,启动App的第一个activity时,AMS为其创建一个TaskRecord任务栈特殊情况,启动singleTask的Activity,而且为该Activity指定了和包名不同的taskAffiffiffinity,也会为该activity创建一个新的TaskRecord。
5.3 ActivityStack
ActivityStack是系统中用于管理TaskRecord的,内部维护了一个ArrayList。ActivityStackSupervisor内部有两个不同的ActivityStack对象:mHomeStack、mFocusedStack,用来管理不同的任务。我们启动的App对应的TaskRecord由非Launcher ActivityStack管理,它是在系统启动第一个app时创建的。
5.4 ActivityStackSupervisor
ActivityStackSupervisor管理着多个ActivityStack,但当前只会有一个获取焦点(Focused)的ActivityStack; AMS对象只会存在一个,在初始化的时候,会创建一个唯一的ActivityStackSupervisor对象
6 AMS的启动流程
系统启动, AMS启动前:
系统启动后Zygote进程第一个fork出SystemServer进程。SystemServer会启动各种服务
启动各种服务是在SystemServer.run()中调用的,该函数首先会设下sys.boot_completed为1,然后设置时区、语言、国家、locale等属性,接着就开始启动各种服务了:
// Start services.
try{
traceBeginAndSlog("StartServices");
startBootstrapServices();
startCoreServices();
startOtherServices();
SystemServerInitThreadPool.shutdown();
}catch(Throwable ex) {
Slog.e("System","******************************************");
Slog.e("System","************ Failure starting system services",ex);
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
2020年研究生毕业后,工作重心由嵌入式Linux转为安卓系统,Android发展已经很多年,网上面向中初级Android系统开发的面经还比较少,也不够集中,因此梳理出本专栏,本专栏收集了本人工作中持续积累的众多安卓系统知识,持续更新中。