1. AMS是如何管理进程的
AMS - ProcessList - ProcessRecord - AppThread AMS是记录了一个Application进程的binder(ApplicationThread-)的列表
2. ActvityManagerServcie的重要功能:
start()函数知道: 1)启动 CPU 监控线程; 2) 注册电池状态和权限管理服务
startObservingNativeCrashes()函数知道: 监听所有的crash事件
setSystemProcess()函数知道: 添加各种管理app状态信息的服务还有进程等等信息
3. Application 启动流程
简单理解:launcher进程的ActivityManagerProxy代理类发送请求到SystemServer,systemServer请求zygote去fork新进程,从system_server的AMS中取出对应的binder-ApplicationThreadProxy,然后启动app的Activity。
4. SystemServer关系图和流程图
5.Activity Manager的组成
ActivityManagerService是
Android
系统中一个特别重要的系统服务,也是我们上层
APP
打交道最多的系 统服务之一。ActivityManagerService
(以下简称
AMS
) 主要负责四大组件的启动、切换、调度以及应 用进程的管理和调度工作。所有的APP
应用都需要 与AMS
打交道。
1.服务代理:由ActivityManagerProxy实现,用于与Server端提供的系统服务进行进程间通信
2.服务中枢:ActivityManagerNative继承自Binder并实现IActivityManager,它提供了服务接口和
Binder接口的相互转化功能,并在内部存储服务代理对像,并提供了getDefault方法返回服务代理
3.Client:由ActivityManager封装一部分服务接口供Client调用。ActivityManager内部通过调用
ActivityManagerNative的getDefault方法,可以得到一个ActivityManagerProxy对像的引用,进而通过
该代理对像调用远程服务的方法
4.Server:由ActivityManagerService实现,提供Server端的系统服务
------ActivityManagerProxy--Service/server
6. ActivityManagerService
的启动过程
SystemServer类:
AMS是在SystemServer中被添加的, 所以先到SystemServer中查看初始化
SystemServer.run(){startBootTraceServices()} ----->
//启动了AMS
mActivityManagerService = mSystemServiceManager.startService(
ActivityManagerService.Lifecycle.class).getService();
//设置systemServiceManager - 由SystemServer管理
mActivityManagerService.setSystemServiceManager(mSystemServiceManager);
SystemServiceManager类:
//AMS是通过SystemServiceManager.startService去启动的,参数是
ActivityManagerService.Lifecycle.class, 首先看看startService方法
startService方法很简单,是通过传进来的class然后反射创建对应的service服务。所以此处创建的是
Lifecycle的实例, 然后通过startService启动了AMS服务
//ActivityManagerService.Lifecycle类 继承自SystemService,启动ActivityManagerService
ActivityManagerService类 AMS做了什么
//赋值mContext mContext = systemContext;
//获取当前的ActivityThread mSystemThread = ActivityThread.currentActivityThread();
//赋值mUiContext mUiContext = mSystemThread.getSystemUiContext();
//创建Handler线程,用来处理handler消息 mHandlerThread = new ServiceThread(TAG,THREAD_PRIORITY_FOREGROUND, false /*allowIo*/);
//管理AMS的一些常量,厂商定制系统就可能修改此处 mConstants = new ActivityManagerConstants(this, mHandler);
//初始化管理前台、后台广播的队列, 系统会优先遍历发送前台广播 mFgBroadcastQueue = new BroadcastQueue(this,mHandler,"foreground", BROADCAST_FG_TIMEOUT, false);
//初始化管理Service的 ActiveServices对象 mServices = new ActiveServices(this);
//初始化Provider的管理者 mProviderMap = new ProviderMap(this);
//初始化APP错误日志的打印器 mAppErrors = new AppErrors(mUiContext, this);
//创建电池统计服务, 并输出到指定目录 File dataDir = Environment.getDataDirectory();
//创建进程统计分析服务,追踪统计哪些进程有滥用或不良行为 : mBatteryStatsService.getActiveStatistics().getIsOnBattery();
//加载Uri的授权文件 mGrantFile = new AtomicFile(new File(systemDir, "urigrants.xml"),"uri-grants");
//负责管理多用户 mUserController = new UserController(this);
//vr功能的控制器 mVrController = new VrController(this);
//初始化OpenGL版本号 GL_ES_VERSION = SystemProperties.getInt("ro.opengles.version",ConfigurationInfo.GL_ES_VERSION_UNDEFINED);
//管理ActivityStack的重要类,这里面记录着activity状态信息,是AMS中的核心类 mStackSupervisor = createStackSupervisor();
.....
//启动一个线程专门跟进cpu当前状态信息,AMS对当前cpu状态了如指掌,可以更加高效的安排其他工作 mProcessCpuThread = new Thread("CpuTracker")
//看门狗,监听进程。这个类每分钟调用一次监视器。 如果进程没有任何返回就杀掉 Watchdog.getInstance().addMonitor(this);
//ActivityManagerService类
1. 在SystemServer中,在startBootstrapServices()中去启动了AMS,调用了mActivityManagerService.setSystemProcess();
2. set()方法中调用了ServiceManager.addService(..)..
注册服务。首先将ActivityManagerService注册到ServiceManager中,其次将几个与系统性能调试相关的服务注册到ServiceManager。
•查询并处理ApplicationInfo。首先调用PackageManagerService的接口,查询包名为android的应用程序的ApplicationInfo信息,对应于framework-res.apk。然后以该信息为参数调用ActivityThread上的installSystemApplicationInfo方法。
•创建并处理ProcessRecord。调用ActivityManagerService上的newProcessRecordLocked,创建一个ProcessRecord类型的对象,并保存该对象的信息
7. AMS是什么?
1. 从 java 角度来看, ams 就是一个 java 对象,实现了 Ibinder 接口,所以它是一个用于进程之间通信的 接口,这个对象初始化是在systemServer.java 的 run() 方法里面2. AMS 是一个服务ActivityManagerService从名字就可以看出,它是一个服务,用来管理 Activity ,而且是一个系统服 务,就是包管理服务,电池管理服务,震动管理服务等。3. AMS 是一个 Binderams实现了 Ibinder 接口,所以它是一个 Binder ,这意味着他不但可以用于进程间通信,还是一个 线程,因为一个Binder 就是一个线程。 如果我们启动一个hello World 安卓用于程序,里面不另外启动其他线程,这个里面最少要启动 4 个 线程1 main线程,只是程序的主线程,也是日常用到的最多的线程,也叫 UI 线程,因为 android 的组 件是非线程安全的,所以只允许UI/MAIN 线程来操作。2 GC线程, java 有垃圾回收机制,每个 java 程序都有一个专门负责垃圾回收的线程,3 Binder1 就是我们的 ApplicationThread ,这个类实现了 Ibinder 接口,用于进程之间通信,具体 来说,就是我们程序和AMS 通信的工具4 Binder2 就是我们的 ViewRoot.W 对象,他也是实现了 IBinder接口,就是用于我们的应用程序和 wms通信的工具。 wms就是WindowManagerServicer ,和 ams 差不多的概念,不过他是管理窗口的系统服务。public class ActivityManagerService extends IActivityManager . Stub implements Watchdog . Monitor , BatteryStatsImpl . BatteryCallback {}
8.
AMS
相关重要类-需细
ProcessRecord 数据结构
第一类数据:描述身份的数据
第二类数据:描述进程中组件的数据
第三类数据:描述进程状态的数据
第四类数据:和pss相关的数据
第五类数据:和时间相关的数据
第六类数据:crash和anr相关的数据
第七类数据:和instrumentation相关的数据
第八类数据:电源信息和调试信息
第九类数据:31个boolean值
1.进程声明周期相关的
2.组件状态影响进程行为的
3.其他
进程主要占用的资源:ProcessRecord容器 和 组件记录表的容器
...
...
内部四大组件记录表的容器
组件运行才是进程存在的意义,由于android系统进程间的无缝结合,所以系统需要控制到组件级别,
所有的组件信息都需要映射到系统,一个ActivityRecord记录对应一个Activity的信息,一个
ServiceRecord记录对应一个Service的信息,一个ConnectionRecord记录对应一个bind service的客户
端信息,一个ReceiverList对应处理同一事件的一组广播,一个ContentProviderRecord记录对应一个
ContentProvider信息,一个ContentProviderConnection对应一个进程中的所有ContentProvider客户
端
activity记录
1. activities:ActivityRecord的容器,进程启动的所有的activity组件记录表
service记录
1.services:ServiceRecord的容器,进程启动的所有的service组件记录表
2.executingServices:正在运行(executing)的ServiceRecord是怎么定义的?首先需要明确的是
系统是怎么控制组件的?发送消息给apk进程,apk进程处理消息,上报消息完成,这被定义为一
个完整的执行过程,因此正在执行(executing)被定义为发送消息到上报完成这段时间
3.connections:ConnectionRecord容器,绑定service的客户端记录表
广播接收器记录
1.receivers:ReceiverList容器,广播接收器的记录表
ContentProvider记录
1.pubProviders:名字到ContentProviderRecord的映射容器,pub是publish(发布)的意思,
ContentProvider需要安装然后把自己发布到系统(AMS)中后,才能使用,安装指的是apk进程
加载ContentProvider子类、初始化、创建数据库等过程,发布是将ContentProvider的binder客
户端注册到AMS中
2.conProviders:ContentProviderConnection容器,使用ContentProvider的客户端记录表
与Activity管理有关的数据结构
ActivityRecord
ActivityRecord,源码中的注释介绍:An entry in the history stack, representing an activity.
翻译:历史栈中的一个条目,代表一个activity。
ActivityRecord中存在着大量的成员变量,包含了一个Activity的所有信息。
ActivityRecord中的成员变量task表示其所在的TaskRecord,由此可以看出:ActivityRecord与
TaskRecord建立了联系
\frameworks\base\services\core\java\com\android\server\am\ActivityStarter.java
TaskRecord
TaskRecord,内部维护一个 ArrayList<ActivityRecord> 用来保存ActivityRecord。
\frameworks\base\services\core\java\com\android\server\am\TaskRecord.java
可以看到TaskRecord中使用了一个ArrayList来保存所有的ActivityRecord。 同样,TaskRecord中的mStack表示其所在的ActivityStack。 startActivity()时也会创建一个TaskRecord
ActivityStarter
frameworks/base/services/core/java/com/android/server/am/ActivityStarter.java
ActivityStack
ActivityStack,内部维护了一个 ArrayList<TaskRecord> ,用来管理`TaskRecord
可以看到ActivityStack使用了一个ArrayList来保存TaskRecord。 另外,ActivityStack中还持有ActivityStackSupervisor对象,这个是用来管理ActivityStacks的。ActivityStack是由ActivityStackSupervisor来创建的,实际ActivityStackSupervisor就是用来管理
ActivityStackSupervisor
ActivityStackSupervisor,顾名思义,就是用来管理ActivityStack的
frameworks/base/services/core/java/com/android/server/am/ActivityStackSupervisor.java
ActivityStackSupervisor内部有两个不同的ActivityStack对象:mHomeStack、mFocusedStack,用来管理不同的任务。
ActivityStackSupervisor内部包含了创建ActivityStack对象的方法。AMS初始化时会创建一个ActivityStackSupervisor对象
9. Activity启动流程相关
Launcher
请求
AMS
阶段
AMS
到
ApplicationThread
阶段

ApplicationThread
到
Activity
阶段

API28重构之后
