Framework之AMS启动流程

152 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第25天,点击查看活动详情

一、AMS介绍

  • AMS是Android中最核心的服务,主要负责系统中四大组件的启动、切换、调度及应用进程的管理和调度等工作,其职责与操作系统中的进程管理和调度模块相类似,因此它在Android中非常重要;
  • 组件状态管理:包括四大组件的开启,关闭等一系列操作,如startActivity,startActivityAndWait,activityPaused,startService,stopService,removeContentProvider等;
  • 组件状态查询:查询组件当前运行等情况。如getCallingActivity,getService等;
  • Task相关:包括removeTask,removeSubTask,moveTaskBackwards,moveTaskToFront等;
  • AMS是通过ActivityStack及其他数据结构来记录,管理系统中的Activity及其他组件状态的,并提供查询功能的一个系统服务;

二、AMS服务的启动过程

1.SystemServer.javamain()

   `public static void main(String[] args) {`
    new SystemServer().run(); }

2.SystemServer.javarun()

    `private void run() {`
      ...
      System.loadLibrary("android_servers");//1
      ...
      mSystemServiceManager = new SystemServiceManager(mSystemContext);//2
      LocalServices.addService(SystemServiceManager.class, mSystemServiceManager);
       ...
      try {
        Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, "StartServices");
         startBootstrapServices();//3  ---------------->引导服务
         startCoreServices();//4    ---------------->核心服务
         startOtherServices();//5    ---------------->其他服务
    } 

3.SystemServer.java的startBootstrapServices()

   `private void startBootstrapServices() {`
​
    // Activity manager runs the show.
    mActivityManagerService = mSystemServiceManager.startService( ActivityManagerService.Lifecycle.class).getService();
​

    我们知道SystemServiceManager的startService方法最终会返回Lifecycle类型的对象,紧接着又调用了Lifecycle的getService方法,这个方法会返回AMS类型的mService对象     

    mActivityManagerService.setSystemProcess();
     ……
    mActivityManagerService.installSystemProviders();
    ……
    mActivityManagerService.systemReady(new Runnable() {
    @Override public void run() {
    Slog.i(TAG, "Making services ready");
     mSystemServiceManager.startBootPhase( SystemService.PHASE_ACTIVITY_MANAGER_READY);
    try { mActivityManagerService.startObservingNativeCrashes();

4.Lifecycle类的介绍

    public static final class Lifecycle extends SystemService {
    private final ActivityManagerService mService;
​
    public Lifecycle(Context context) {
    super(context);
    mService = new ActivityManagerService(context);
    }
​
    @Override
    public void onStart() {
    mService.start();
    }
*
    @Override
    public void onCleanupUser(int userId) {
    mService.mBatteryStatsService.onCleanupUser(userId);
    }  
​
    public ActivityManagerService getService() {
      return mService;
    }
  }*

5.AMS的构造方法

   `public ActivityManagerService(Context systemContext) {`
​
     `//获得系统的ActivityThread`
​
     mSystemThread = ActivityThread.currentActivityThread();
​
     `//创建一个HandlerThread用来处理AMS接收的命令`
​
    mHandlerThread = new ServiceThread(TAG, android.os.Process.THREAD_PRIORITY_FOREGROUND, false /*allowIo*/);
    mHandlerThread.start();
    mHandler = new MainHandler(mHandlerThread.getLooper());
    mUiHandler = new UiHandler();
​
    `//初始化广播的队列`
​
    mFgBroadcastQueue = new BroadcastQueue(this, mHandler, "foreground", BROADCAST_FG_TIMEOUT, false);
    mBgBroadcastQueue = new BroadcastQueue(this, mHandler, "background", BROADCAST_BG_TIMEOUT, true);
    mBroadcastQueues[0] = mFgBroadcastQueue;
    mBroadcastQueues[1] = mBgBroadcastQueue;
​
    `//初始化Service相关的容器`
​
    mServices = new ActiveServices(this);
    //初始化Provider相关的Map,里面保存了注册的ContentProvider
    mProviderMap = new ProviderMap(this);
​
    `//初始化并创建data/system/目录`
​
    File dataDir = Environment.getDataDirectory();
    File systemDir = new File(dataDir, "system");
    systemDir.mkdirs();
​
​
   `//初始化StackSupervisor,该类是Activity启动和调度的核心类`
​
    mStackSupervisor = new ActivityStackSupervisor(this, mRecentTasks);
    mTaskPersister = new TaskPersister(systemDir, mStackSupervisor, mRecentTasks);

 6.AMS的方法systemReady

1:在systemReady的时候初始化了deviceIdleController等对象 2:移除并杀死了那些不该在AMS之前启动的进程 3:执行了参数传入的回调函数 4:启动了Launcer界面和SystemUI 5:启动那些persistent配置为1的进程。

总结:

AMS服务启动主要分为几个步骤  小米视频增加组内自动化测试

1. 创建了SystemServer进程的运行环境,包括一个ActivityThread主线程,一个和系统进程相关的Context对象。     

2. 调用AMS的构造方法和start方法,对AMS必要的内容进行初始化  

3. 将函数AMS注册到ServiceManager中,同时对systemServer进程也创建了一个ProcessRecord对象,并设置Context的appliation为framework-res的application对象  

4. 将settingsProvider加载到系统进程systemServer中

5. 调用systemReady方法做一些启动前的就绪工作,并启动了HomeActivity和SystemUI