ActivityManagerService作为Android系统中的重要的系统服务之一,我们有必要来了解下。这篇文章就跟大家一起分析下它的创建、启动过程以及它的基本作用。
如果大家看过前面的《Android App进程创建过程分析》、《Android Activity启动过程分析》两篇文章,想必对ActivityManagerService(后面我们简称AMS)不会陌生,进程创建和Activity启动都有涉及到AMS。但是AMS又不只这些功能,下面我们就来了解下它的创建、启动过程以及它的基本功能。
创建与启动
在了解AMS的功能之前,我们先来看下AMS的创建和启动过程。在SystemServer启动过程中会创建并启动一些系统服务,而AMS就是其中之一。AMS创建和启动整个过程如下图所示:
启动过程大致如下:
- 在SystemServer的startBootstrapService()中调用ActivityManagerService静态内部类Lifecycle的startService()方法。
- ActivityManagerService.Lifecycle.startService()最终通过SystemServiceManager.startService()方法创建ActivityManagerService.Lifecycle实例,并调用它的onStart()方法。
- 在创建ActivityManagerSrevice.Lifecycle实例时会创建ActivityManagerService对象;在调用ActivityManagerService.Lifecycle.onStart()方法时会调用ActivityManagerService.start()方法。
接下来我们通过源码看下具体流程,首先看下SystemServer.startBootstrapServices()方法
//frameworks/base/services/java/com/android/server/SystemServer.java
private void startBootstrapServices() {
//省略部分代码.......
//start ActivityTaskManagerService
ActivityTaskManagerService atm = mSystemServiceManager.startService(
ActivityTaskManagerService.Lifecycle.class).getService();
//start AMS,这里是通过ActivityManagerServerice的静态内部类Lifecycle的startService()方法实现的
mActivityManagerService = ActivityManagerService.Lifecycle.startService(
mSystemServiceManager, atm);
mActivityManagerService.setSystemServiceManager(mSystemServiceManager);
mActivityManagerService.setInstaller(installer);
//省略部分代码.......
}
注释用已做了说明,我们继续看下ActivityManagerService.Lifecycle类
//frameworks\base\services\core\java\com\android\server\am\ActivityManagerService.java
//ActivityManagerService.Lifecycle
public static final class Lifecycle extends SystemService {
private final ActivityManagerService mService;
private static ActivityTaskManagerService sAtm;
public Lifecycle(Context context) {
super(context);
//在构造方法中调用ActivityManagerService构造方法,并传入Context和ActivityTaskManagerServiced
mService = new ActivityManagerService(context, sAtm);
}
public static ActivityManagerService startService(
SystemServiceManager ssm, ActivityTaskManagerService atm) {
//给ActivityTaskManagerService类型静态变量sAtm赋值
sAtm = atm;
//调用SystemServiceManager.startService()方法得到Lifecycle对象
//然后调用Lifecycle.getService()并返回ActivityManagerService对象。
return ssm.startService(ActivityManagerService.Lifecycle.class).getService();
}
@Override
public void onStart() {
//调用ActivityManagerService.start()方法
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 onCleanupUser(int userId) {
mService.mBatteryStatsService.onCleanupUser(userId);
}
public ActivityManagerService getService() {
return mService;
}
}
startService(SystemServiceManager ssm, ActivityTaskManagerService atm)
方法是通过调用SystemServiceManager.startService()方法来创建ActivityManagerSrevice对象的,所以我们看下SystemServiceManager.startService()方法的实现。
// /frameworks\base\services\core\java\com\android\server\SystemServiceManager.java
@SuppressWarnings("unchecked")
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);
//创建SystemService实例
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的重载方法
startService(service);
return service;
} finally {
Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
}
}
public void startService(@NonNull final SystemService service) {
// Register it.
// 加入到缓存列表
mServices.add(service);
// Start it.
long time = SystemClock.elapsedRealtime();
try {
//调用onStart()方法
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");
}
在这个过程主要做了以下几件事:
- 通过反射创建ActivityManagerService.Lifecycle实例(会调用Lifecycle构造方法),并将它加入到SystemServiceManager中的mService列表缓存。
- 调用ActivityManagerService.Lifecycle.onStart()方法。
在创建ActivityManagerService.Lifecycle实例和调用onStart()方法时,会分别创建AMS实例和调用AMS.start()方法。
//frameworks\base\services\core\java\com\android\server\am\ActivityManagerService.java
public ActivityManagerService(Context systemContext, ActivityTaskManagerService atm) {
LockGuard.installLock(this