android 技术梳理

Android 进阶解密阅读笔记7

2021-02-05  本文已影响0人  jkwen

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 的启动过程并不复杂,但既然它能提供那么多的功能,可见还有更多的东西,待我后面了解了相关的东西后再做记录和探究。

上一篇下一篇

猜你喜欢

热点阅读