Android14 AMS启动流程

本文均采用Android 14代码进行讲解,学习可以使用以下地址:Search (aospxref.com)

AMS在systrace上的表现可以参考:Perfetto详细解析-CSDN博客

一、AMS启动流程

AMS的启动是在SyetemServer进程中启动的,从SyetemServer的main方法开始进入:

1.SystemServer.java

frameworks/base/services/java/com/android/server/SystemServer.java

main(String[] args)

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

main方法中只调用了SystemServer的run方法,如下所示。

run()

从下面的注释中可以看到,官方把系统服务分为了三种类型,分别是引导服务、核心服务和其他服务,其中其他服务是一些非紧要和一些不需要立即启动的服务。系统服务总共大约有80多个,我们主要来查看引导服务AMS是如何启动的。

private void run() {
      		 // Initialize native services.
         	//1.加载了动态库libandroid_servers.so
           System.loadLibrary("android_servers");
       ......
	         // Create the system service manager.
        	 //2.创建SystemServiceManager,它会对系统的服务进行创建、启动和生命周期管理。
	         mSystemServiceManager = new SystemServiceManager(mSystemContext);
	         mSystemServiceManager.setStartInfo(mRuntimeRestart,
	                 mRuntimeStartElapsedTime, mRuntimeStartUptime);
	         mDumper.addDumpable(mSystemServiceManager);
	     ......   
			    	// Start services.
        try {
           t.traceBegin("StartServices");
           //用SystemServiceManager启动了ActivityManagerService、PowerManagerService、PackageManagerService等服务。
			 		 startBootstrapServices(t);
           //启动了BatteryService、UsageStatsService和WebViewUpdateService。
           startCoreServices(t);
        	 //启动了CameraService、AlarmManagerService、VrManagerService等服务。这些服务的父类均为SystemService。
           startOtherServices(t);
        	 startApexServices(t);
       } catch (Throwable ex) {
           Slog.e("System", "******************************************");
           Slog.e("System", "************ Failure starting system services", ex);
           throw ex;
       } finally {
           t.traceEnd(); // StartServices
       }
       ...
   }

startBootstrapServices(@NonNull TimingsTraceAndSlog t)

调用了ActivityManagerService.Lifecycle.startService方法

private void startBootstrapServices(@NonNull TimingsTraceAndSlog t) {
    t.traceBegin("startBootstrapServices");
  	//尽早启动watchdog,这样我们就可以使系统服务器崩溃
    // 如果我们在早期启动时死锁
    t.traceBegin("StartWatchdog");
    final Watchdog watchdog = Watchdog.getInstance();
    watchdog.start();
    mDumper.addDumpable(watchdog);	
    .....
    // Activity manager runs the show.
    t.traceBegin("StartActivityManager");
    // TODO: Might need to move after migration to WM.
    ActivityTaskManagerService atm = mSystemServiceManager.startService(
            ActivityTaskManagerService.Lifecycle.class).getService();
    //调用了ActivityManagerService.Lifecycle.startService方法,跟进代码看最终调用哪个方法
    mActivityManagerService = ActivityManagerService.Lifecycle.startService(
            mSystemServiceManager, atm);
    mActivityManagerService.setSystemServiceManager(mSystemServiceManager);
    mActivityManagerService.setInstaller(installer);
    mWindowManagerGlobalLock = atm.getGlobalLock();
    t.traceEnd();
......

2.ActivityManagerService.java

/frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java

Lifecycle.startService(SystemServiceManager ssm,ActivityTaskManagerService atm)

最终调用SystemServiceManager的startService方法,参数就是ActivityManagerService.Lifecycle.class,继续跟进SystemServiceManager,最终调用Lifecycle的getService方法,这个方法会返回AMS类型的mService对象,这样AMS实例就会被创建并且返回。

//Lifecycle继承自SystemService
public static final class Lifecycle extends SystemService {
	  public Lifecycle(Context context) {
	      super(context);
      	//当通过反射来创建Lifecycle实例时,会调用此方法创建AMS实例
	      mService = new ActivityManagerService(context, sAtm);
	  }
    public static ActivityManagerService startService(
            SystemServiceManager ssm, ActivityTaskManagerService atm) {
        sAtm = atm;
      	//调用SystemServiceManager的startService方法,参数就是ActivityManagerService.Lifecycle.class,最终调用Lifecycle的getService方法,这个方法会返回AMS类型的mService对象,这样AMS实例就会被创建并且返回。
        return ssm.startService(ActivityManagerService.Lifecycle.class).getService();
				@Override
		public void onStart(){
				Service.start;
		}
  	...
  	//这个方法会返回AMS类型的mService对象,这样AMS实例就会被创建并且返回。
     public ActivityManagerService getService() {
         return mService;
     }
}

3.SystemServiceManager.java

/frameworks/base/services/core/java/com/android/server/SystemServiceManager.java

startService(Class<T> serviceClass)

首先会获取传进来的Lifecycle的构造器constructor,然后调用constructor的newInstance方法来创建Lifecycle类型的service对象,调用重载的startService,最后返回service

public <T extends SystemService> T startService(Class<T> serviceClass) {
    try {
        final String name = serviceClass.getName();
        Slog.i(TAG, "Starting " + name);
        Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, "StartService " + name);

        // Create the service.
        if (!SystemService.class.isAssignableFrom(serviceClass)) {
            throw new RuntimeException("Failed to create " + name
                    + ": service must extend " + SystemService.class.getName());
        }
        final T service;
        try {
        	  //1.获取传进来的Lifecycle的构造器constructor
            Constructor<T> constructor = serviceClass.getConstructor(Context.class);
            //调用constructor的newInstance方法来创建Lifecycle类型的service对象
						service = constructor.newInstance(mContext);
        } catch (InstantiationException ex) {
            throw new RuntimeException("Failed to create service " + name
                    + ": service could not be instantiated", ex);
        } catch (IllegalAccessException ex) {
            throw new RuntimeException("Failed to create service " + name
                    + ": service must have a public constructor with a Context argument", ex);
        } catch (NoSuchMethodException ex) {
            throw new RuntimeException("Failed to create service " + name
                    + ": service must have a public constructor with a Context argument", ex);
        } catch (InvocationTargetException ex) {
            throw new RuntimeException("Failed to create service " + name
                    + ": service constructor threw an exception", ex);
        }
      	//调用重载的startService
        startService(service);
      	//返回service
        return service;
    } finally {
        Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
    }
}

startService(@NonNull final SystemService service)

首先会将上面创建的service添加到ArrayList类型的mServices对象中来完成注册,然后调用service的onStart方法来启动service

public void startService(@NonNull final SystemService service) {
    // Check if already started
    String className = service.getClass().getName();
    if (mServiceClassnames.contains(className)) {
        Slog.i(TAG, "Not starting an already started service " + className);
        return;
    }
    mServiceClassnames.add(className);

    //1.将上面创建的service添加到ArrayList类型的mServices对象中来完成注册
    mServices.add(service);

    // Start it.
    long time = SystemClock.elapsedRealtime();
    try {
      	//2.调用service的onStart方法来启动service
        service.onStart();
    } catch (RuntimeException ex) {
        throw new RuntimeException("Failed to start service " + service.getClass().getName()
                + ": onStart threw an exception", ex);
    }
    warnIfTooLong(SystemClock.elapsedRealtime() - time, service, "onStart");
}

4.流程总结:

总的流程主要涉及SystemServer、ActivityManagerService、SystemServiceManager三个类,SystemServer的run方法会调用去启动引导服务startBootstrapServices,其中AMS也在里面,startBootstrapServices调用了startService方法,跟进代码看最终调用SystemServiceManager里面的startService,中间会有一系列的调用,但最后会通过Lifecycle创建AMS实例,然后通过Lifecycle里面的getService(),这个方法会返回AMS类型的mService对象。

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android系统的启动流程可以简单分为以下几个步骤:\[1\] 1. 前期准备工作:包括系统服务的初始化、创建ActivityThread线程等。 2. 启动AMS:创建ActivityManagerService对象,并注册系统服务。 3. 启动Zygote进程:Zygote是Android系统的孵化器进程,负责创建新的应用进程。 4. 创建应用进程:Zygote根据应用的包名创建新的应用进程,并加载应用的代码和资源。 5. 启动应用:应用进程启动后,会创建Application对象,并执行Application的生命周期方法。 6. 创建Activity:应用启动后,根据启动模式和Intent创建相应的Activity,并进行Activity的生命周期管理。 7. 显示界面:Activity创建完成后,会通过WindowManagerService进行窗口管理,将界面显示到屏幕上。 在AMS加载Application的流程中,主要包括以下几个步骤:\[3\] 1. 前期准备工作:包括创建ActivityManagerService对象、注册系统服务等。 2. 创建Application对象:根据应用的包名和类名,通过反射创建Application对象。 3. 调用Application的生命周期方法:调用Application的attachBaseContext()、onCreate()等生命周期方法,完成应用的初始化工作。 在启动过程中,需要处理的问题包括:\[1\] 1. 冷启动时间过长:可以通过优化应用的启动流程、减少启动时的耗时操作等方式来缩短冷启动时间。 2. 黑白屏问题:可以通过在启动过程中显示一个启动界面,或者使用启动图等方式来解决黑白屏问题。 3. 启动优化:可以通过优化应用的启动流程、减少启动时的资源加载等方式来提升应用的启动速度和执行效率。 WMS(Window Manager Service)对启动优化的意义在于,它负责管理应用的窗口显示,包括界面的布局、绘制等。通过优化WMS的处理流程,可以提升应用的界面显示效果和响应速度,从而提升用户体验。\[2\] #### 引用[.reference_title] - *1* *2* [Android面试题——高级开发面试题一](https://blog.csdn.net/Calvin_zhou/article/details/128123302)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [Android系统服务 AMS 启动流程](https://blog.csdn.net/bugyinyin/article/details/126520417)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值