Android 进阶解密阅读笔记7
Activity Manager Service
职责
在应用程序进程创建,应用程序的 Application 对象创建,四大组件的启动等都有 Activity Manager Service 的参与,并且起到关键作用。系统也将它归为引导类服务优先启动,可见其重要性。
AMS 家族
以 startActivity 为例,启动一个 Activity 最终会通过 Instrumentation 获取 Activity Manager Service 来执行 startActivity。
//Instrumentation
int result = ActivityManager.getService().startActivity(whoThread, who.getBasePackageName(), intent, intent.resolveTypeIfNeeded(who.getContentResolver()), token, target != null ? target.mEmbeddedID : null, requestCode, 0, null, options);
//ActivityManager
public static IActivityManager getService() {
return IActivityManagerSingleton.get();
}
private static final Singleton<IActivityManager> IActivityManagerSingleton = new Singleton<IActivityManager>() {
@Override
protected IActivityManager create() {
final IBinder b = ServiceManager.getService(Context.ACTIVITY_SERVICE);
final IActivityManager am = IActivityManager.Stub.asInterface(b);
return am;
}
};
因为这一过程涉及到 Binder 通信机制和 AIDL,需要后续对这块整理一下,这里无法解释,暂且得出书中结论,
AMS 家族包括 IActivityManager, IActivityManager.Stub, ActivityManagerService。其实书中一开始还介绍了 8.0 以下的 AMS 家族,因为实现方式和 8.0 及以上大有不同(这里的代码摘自 9.0,API 28),但我觉得从原理性角度理解了新的之后,对老的也就能了解个大差不差了,毕竟老的已经淘汰。
启动过程
和应用进程,四大组件一样,类似于 AMS 这样的服务也有启动过程,并且它是由系统服务进程来处理的。(这点在 Android 进阶解密读书笔记1 中有记录)
系统服务进程的执行从 SystemServer 的 main 方法开始。
public static void main(String[] args) {
//构造方法仅做了一些赋值
new SystemServer().run();
}
private void run() {
//创建 SystemServiceManager 用于后续创建并启动服务
mSystemServiceManager = new SystemServiceManager(mSystemContext);
LocalServices.addService(SystemServiceManager.class, mSystemServiceManager);
//启动引导服务,AMS 就在其中
startBootstrapServices();
//启动核心服务
startCoreServices();
startOtherServices();
}
private void startBootstrapServices() {
//我们关心的 AMS
//通过 mSystemServiceManager 调用 startService 方法启动
//其入参是 ActivityManagerService 里的静态内部类 Lifecycle 继承自 SystemService
mActivityManagerService = mSystemServiceManager.startService(
ActivityManagerService.Lifecycle.class).getService();
}
SystemServiceManager 的 startService 方法内部其实就是通过传入的 class 类型入参通过构造方法创建相应对象,再调用重载方法 startService。通过重载方法将新建的 SystemService 放入缓存中,并调用 SystemService 的 onStart 方法。前面说了 Lifecycle 就是这个 SystemService,
public Lifecycle(Context context) {
super(context);
//在这里创建了 AMS 对象
mService = new ActivityManagerService(context);
}
@Override
public void onStart() {
//随后就会调用这个 onStart 方法
//可见 Lifecycle 其实调用的是 AMS 的 start 方法
mService.start();
}
到这,AMS 服务就启动起来了,随后调用的 getService 方法就是将 AMS 对象引用返回到 SystemServer 里赋值保存。
感觉 AMS 的启动过程并不复杂,但既然它能提供那么多的功能,可见还有更多的东西,待我后面了解了相关的东西后再做记录和探究。