1、ActivityManagerService是什么?什么时候初始化的?有什么作用?
ActivityManagerService 主要负责系统中四大组件的启动、切换、调度及应用进程的管理和调度等工作,其职责与操作系统中的进程管理和调度模块类似。
ActivityManagerService进行初始化的时机很明确,就是在SystemServer进程开启的时候,就会初始化ActivityManagerService。(系统启动流程)
如果打开一个App的话,需要AMS去通知zygote进程, 所有的Activity的生命周期由AMS来控制。
2、ActivityThread是什么?ApplicationThread是什么?它们的区别
- ActivityThread
在Android中它就代表了Android的主线程,它是创建完新进程之后,main函数被加载,然后执行一个loop的循环使当前线程进入消息循环,并且作为主线程。 - ApplicationThread
ApplicationThread是ActivityThread的内部类, 是一个Binder对象。在此处它是作为IApplicationThread对象的server端等待client端的请求然后进行处理,最大的client就是AMS。
3、Instrumentation是什么?和ActivityThread是什么关系?
AMS与ActivityThread之间诸如Activity的创建、暂停等的交互工作实际上是由Instrumentation具体操作的。每个Activity都持有一个Instrumentation对象的一个引用, 整个进程中是只有一个Instrumentation。mInstrumentation的初始化在ActivityThread::handleBindApplication函数。
可以用来独立地控制某个组件的生命周期。
Activity的startActivity方法。startActivity会调用mInstrumentation.execStartActivity();
mInstrumentation掉用AMS,AMS通过socket通信告知Zygote进程fork子进程。
4、ActivityManagerService和zygote进程通信是如何实现的。
应用启动时,Launcher进程请求AMS。 AMS发送创建应用进程请求,Zygote进程接受请求并fork应用进程
客户端发送请求:调用 Process.start() 方法新建进程
连接调用的是 ZygoteState.connect() 方法,ZygoteState 是 ZygoteProcess 的内部类。ZygoteState里用的LocalSocket
public static ZygoteState connect(LocalSocketAddress address) throws IOException {
DataInputStream zygoteInputStream = null;
BufferedWriter zygoteWriter = null;
final LocalSocket zygoteSocket = new LocalSocket();
try {
zygoteSocket.connect(address);
zygoteInputStream = new DataInputStream(zygoteSocket.getInputStream());
zygoteWriter = new BufferedWriter(new OutputStreamWriter(
zygoteSocket.getOutputStream()), 256);
} catch (IOException ex) {
try {
zygoteSocket.close();
} catch (IOException ignore) {
}
throw ex;
}
return new ZygoteState(zygoteSocket, zygoteInputStream, zygoteWriter,
Arrays.asList(abiListString.split(",")));
}
Zygote 处理客户端请求:Zygote 服务端接收到参数之后调用 ZygoteConnection.processOneCommand() 处理参数,并 fork 进程。
最后通过 findStaticMain() 找到 ActivityThread 类的 main() 方法并执行,子进程就启动了。
5、ActivityRecord、TaskRecord、ActivityStack,ActivityStackSupervisor,ProcessRecord
ActivityRecord
Activity管理的最小单位,它对应着一个用户界面
ActivityRecord是应用层Activity组件在AMS中的代表,每一个在应用中启动的Activity,在AMS中都有一个ActivityRecord实例来与之对应,这个ActivityRecord伴随着Activity的启动而创建,也伴随着Activity的终止而销毁。
TaskRecord
TaskRecord即任务栈, 每一个TaskRecord都可能存在一个或多个ActivityRecord,栈顶的ActivityRecord表示当前可见的界面。
一个App是可能有多个TaskRecord存在的
一般情况下,启动App的第一个activity时,AMS为其创建一个TaskRecord任务栈
特殊情况,启动singleTask的Activity,而且为该Activity指定了和包名不同的taskAffinity, 也会为该activity创建一个新的TaskRecord
ActivityStack
ActivityStack,ActivityStack是系统中用于管理TaskRecord的,内部维护了一个ArrayList。
ActivityStackSupervisor内部有两个不同的ActivityStack对象:mHomeStack、mFocusedStack,用来管理不同的任务。
我们启动的App对应的TaskRecord由非Launcher ActivityStack管理,它是在系统启动第一个app时创建的。
ActivityStackSupervisor
ActivityStackSupervisor管理着多个ActivityStack,但当前只会有一个获取焦点(Focused)的ActivityStack;
AMS对象只会存在一个,在初始化的时候,会创建一个唯一的ActivityStackSupervisor对象
ProcessRecord
ProcessRecord记录着属于一个进程的所有ActivityRecord,运行在不同TaskRecord中的ActivityRecord可能是属于同一个 ProcessRecord。
总结
- AMS运行在SystemServer进程中。SystemServer进程启动时,会通过SystemServer.startBootstrapServices()来创建一个AMS的对象;
- AMS通过ActivityStackSupervisor来管理Activity。AMS对象只会存在一个,在初始化的时候,会创建一个唯一的ActivityStackSupervisor对象;
- ActivityStackSupervisor中维护了显示设备的信息。当有新的显示设备添加时,会创建一个新的ActivityDisplay对象;
- ActivityStack与显示设备的绑定。ActivityStack的创建时在Launcher启动时候进行的, AMS还未有非Launcher的ActivityStack。后面的App启动时就会创建Launcher的ActivityStack,
- 通过ActivityStackSupervisor来创建ActivityRecord
- 在ActivityStack上创建TaskRecord
- 每一个ActivityRecord都需要找到自己的宿主TaskRecord
6、ActivityManager、ActivityManagerService、ActivityManagerNative、ActivityManagerProxy的关系
Activity的startActivity方法。startActivity会调用mInstrumentation.execStartActivity(); execStartActivity通过ActivityManager的getService。
- 代码层面:
ActivityManager.getRunningServices里通过ActivityManagerNative.getDefault得到此代理对象ActivityManagerProxy,ActivityManagerProxy代理类是ActivityManagerNative的内部类。ActivityManagerNative是个抽象类,真正发挥作用的是它的子类ActivityManagerService。
- 介绍:
ActivityManager
ActivityManager官方介绍:是与系统所有正在运行着的Acitivity进行交互,对系统所有运行中的Activity相关信息(Task,Memory,Service,App)进行管理和维护。
ActivityManagerNative、ActivityManagerProxy
IActivityManager继承了Interface接口。而ActivityManagerNative和ActivityManagerPorxy实现了这个IActivityManager接口
ActivityManagerProxy代理类是ActivityManagerNative的内部类;
ActivityManagerNative是个抽象类,真正发挥作用的是它的子类ActivityManagerService
ActivityManager持有的是这个ActivityManagerPorxy代理对象,这样,只需要操作这个代理对象就能操作其业务实现的方法。那么真正实现其也业务的则是ActivityManagerService。
ActivityManagerNative这个类,他继承了Binder而Binder实现了IBinder接口。其子类则是ActivityManagerService。