Binder原理之PMS、AMS注册到ServerManager

先上一张流程图,稳住军心,对着流程图分析更加有信心

一、什么是SystemServer

源码位置:
frameworks/base/services/java/com/android/server/SystemServer.java

System Server是android 基本服务的提供者,是android系统运行的最基本需求,所有service运行在一个叫system_server的进程中,system_server进程是android java虚拟机跑的第一个进程,从Zygote 创建而来,是andorid系统最重要的java虚拟机。可以说,整个android系统的业务都是围绕system server而展开,所以,当system_server死掉了,手机必须重启。从Zygote创建system_server进程时,便实例化了该类。源码层不做分析,可参考https://blog.csdn.net/qq_25806863/article/details/70820063

二、SystemServer类启动服务

1、找到SystemServer的入口函数main(),代码如下:

    /**
     * The main entry point from zygote.
     */
    public static void main(String[] args) {
        new SystemServer().run();
    }

2、进入run()方法,代码如下:

private void run() {
        ...

        // Start services.
        try {
            
            //--------1、启动引导服务
            startBootstrapServices();
            //--------2、启动核心服务
            startCoreServices();
            //--------3、启动其他服务
            startOtherServices();
        } catch (Throwable ex) {
           ...

        } finally {
            traceEnd();
        }

      ...
 
    }

启动服务分为三大类服务引导服务、核心服务、其他服务

3、如上面的流程图、PMS属于引导服务,进入startBootstrapServices()方法,代码如下:

 private void startBootstrapServices() {
        ....

        // ------------1、启动ActivityManagerService
        traceBeginAndSlog("StartActivityManager");
        mActivityManagerService = mSystemServiceManager.startService(
                ActivityManagerService.Lifecycle.class).getService();
        mActivityManagerService.setSystemServiceManager(mSystemServiceManager);
        mActivityManagerService.setInstaller(installer);
        traceEnd();

        ...
        mActivityManagerService.setSystemProcess();
        
        // ------------2、启动PackageManagerService
        traceBeginAndSlog("StartPackageManagerService");
        mPackageManagerService = PackageManagerService.main(mSystemContext, installer,
                mFactoryTestMode != FactoryTest.FACTORY_TEST_OFF, mOnlyCore);
        mFirstBoot = mPackageManagerService.isFirstBoot();
        mPackageManager = mSystemContext.getPackageManager();
        traceEnd();
      
        ...
    }

最终会调用PackageManagerService.main() 方法实例化PMS

4、进入main方法,代码如下:

 public static PackageManagerService main(Context context, Installer installer,
            boolean factoryTest, boolean onlyCore) {
       
        PackageManagerServiceCompilerMapping.checkProperties();

        //-----------1、初始化PMS
        PackageManagerService m = new PackageManagerService(context, installer,
                factoryTest, onlyCore);
        m.enableSystemUserPackages();

        //------------2、注册到ServerManager
        ServiceManager.addService("package", m);
        final PackageManagerNative pmn = m.new PackageManagerNative();
        ServiceManager.addService("package_native", pmn);
        return m;
    }

注释1初始化PMS的启动阶段。如上面的流程图,注释2处就会把初始化的PMS注册到ServerManager。key是"package",value就是PMS对象

5、AMS注册过程

回到第3步,注释1处调用mActivityManagerService.setSystemProcess(),进入方法,代码如下:


    public void setSystemProcess() {
        
            //-----------------1、当前AMS服务
            ServiceManager.addService(Context.ACTIVITY_SERVICE, this, /* allowIsolated= */ true,
                    DUMP_FLAG_PRIORITY_CRITICAL | DUMP_FLAG_PRIORITY_NORMAL | DUMP_FLAG_PROTO);

            //-----------------2、其他相关服务
            ServiceManager.addService(ProcessStats.SERVICE_NAME, mProcessStats);
            ServiceManager.addService("meminfo", new MemBinder(this), /* allowIsolated= */ false,
                    DUMP_FLAG_PRIORITY_HIGH);
            ServiceManager.addService("gfxinfo", new GraphicsBinder(this));
            ServiceManager.addService("dbinfo", new DbBinder(this));
            if (MONITOR_CPU_USAGE) {
                ServiceManager.addService("cpuinfo", new CpuBinder(this),
                        /* allowIsolated= */ false, DUMP_FLAG_PRIORITY_CRITICAL);
            }
            ServiceManager.addService("permission", new PermissionController(this));
            ServiceManager.addService("processinfo", new ProcessInfoService(this));

           ...
    }

注释1处就会把初始化的PMS注册到ServerManager。key是 Context.ACTIVITY_SERVICE,value就是AMS对象

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值