其他分享
首页 > 其他分享> > AMS 的启动过程

AMS 的启动过程

作者:互联网

从前面学习知道,系统启动时,会启动SystemServer进程,而SystemServer进程又会启动各种系统服务,包括AMS,那么这个过程是怎么样的,现在就从SystemServer的main()进入看看。

SystemServer.main()

 public static void main(String[] args) {
    new SystemServer().run();//调用了自身的run()方法
 }
    

SystemServer.run()

private void run() {
  ...
  try{
    ...
    //创建消息Looper
    Looper.prepareMainLooper();

   // 加载动态库libandroid_servers.so
   System.loadLibrary("android_servers");
   performPendingShutdown();

    //创建ActivityThread以及系统的Context
    createSystemContext();
    
    //创建SystemServiceManager,负责创建、启动、管理系统服务
    mSystemServiceManager = new SystemServiceManager(mSystemContext);
    mSystemServiceManager.setRuntimeRestarted(mRuntimeRestart);
    LocalServices.addService(SystemServiceManager.class, mSystemServiceManager);
    // Prepare the thread pool for init tasks that can be parallelized
    SystemServerInitThreadPool.get();
    
    ...
    
    try {
            traceBeginAndSlog("StartServices");
            //启动引导服务,例如AMS、PMS,那么就去看一下如何启动则个AMS服务。
            startBootstrapServices();
            //启动核心服务例如BatteryService、WebViewUpdateService
            startCoreServices();
            //启动其他服务
            startOtherServices();
            SystemServerInitThreadPool.shutdown();
        } catch (Throwable ex) {
            Slog.e("System", "******************************************");
            Slog.e("System", "************ Failure starting system services", ex);
            throw ex;
        } finally {
            traceEnd();
        }

SystemServer.startBootstrapServices()

private void startBootstrapServices() {
  ...
  traceBeginAndSlog("StartActivityManager");
  
  //1.首先调用startService()去创建AMS,如何创建?
  mActivityManagerService = mSystemServiceManager.startService(
  ActivityManagerService.Lifecycle.class).getService();
  //2.给AMS设置相关属性
  mActivityManagerService.setSystemServiceManager(mSystemServiceManager);
  mActivityManagerService.setInstaller(installer);
 traceEnd();
 ...
}      

ActivityManagerService.Lifecycle.class

上面startService()传入了ActivityManagerService.Lifecycle.class作为参数,那么它是什么?

//Lifecycle是ActivityManagerService的一个内部类,继承自SystemService
public static final class Lifecycle extends SystemService {
        private final ActivityManagerService mService;

        public Lifecycle(Context context) {
            super(context);
            //创建ActivityManagerService对象
            mService = new ActivityManagerService(context);
        }

        @Override
        public void onStart() {
            mService.start();
        }
		 //提供获取ActivityManagerService方法
        public ActivityManagerService getService() {
            return mService;
        }
    }

SystemServerManager.startService(Class serviceClass)

public <T extends SystemService> T startService(Class<T> serviceClass) {
   try {
      //1.获取class的名字,这里就是ActivityManagerService.Lifecycle
      final String name = serviceClass.getName();
            
      Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, "StartService " + name);

       //2.如果不是继承自SysteService则会抛出异常。
        if (!SystemService.class.isAssignableFrom(serviceClass)) {
         throw new RuntimeException("Failed to create " + name + ": service must extend " + SystemService.class.getName());
        }
        
         final T service;
            try {
            	   //3.通过反射去创建ActivityManagerService.Lifecycle的实例, ActivityManagerService.Lifecycle创建同时,内部会创建AMS实例
                Constructor<T> constructor = serviceClass.getConstructor(Context.class);
                service = constructor.newInstance(mContext);
            } 
            ...
            //4.然后调用startService(service);
            startService(service);
            return service;
        } finally {
            Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
        }
    }

SystemServerManager.startService(SystemService service)

 public void startService(@NonNull final SystemService service) {
        // 首先将service添加到list中
        mServices.add(service);
        // Start it.
        long time = System.currentTimeMillis();
        try {
        		//2.调用service的onStart()方法启动,这里的service指的是 ActivityManagerService.Lifecycle,内部调用的是AMS的onStart()方法
            service.onStart();
        } catch (RuntimeException ex) {
            throw new RuntimeException("Failed to start service " + service.getClass().getName()
                    + ": onStart threw an exception", ex);
        }
        warnIfTooLong(System.currentTimeMillis() - time, service, "onStart");
    }

至此,AMS的创建和启动就都已经完成了。

标签:service,启动,class,startService,AMS,ActivityManagerService,过程,Lifecycle
来源: https://blog.csdn.net/qq_26984087/article/details/89057439