概述
参考:《Android框架揭秘》第11章
源码路径: /frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java
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及之前版本
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与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(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
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
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的代理类。