AMS概述

Post on Aug 01, 2022 by Wei Lin

概述

参考:《Android框架揭秘》第11章

源码路径: /frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java

AMS作用

Android中AMS的理解与简介——简书

ActivityManagerService是一种Java系统服务,它是平台核心服务之一,用来创建Android应用程序组件(Activity)、服务、广播接收器(Broadcast Receiver)等,并管理它们的生命周期。

其具体功能有:

  • 组件状态管理:包括四大组件的开启,关闭等一系列操作。如startActivity(),startActivityAndWait(),activityPaused(),startService(),stopService(),removeContentProvider()等;
  • 组件状态查询:查询组件当前运行等情况。如getCallingActivity(),getService()等;
  • Task相关:包括removeTask(),removeSubTask(),moveTaskBackwards(),moveTaskToFront()等。

AMS是通过ActivityStack及其他数据结构来记录,管理系统中的Activity及其他组件状态的,并提供查询功能的一个系统服务。

AMS类图

Android学习——ActivityManager与Proxy模式的运用

(1) Android 7.0及之前版本

AMS的Binder架构-非Aidl实现.jpg

ActivityManagerNative:其作用类似于Aidl中的IActivityManagerService.Stub类,具体的实现类需要继承它。

public abstract class ActivityManagerNative extends Binder implements IActivityManager {......}


(2) Android 8.0及之后版本

由于之前的ActivityManagerService没有使用aidl机制,因此看上去复杂了一些。之后的Android版本中使用aidl机制生成代码,IActivityManager.aidl生成了IActivityManager.java,其中IActivityManager.Stub代替了ActivityManagerNative,IActivityManager.Stub.Proxy代替了ActivityManagerProxy。

AMS的Binder架构-非Aidl实现.jpg

AMS与ATMS

ActivityTaskManagerService(简称ATMS)是Android 10新增加的系统服务类,承担了之前的ActivityManagerService的部分工作(包括Activity、Task、Stacks相关)。

ATMS和AMS、PMS一样,也是在SystemServer中的startBootstrapServices中创建的,在startBootstrapServices()中启动。

ActivityTaskManagerService atm = mSystemServiceManager.startService(
     ActivityTaskManagerService.Lifecycle.class).getService();
 mActivityManagerService = ActivityManagerService.Lifecycle.*startService*(
     mSystemServiceManager, atm);
 mActivityManagerService.setSystemServiceManager(mSystemServiceManager);
 mActivityManagerService.setInstaller(installer);
 mWindowManagerGlobalLock = atm.getGlobalLock();

ActivityManager类的作用

ActivityManager解析及使用——CSDN

ActivityManager(AM)是一个可以被客户端使用的类,它主要对运行中的activity进行管理,由于AMS是系统核心服务,很多API不能开放供客户端使用,所以设计者没有让ActivityManager直接加入AMS家族。

但ActivityManager中的管理工作实际上并不是由ActivityManager来处理的,而是交由AMS来处理的。ActivityManager中的方法通过Binder跨进程调用到system_server进程中的AMS。

ActivityManager常用方法:

方法 作用         
clearApplicationUserData() 用于清除用户数据,等同于在手机设置中清除用户数据
addAppTask (Activity activity, Intent intent, ActivityManager.TaskDescription description, Bitmap thumbnail) 为Activity 创建新的任务栈 activity 需要创建任务栈的Activity intent 用于跳转页面的Intent description 描述信息 thumbnail 缩略图
getDeviceConfigurationInfo() 获取设备信息
getLauncherLargeIconSize() 获取Launcher(启动器)图标大小
getMemoryInfo (ActivityManager.MemoryInfo outInfo) 获取系统当前内存信息
getProcessMemoryInfo() 返回一个或者多个进程使用内存的情况
getRunningAppProcesses() 获取该设备上应用程序进程列表
getAppTasks() 获取当前应用任务列表
isUserAMonkey() 是否用户是一个猴子,用于判断键盘是否被乱按
killBackgroundProcesses(String packageName) 根据包名杀死对应进程
getRunningTasks (int maxNum) 获取用户启动的任务列表
getMyMemoryState (ActivityManager.RunningAppProcessInfo outState) 获取该进程的全局内存状态

AMS启动流程

Base on:Android 12

Android中AMS的理解与简介——简书

SystemServer.startBootstrapServices()

AMS在SystemServer中启动。调用AMS.Lifecycle.startService()时传入两个参数,即SystemServiceManager对象和ActivityTaskManagerService对象。

private ActivityManagerService mActivityManagerService;

private void startBootstrapServices(@NonNull TimingsTraceAndSlog t) {

  //…

  mActivityManagerService = ActivityManagerService.Lifecycle.*startService*(
       mSystemServiceManager, atm);
   mActivityManagerService.setSystemServiceManager(mSystemServiceManager);
   mActivityManagerService.setInstaller(installer);

}

AMS.Lifecycle.startService()

用了SystemServiceManager并传入ActivityManagerService.Lifecycle来创建AMS。

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

    public Lifecycle(Context context) {
        super(context);
        mService = new ActivityManagerService(context, sAtm);
    }

    public static ActivityManagerService startService(
            SystemServiceManager ssm, ActivityTaskManagerService atm) {
        sAtm = atm;
        return ssm.startService(ActivityManagerService.Lifecycle.class).getService();
    }

    @Override
    public void onStart() {
        mService.start();
    }

    @Override
    public void onBootPhase(int phase) {
        mService.mBootPhase = phase;
        if (phase == PHASE_SYSTEM_SERVICES_READY) {
            mService.mBatteryStatsService.systemServicesReady();
            mService.mServices.systemServicesReady();
        } else if (phase == PHASE_ACTIVITY_MANAGER_READY) {
            mService.startBroadcastObservers();
        } else if (phase == PHASE_THIRD_PARTY_APPS_CAN_START) {
            mService.mPackageWatchdog.onPackagesReady();
        }
    }

    @Override
    public void onUserStopped(@NonNull TargetUser user) {
        mService.mBatteryStatsService.onCleanupUser(user.getUserIdentifier());
    }

    public ActivityManagerService getService() {
        return mService;
    }
}

SSM.startService(Lifecycle)

SSM = SystemServiceManager 这里的Class是ActivityManagerService.Lifecycle对象。 通过反射的方式,调用AMS.Lifecycle类构造方法创建了AMS.Lifecycle实例。在AMS.Lifecycle的构造方法中创建了AMS类。

public Lifecycle(Context context) {
    super(context);
    mService = new ActivityManagerService(context, sAtm);
}

SystemServiceManager.java

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 {
            Constructor<T> constructor = serviceClass.getConstructor(Context.class);
            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(service);
        return service;
    } finally {
        Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
    }
}

SSM.startService(SystemService)

SSM = SystemServiceManager 将AMS注册到SystemService中并调用其AMS.Lifecycle.onStart()方法,最后实际调用的是AMS.start()方法。

public void startService(@NonNull final SystemService service) {
    // Register it.
    mServices.add(service);
    // Start it.
    long time = SystemClock.elapsedRealtime();
    try {
        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");
}

其它

AM->AMS的Binder调用过程

ActivityManager.java

@UnsupportedAppUsage
public static IActivityManager getService() {
    return IActivityManagerSingleton.get();
}

AM.getService()返回一个实现IActivityManager接口的服务代理对象,即IActivityManager.Stub.Proxy,而Proxy代理对象又调用了ActivityManagerService。

@UnsupportedAppUsage
private static final Singleton<IActivityManager> IActivityManagerSingleton =
        new Singleton<IActivityManager>() {
            @Override
            protected IActivityManager create() {
                final IBinder b = ServiceManager.getService(Context.ACTIVITY_SERVICE);
                final IActivityManager am = IActivityManager.Stub.asInterface(b);
                return am;
            }
        };

ActivityManagerService继承了IActivityManager.Stub,这里采用了AIDL的形式获取到了ActivityManagerService的代理类。