美文网首页Android技术知识
Framework之AMS启动流程,简单上手!

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

作者: 码农的地中海 | 来源:发表于2022-06-28 18:58 被阅读0次

    一、AMS介绍

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

    AMS中重要的数据结构

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

    • service:AMS的引用
    • info:ActivityInfo,Activity中代码和AndroidManifest设置的节点信息,如launchMode
    • launcherFromPackage:启动activity的包名
    • taskAffinity:activity希望归属的栈
    • task:TaskRecord,Activity所在的TaskRecord
    • app:ProcessRecord,ActivityRecord所在的应用程序进程
    • state:ActivityState,当前activity的状态
    • icon:Activity的图标资源和标致符
    • theme:Activity的主题资源标识符

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

    • taskId:任务栈的唯一标识符
    • affinity:任务栈的倾向性
    • Intent:启动这个activity的intent
    • mActivites:ArrayList,按照历史顺序排列的Activity记录
    • mStack:ActivityStack,当前归属的ActivityStack
    • mService:AMS的引用

    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开发,先了解其基本的流程机制,再慢慢深究 ~

    相关文章

      网友评论

        本文标题:Framework之AMS启动流程,简单上手!

        本文链接:https://www.haomeiwen.com/subject/whkzvrtx.html