美文网首页android 技术梳理
Android 进阶解密阅读笔记7

Android 进阶解密阅读笔记7

作者: jkwen | 来源:发表于2021-02-05 15:25 被阅读0次

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

    相关文章

      网友评论

        本文标题:Android 进阶解密阅读笔记7

        本文链接:https://www.haomeiwen.com/subject/fztgtltx.html