移动架构 (三) AMS 源码分析

AMS 介绍

ActivityManagerService 简称 AMS , 是 Android 内核中核心功能之一,由 com.android.server.SystemService.java 启动。

AMS 启动流程

以下流程因为涉及的源代码太多了 , 我这里以 UML 流程图跟代码截图以示

Android 系统启动

应用进程启动

ServiceManager 启动

AMS 注册

AMS 启动详解

代码流程:

  1. AMS 具体是在 SystemService 进中启动的,主要是在 com/android/server/SystemServer.java main() 函数中进行。

/**
     * 这里的 main 函数 主要是 zygote 通过反射调用
     */public static void main(String[] args){
        new SystemServer().run();
    }

  1. 从上图可以得知 main 方法主要是执行的 com/android/server/SystemServer.java run() 函数,我们具体来看下 run() 到底干了什么?

    private void run() {
        try {
				....
            //加载了动态库libandroid_servers.so
            System.loadLibrary("android_servers");
            //创建SystemServiceManager,它会对系统的服务进行创建、启动和生命周期管理
            mSystemServiceManager = new SystemServiceManager(mSystemContext);
            mSystemServiceManager.setRuntimeRestarted(mRuntimeRestart);
            LocalServices.addService(SystemServiceManager.class, mSystemServiceManager);
        } finally {
   
        }

        // 启动各种服务
        try {
            traceBeginAndSlog("StartServices");
          //启动了ActivityManagerService、PowerManagerService、PackageManagerService 等服务startBootstrapServices();
          // 启动了BatteryService、UsageStatsService和WebViewUpdateService 等服务startCoreServices();
          // 启动了CameraService、AlarmManagerService、VrManagerService等服务startOtherServices();
            SystemServerInitThreadPool.shutdown();
          
          ....
            
        } catch (Throwable ex) {
            throw ex;
        } finally {
            traceEnd();
        }
        // Loop forever.
        Looper.loop();
        throw new RuntimeException("Main thread loop unexpectedly exited");
    }

run () 函数核心任务就是初始化一些事务和核心服务启动,这里核心服务初略有 80 多个,系统把核心服务大概分为了 3 类,分别是引导服务、核心服务和其他服务,因为这小节主要研究 AMS 启动,所以我们只关注 startBootstrapServices(); 内容就行了。

  1. startBoostrapService() 这个函数的主要作用,根据官方的意思就是启动需要获得的小型的关键服务。 这些服务具有复杂的相互依赖性,这就是我们在这里将它们全部初始化的原因。 除非您的服务也与这些依赖关系缠绕在一起,否则应该在其他一个函数中初始化它。

public void startBootstrapServices(){
  ...
    
    		//启动 AMS 服务
        mActivityManagerService = mSystemServiceManager.startService(
        ActivityManagerService.Lifecycle.class).getService();
  			//设置管理器
        mActivityManagerService.setSystemServiceManager(mSystemServiceManager);
  			//设置安装器
        mActivityManagerService.setInstaller(installer);
  
  ...
    
}

这里主要调用 SystemServiceManager 的 startService 方法,方法的参数是 ActivityManagerService.Lifecycle.classcom/android/server/SystemServiceManager.java 我们再来看看 SSM 的 startService 方法主要干嘛了?

  1. SSM startService(Class serviceClass)

public <T extends SystemService> T startService(Class<T> serviceClass) {
        try {
          ...
            final T service;
            try {
                Constructor<T> constructor = serviceClass.getConstructor(Context.class);
                //实例化对象
                service = constructor.newInstance(mContext);
            }  catch (InvocationTargetException ex) {
                throw new RuntimeException("Failed to create service " + name
                        + ": service constructor threw an exception", ex);
            }

            startService(service);
            return service;
        } finally {
            Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
        }
    }

跟踪代码可以得知 startService 方法传入的参数是 Lifecycle.class,Lifecycle 继承自 SystemService 。首先,通过反射来创建 Lifecycle 实例,得到传进来的 Lifecycle 的构造器 constructor ,接着又调用 constructor 的newInstance 方法来创建 Lifecycle 类型的 service 对象。接着将刚创建的 service 添加到 ArrayList 类型的mServices 对象中来完成注册。最后在调用 service 的 onStart 方法来启动 service ,并返回该 service 。Lifecycle 是 AMS 的内部类。

  1. Lifecycle 走向

    public static final class Lifecycle extends SystemService{
        privatefinalActivityManagerService mService;

        public Lifecycle(Context context) {
            super(context);
            mService = newActivityManagerService(context);
        }

        @Override
        public void onStart() {
            mService.start();
        }

        public ActivityManagerService getService() {
            return mService;
        }
    }

主要执行 Lifecyle onStart()

public void startService(@NonNull final SystemService service) {
        // 把 AMS 服务添加到系统服务中mServices.add(service);
        // Start it.longtime = System.currentTimeMillis();
        try {
          //执行 Lifecyle 重 onStart 函数方法service.onStart();
        } catch (RuntimeException ex) {
            thrownewRuntimeException("Failed to start service " + service.getClass().getName()
                    + ": onStart threw an exception", ex);
        }
        warnIfTooLong(System.currentTimeMillis() - time, service, "onStart");
    }

上面第四步调用 constructor 的 newInstance 方法已经实例化了 Lifecycle 并创建 new

ActivityManagerService(context); 对象,接着又在第四步 startService(service) 调用了 service.start();实际上是调用了 Lifecyle onStart 函数方法。

  1. ActivityManagerService getService()

mActivityManagerService = mSystemServiceManager.startService(
                ActivityManagerService.Lifecycle.class).getService();

从上面代码得知实际上是调用了 AMS 中内部类 Lifecycle 中的 getService 函数返回了 AMS 实例,那么 AMS 实例就相当于创建了。

  1. 最后启动 AMS 进程是在 Zygote 中执行的,可以参考应用进程中的流程图。

系列文章

移动架构 (一) 详解架构设计中UML图的使用

移动架构 (二) Android 中 Handler 架构分析,并实现自己简易版本 Handler 框架

移动架构 (三) AMS 源码分析

移动架构 (四) EventBus源码分析及实现自己的轻量级 EventBus 框架

移动架构 (五) 了解Android数据持久化

移动架构 (六) 轻量级进程间通信框架设计

移动架构 (七) 组件化架构设计思想

移动架构 (八) 动态化加载插件技术模型实现

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

金戈鐡馬

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值