Android技术知识

Framework之AMS启动流程,简单上手!

2022-06-28  本文已影响0人  码农的地中海

一、AMS介绍

AMS中重要的数据结构

ActivityRecord:记录了Activity的所有信息,因此它用来描述一个activity。它是在activity启动时被创建的,具体是在ActivityStarter的startActivity()中被创建的。它存储的信息主要包括以下内容:

TaskRecord:用来描述一个Activity任务栈

ActivityStack:用来管理系统所有的Activity,内部维护了Activity的所有状态,特殊状态的Activity以及和Activity相关的列表等数据。


image.png

二、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

三、文末

AMS(ActivityManagerService)Android的核心服务之一,对于framework各个核心服务,更多framework学习进阶,获~如果不是专门去做framework开发,先了解其基本的流程机制,再慢慢深究 ~

上一篇下一篇

猜你喜欢

热点阅读