安卓Framework面经(4/20)AMS深入浅出

牛客高级系列专栏:

安卓(安卓系统开发也要掌握)


嵌入式


  • 本人是2020年毕业于广东工业大学研究生:许乔丹,有国内大厂CVTE和世界500强企业安卓开发经验,该专栏整理本人从嵌入式Linux转Android系统开发过程中对常见安卓系统开发面试题的理解;
  • 1份外卖价格助您提高安卓面试准备效率,为您面试保驾护航!!

正文开始⬇

AMS是所有系统服务中,最常见的系统服务之一,也是日常开发中经常打交道的服务!

面试题预览

  1. AMS是什么?⭐⭐⭐⭐⭐
  2. AMS在Android起到什么作用,简单的分析下Android的源码。⭐⭐⭐⭐⭐
  3. 简述ActivityManagerService是什么时候初始化的?⭐⭐⭐
  4. 简述Binder、ActivityManagerNative、ActivityManagerService三者的关系⭐⭐⭐⭐
  5. 简述AMS的注册流程⭐⭐⭐⭐
  6. 简述ActivityThread和ApplicationThread,以及关系和区别⭐⭐⭐
  7. ActivityManagerService和zygote进程通信是如何实现的⭐⭐⭐
  8. 系统是如何存AMS服务对象的,以及应用层如何拿到AMS应用的?⭐⭐
  9. AMS与servicemanage进程是什么关系,app启动流程讲一讲。⭐⭐⭐⭐⭐
  10. 简述从点击图标到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家族图谱

alt

AMS由ActivityManagerNative(以后简称AMN)类派生,并实现Watchdog.Monitor和BatteryStatsImpl.BatteryCallback接口。而ActivityManagerNative继承自Binder并实现IActivityManager,它提供了服务接口和Binder接口的相互转化功能,并在内部存储服务代理对像,并提供了getDefault方法返回服务代理。

客户端使用ActivityManager类。由于AMS是系统核心服务,很多API不能开放供客户端使用,所以设计者没有让ActivityManager直接加入AMS家族。在ActivityManager类内部通过调用AMN的getDefault函数得到一个ActivityManagerProxy对象,通过它可与AMS通信。

3 AMS注册流程

alt

其中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  alt alt alt

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。

alt

5.3 ActivityStack

ActivityStack是系统中用于管理TaskRecord的,内部维护了一个ArrayList。ActivityStackSupervisor内部有两个不同的ActivityStack对象:mHomeStack、mFocusedStack,用来管理不同的任务。我们启动的App对应的TaskRecord由非Launcher ActivityStack管理,它是在系统启动第一个app时创建的。

alt

5.4 ActivityStackSupervisor

ActivityStackSupervisor管理着多个ActivityStack,但当前只会有一个获取焦点(Focused)的ActivityStack; AMS对象只会存在一个,在初始化的时候,会创建一个唯一的ActivityStackSupervisor对象

alt

6 AMS的启动流程

系统启动, AMS启动前:

alt

系统启动后Zygote进程第一个fork出SystemServer进程。SystemServer会启动各种服务

alt

启动各种服务是在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%内容,订阅专栏后可继续查看/也可单篇购买

Android系统面试题全解析 文章被收录于专栏

2020年研究生毕业后,工作重心由嵌入式Linux转为安卓系统,Android发展已经很多年,网上面向中初级Android系统开发的面经还比较少,也不够集中,因此梳理出本专栏,本专栏收集了本人工作中持续积累的众多安卓系统知识,持续更新中。

全部评论
大佬 你的图都崩了
3 回复 分享
发布于 2024-03-22 14:49 上海
图呢,更新一下
1 回复 分享
发布于 2024-04-28 17:25 上海
6 7 的图挂了
点赞 回复 分享
发布于 2024-08-04 12:40 上海
大佬 图崩了
点赞 回复 分享
发布于 2024-08-14 11:13 广东
安卓目前就业如何啊。。。感觉不太好? 有懂哥吗
点赞 回复 分享
发布于 2024-09-08 23:04 山东
6,7的图都看不到了
点赞 回复 分享
发布于 2024-11-26 11:09 广东

相关推荐

01-15 13:52
已编辑
河南大学 Java
六年要多久:标准头像,不吃香菜😂
点赞 评论 收藏
分享
评论
3
7
分享

创作者周榜

更多
牛客网
牛客企业服务