Android Framework之AMS
一,定义
从java角度来看,ams就是一个java对象,实现了Ibinder接口,所以它是一个用于进程之间通信的接口,这个对象初始化是在systemServer.java 的run()方法里面
1
2
3
4public Lifecycle(Context context) {
super(context);
mService = new ActivityManagerService(context);
}
AMS是一个服务
ActivityManagerService从名字就可以看出,它是一个服务,用来管理Activity,而且是一个系统服务,就是包管理服务,电池管理服务,震动管理服务等。
ActivityManagerService是Android系统中一个特别重要的系统服务,也是我们上层APP打交道最多的系统服务之一。ActivityManagerService(以下简称AMS) 主要负责四大组件的启动、切换、调度以及应用进程的管理和调度工作。所有的APP应用都需要与AMS打交道
Activity Manager的组成主要分为以下几个部分:
- 服务代理:由ActivityManagerProxy实现,用于与Server端提供的系统服务进行进程间通信
- 服务中枢:ActivityManagerNative继承自Binder并实现IActivityManager,它提供了服务接口和Binder接口的相互转化功能,并在内部存储服务代理对像,并提供了getDefault方法返回服务代理
- Client:由ActivityManager封装一部分服务接口供Client调用。ActivityManager内部通过调用ActivityManagerNative的getDefault方法,可以得到一个ActivityManagerProxy对像的引用,进而通过该代理对像调用远程服务的方法
- Server:由ActivityManagerService实现,提供Server端的系统服务
AMS是一个Binder
ams实现了Ibinder接口,所以它是一个Binder,这意味着他不但可以用于进程间通信,还是一个线程,因为一个Binder就是一个线程。
如果我们启动一个hello World安卓用于程序,里面不另外启动其他线程,这个里面最少要启动4个线程
- main线程,只是程序的主线程,也是日常用到的最多的线程,也叫UI线程,因为android的组
件是非线程安全的,所以只允许UI/MAIN线程来操作。
GC线程,java有垃圾回收机制,每个java程序都有一个专门负责垃圾回收的线程,
Binder1 就是我们的ApplicationThread,这个类实现了Ibinder接口,用于进程之间通信,具体来说,就是我们程序和AMS通信的工具
Binder2 就是我们的ViewRoot.W对象,他也是实现了IBinder接口,就是用于我们的应用程序和wms通信的工具。
1
public class ActivityManagerService extends IActivityManager.Stub implements Watchdog.Monitor, BatteryStatsImpl.BatteryCallback {}
二,ActivityManagerService的启动过程
AMS是在SystemServer中被添加的, 所以先到SystemServer中查看初始化
1 | public static void main(String[] args) { |
1 | private void run() { |
在SystemServer中,在startBootstrapServices()中去启动了AMS
1 | private void startBootstrapServices() { |
AMS是通过SystemServiceManager.startService去启动的,参数是ActivityManagerService.Lifecycle.class, 首先看看startService方法
1 | public <T extends SystemService> T startService(Class<T> serviceClass) { |
1 | public void startService(final SystemService service) { |
startService方法很简单,是通过传进来的class然后反射创建对应的service服务。所以此处创建的是Lifecycle的实例, 然后通过startService启动了AMS服务
那我们再去看看ActivityManagerService.Lifecycle这个类的构造方法
1 | public static final class Lifecycle extends SystemService { |
再来看看AMS初始化做了什么
1 |
|
1 | private void start() { |
然后来看看setSystemProcess 干了什么事情
1 | public void setSystemProcess() { |
注册服务。首先将ActivityManagerService注册到ServiceManager中,其次将几个与系统性能调试相关的服务注册到ServiceManager。
查询并处理ApplicationInfo。首先调用PackageManagerService的接口,查询包名为android的应用程序的ApplicationInfo信息,对应于framework-res.apk。然后以该信息为参数调用ActivityThread上的installSystemApplicationInfo方法。
创建并处理ProcessRecord。调用ActivityManagerService上的newProcessRecordLocked,创建一个ProcessRecord类型的对象,并保存该对象的信息
三,与Activity管理有关的数据结构
ActivityRecord
ActivityRecord,源码中的注释介绍:An entry in the history stack, representing an activity.翻译:历史栈中的一个条目,代表一个activity。
1 | /** |
ActivityRecord中存在着大量的成员变量,包含了一个Activity的所有信息。ActivityRecord中的成员变量task表示其所在的TaskRecord,由此可以看出:ActivityRecord与TaskRecord建立了联系
1 | \frameworks\base\services\core\java\com\android\server\am\ActivityStarter.java |
TaskRecord
TaskRecord,内部维护一个 ArrayList
1 | \frameworks\base\services\core\java\com\android\server\am\TaskRecord.java |
可以看到ActivityStack使用了一个ArrayList来保存TaskRecord。另外,ActivityStack中还持有ActivityStackSupervisor对象,这个是用来管理ActivityStacks的。
ActivityStack是由ActivityStackSupervisor来创建的,实际ActivityStackSupervisor就是用来管理ActivityStack的
ActivityStackSupervisor
ActivityStackSupervisor,顾名思义,就是用来管理ActivityStack的
1 | frameworks/base/services/core/java/com/android/server/am/ActivityStackSupervisor.java |
ActivityStackSupervisor内部有两个不同的ActivityStack对象:mHomeStack、mFocusedStack,用来
管理不同的任务。
ActivityStackSupervisor内部包含了创建ActivityStack对象的方法。
AMS初始化时会创建一个ActivityStackSupervisor对象
四,应用启动流程
总结
Launcher进程请求AMS
点击图标发生在 Launcher 应用的进程,实际上执行的是 Launcher 的 onClick 方法,在 onClick 里面会执行到Activity 的 startActivity 方法。 startActivity 会调用 mInstrumentation.execStartActivity(); execStartActivity 通过 ActivityManager 的 getService 方法来得到 AMS 的代理对象( Launcher 进程作为客户端与服务端 AMS 不在同一个进程, ActivityManager.getService 返回的是 IActivityManager.Stub 的代理对象,此时如果要实现客户端与服务端进程间的通信, 需要 AMS 继承 IActivityManager.Stub 类并实现相应的方法,这样Launcher进程作为客户端就拥有了服务端AMS的代理对象,然后就可以调用AMS的方法来实现具体功能了)
AMS发送创建应用进程请求,Zygote进程接受请求并fork应用进程
AMS 通过 socket 通信告知 Zygote 进程 fork 子进程。应用进程启动 ActivityThread ,执行 ActivityThread 的 main 方法。main 方法中创建 ApplicationThread , Looper , Handler 对象,并开启主线程消息循环 Looper.loop()
App进程通过Binder向AMS(sytem_server)发起attachApplication请求,AMS绑定ApplicationThread
在 ActivityThread 的 main 中,通过 ApplicationThread.attach(false, startSeq) ,将 AMS 绑定ApplicationThread 对象,这样 AMS 就可以通过这个代理对象 来控制应用进程。
AMS发送启动Activity的请求
system_server 进程在收到请求后,进行一系列准备工作后,再通过 binder 向App进程发送scheduleLaunchActivity 请求; AMS 将启动 Activity 的请求发送给 ActivityThread 的 Handler 。
ActivityThread的Handler处理启动Activity的请求
App 进程的 binder 线程( ApplicationThread )在收到请求后,通过 handler 向主线程发送 LAUNCH_ACTIVITY消息; 主线程在收到 Message 后,通过发射机制创建目标 Activity ,并回调 Activity.onCreate() 等方法。 到此, App 便正式启动,开始进入 Activity 生命周期,执行完 onCreate/onStart/onResume 方法, UI 渲染结束后便可以看到 App 的主界面。
源码解析
https://blog.csdn.net/qq_27481249/article/details/116015635
https://zhuanlan.zhihu.com/p/454459946
https://www.its404.com/article/a553181867/89917857
https://www.jianshu.com/p/160a53701ab6
五,关于AMS的问题
1. ActivityThread是什么?ApplicationThread是什么?他们的区别
ActivityThread
在Android中它就代表了Android的主线程,它是创建完新进程之后,main函数被加载,然后执行一个loop的循环使当前线程进入消息循环,并且作为主线程。
ApplicationThread
ApplicationThread是ActivityThread的内部类, 是一个Binder对象。在此处它是作为IApplicationThread对象的server端等待client端的请求然后进行处理,最大的client就是AMS。
2. Instrumentation是什么?和ActivityThread是什么关系?
- AMS与ActivityThread之间诸如Activity的创建、暂停等的交互工作实际上是由Instrumentation具体操作的。每个Activity都持有一个Instrumentation对象的一个引用, 整个进程中是只有一个Instrumentation。
- mInstrumentation的初始化在ActivityThread::handleBindApplication函数。
- 可以用来独立地控制某个组件的生命周期。
- Activity
的
startActivity方法。startActivity会调用mInstrumentation.execStartActivity(); - mInstrumentation 调用用 AMS , AMS 通过 socket 通信告知 Zygote 进程 fork 子进程。
3. ActivityManagerService和zygote进程通信是如何实现的
应用启动时,Launcher进程请求AMS,AMS发送创建应用进程请求,Zygote进程接受请求并fork应用进程。而AMS发送创建应用进程请求调用的是 ZygoteState.connect() 方法,ZygoteState 是 ZygoteProcess 的内部类。
1 | public static ZygoteState connect(LocalSocketAddress address) throws IOException { |
Zygote 处理客户端请求:Zygote 服务端接收到参数之后调用 ZygoteConnection.processOneCommand() 处理参数,并 fork 进程。
最后通过 findStaticMain() 找到 ActivityThread 类的 main() 方法并执行,子进程就这样启动了。
4. Activity的启动的整体流程:
1. Launcher进程请求AMS
2. AMS发送创建应用进程请求
3. Zygote进程接受请求并孵化应用进程
4. 应用进程启动ActivityThread
5. 应用进程绑定到AMS
6. AMS发送启动Activity的请求
7. ActivityThread的Handler处理启动Activity的请求