ActivityManagerService的启动流程
AMS是什么
- 从java角度来看,AMS就是一个java对象,实现了Ibinder接口,所以它是一个用于进程之间通信的接口
- AMS是一个服务。ActivityManagerService从名字就可以看出,它是一个服务,用来管理Activity,而且是一个系统服务,就是包管理服务,电池管理服务,震动管理服务等。
- AMS是一个Binder。AMS实现了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通信的工具
ActivityManagerService的启动流程(API 30)
ActivityManagerService是在SystemServer初始化的时候启动的,所以我们先看SystemServer的初始化 :SystemServer的main方法。
public static void main(String[] args) {
new SystemServer().run();
}
接着点进去run方法
private void run() {
...
//创建系统上下文
//1,创建系统资源(系统字体,图片等),因为APP也会用到系统的资源
//2,创建主题(APP用到的theme)
createSystemContext();
...
//创建SystemServiceManager
mSystemServiceManager = new SystemServiceManager(mSystemContext);
...
try {
t.traceBegin("StartServices");
//开启引导服务(比如AMS)
startBootstrapServices(t);
//开启核心服务
startCoreServices(t);
//开启其他服务
startOtherServices(t);
} catch (Throwable ex) {
Slog.e("System", "******************************************");
Slog.e("System", "************ Failure starting system services", ex);
throw ex;
} finally {
t.traceEnd(); // StartServices