ActivityTaskManagerService解析

3,870 阅读2分钟

1.概述

ActivityTaskManagerService(以下简称ATMS)是Android 10新增加的系统服务类,承担了ActivityManagerService(AMS)的部分工作(activities、task, stacks, displays相关),比如将Activity的启动相关的调用转移到了ATMS中。以下源码基于Android 11,并对ATMS进行简单介绍。

2.ATMS的启动过程

ATMS启动的时序图如下所示:

image.png

ATMS和AMS、PMS一样,也是在SystemServer中的startBootstrapServices中创建,部分代码如下:

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

public final class SystemServer {
    ...
    //启动引导服务
    startBootstrapServices(t);
    //启动核心服务
    startCoreServices(t);
    //启动其他服务
    startOtherServices(t);
    ...
    private void startBootstrapServices(@NonNull TimingsTraceAndSlog t) {
        ...
        //1
        ActivityTaskManagerService atm = mSystemServiceManager.startService(
              ActivityTaskManagerService.Lifecycle.class).getService();
        mActivityManagerService = ActivityManagerService.Lifecycle.startService(
                mSystemServiceManager, atm);
        ...
    }
}

在注释1处,主要是通过SystemServiceManager.startService来创建并获取ActivityTaskManagerService实例,并作为参数传入AMS。 SystemServiceManager部分相关代码如下:

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

public class SystemServiceManager {
        ...
        private final ArrayList<SystemService> mServices = new ArrayList<SystemService>();
        ...
        public <T extends SystemService> T startService(Class<T> serviceClass) {
            Constructor<T> constructor = serviceClass.getConstructor(Context.class);
            service = constructor.newInstance(mContext);
            ...
            startService(service);
            return service;   
        }
        
        public void startService(@NonNull final SystemService service) {
            // Register it.
            mServices.add(service);
            // Start it.
            long time = SystemClock.elapsedRealtime();
            try {
                service.onStart();
            }
            ...
    }
}

在SystemServiceManager.startService内部通过Constructor构造器创建并且初始化ActivityTaskManagerService.Lifecycle实例,Lifecycle内部会创建ATMS实例,最终调用Lifecycle的onStart方法。startService方法返回Lifecycle实例并通过getService()获取到了ATMS实例。

ActivityTaskManagerService.Lifecycle为ATMS的内部类:

public static final class Lifecycle extends SystemService {
        private final ActivityTaskManagerService mService;

        public Lifecycle(Context context) {
            super(context);
            mService = new ActivityTaskManagerService(context);
        }

        @Override
        public void onStart() {
            publishBinderService(Context.ACTIVITY_TASK_SERVICE, mService);
            mService.start();
        }
        ...
        public ActivityTaskManagerService getService() {
            return mService;
        }
    }

内部类Lifecycle继承了SystemService,在构造函数中创建了ActivityTaskManagerService对象,并在onStart()中调用SystemService的publishBinderService将ATMS注册到ServiceManager中并调用ATMS的start方法。

3.初始化函数initialize()

在AMS的构造函数中会调用ATMS的initialize()方法

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

...
public ActivityManagerService(Context systemContext, ActivityTaskManagerService atm) {
    ...
    mActivityTaskManager = atm;
    //调用STMS的initialize,并传入Display线程的Looper
    mActivityTaskManager.initialize(mIntentFirewall, mPendingIntentController,
            DisplayThread.get().getLooper());
    ...
}

initialize()方法会初始化一些对象实例,比如ActivityStackSupervisor、ActivityStartController等,会涉及到Activity的启动以及Activiy栈的一些逻辑,代码如下:

public void initialize(IntentFirewall intentFirewall, PendingIntentController intentController,
            Looper looper) {
        ...
        //1
        mStackSupervisor = createStackSupervisor();

        mTaskChangeNotificationController =
                new TaskChangeNotificationController(mGlobalLock, mStackSupervisor, mH);
        mLockTaskController = new LockTaskController(mContext, mStackSupervisor, mH);
        //2
        mActivityStartController = new ActivityStartController(this);
        setRecentTasks(new RecentTasks(this, mStackSupervisor));
        mVrController = new VrController(mGlobalLock);
        mKeyguardController = mStackSupervisor.getKeyguardController();
    }

注释1处创建了ActivityStackSupervisor,ActivityStackSupervisor负责管理ActivityStack;

注释2处创建ActivityStartController,并将ATMS自身传入。ActivityStartController主要负责Activity启动的相关工作。例如在startActivityAsUser通过getActivityStartController().obtainStarter(...)获取到ActivityStarter并执行后续的启动工作。