面试官: AMS在Android起到什么作用,简单的分析下Android的源码
心理分析:这道题在发生在大多数场景下。面对这道题 很多求职很茫然,不知道该如何说起。AMS本身比较复杂难以理解。工作多年也很难弄清AMS的作用,其实我们大可从以下几点入手组件启动、进程切换、Crash异常入手
求职者:AMS难以表述 我们就从最熟知 的Activity启动入手,逐步深入和分析,用定力告诉面试官,我层深入研究过。接下来我们从五条线分析AMS作用及机制
概述
相信大多数动脑同学对文章中提到的ActivityManagerService(以后简称AMS)都有所耳闻。
AMS是Android中最核心的服务,主要负责系统中四大组件的启动、切换、调度及应用进程的管理和调度等工作,其职责与操作系统中的进程管理和调度模块相类似,因此它在Android中非常重要。 AMS是碰到的第一块难啃的骨头[①],涉及的知识点较多。为了帮助读者更好地理解AMS,接下来将带小伙伴么按五条不同的线来分析它。
-
第一条线:同其他服务一样,将分析SystemServer中AMS的调用轨迹。
-
第二条线:以am命令启动一个Activity为例,分析应用进程的创建、Activity的启动,以及它们和AMS之间的交互等知识。
-
第三条线和第四条线:分别以Broadcast和Service为例,分析AMS中Broadcast和Service的相关处理流程。
-
第五条线:以一个Crash的应用进程为出发点,分析AMS如何打理该应用进程的身后事。 除了这五条线外,还将统一分析在这五条线中频繁出现的与AMS中应用进程的调度、内存管理等相关的知识。 提示ContentProvider将放到下一章分析,不过本章将涉及和ContentProvider有关的知识点。 先来看AMS的家族图谱:
由图可知:
-
AMS由ActivityManagerNative(以后简称AMN)类派生,并实现Watchdog.Monitor和BatteryStatsImpl.BatteryCallback接口。而AMN由Binder派生,实现了IActivityManager接口。
-
客户端使用ActivityManager类。由于AMS是系统核心服务,很多API不能开放供客户端使用,所以设计者没有让ActivityManager直接加入AMS家族。在ActivityManager类内部通过调用AMN的getDefault函数得到一个ActivityManagerProxy对象,通过它可与AMS通信。
AMS由SystemServer的ServerThread线程创建;
1. 初识ActivityManagerService总结
本节所分析的4个关键函数均较复杂,与之相关的知识点总结如下:
-
AMS的main函数:创建AMS实例,其中最重要的工作是创建Android运行环境,得到一个ActivityThread和一个Context对象。
-
AMS的setSystemProcess函数:该函数注册AMS和memi