前言:本专题是基于android9.1的源码对AMS进行深度剖析,这应该是目前全网中对AMS分析的最新最细的一篇文章;
其实AMS的主要内容可以分为两大部分,一个是AMS的数据结构,一个是AMS与AcitivtyThread的交互;
在分析这两大块之前,先来看下AMS的启动;
第一节讲的是AMS的启动!
AMS是一个系统级服务,系统级服务的启动都是在SyetemServer进程中启动的,我们看下SyetemServer的main方法:
frameworks/base/services/java/com/android/server/SystemServer.java
public static void main(String[] args) {
new SystemServer().run();
}
点评:关于SystemServer,我们后面会有章节详细分析,现在我们主要的是分析AMS的启动流程;
main方法中只调用了SystemServer的run方法,继续看:
frameworks/base/services/java/com/android/server/SystemServer.java
private void run() {
try {
......
//准备主线程
android.os.Process.setThreadPriority(
android.os.Process.THREAD_PRIORITY_FOREGROUND);
android.os.Process.setCanSelfBackground(false);
//主线程的Looper
Looper.prepareMainLooper();
Looper.getMainLooper().setSlowLogThresholdMs(
SLOW_DISPATCH_THRESHOLD_MS, SLOW_DELIVERY_THRESHOLD_MS);
//加载了动态库libandroid_servers.so
System.loadLibrary("android_servers");
//创建SystemServiceManager,它会对系统的服务进行创建、启动和生命周期管理
mSystemServiceManager = new SystemServiceManager(mSystemContext);
mSystemServiceManager.setStartInfo(mRuntimeRestart,mRuntimeStartElapsedTime, mRuntimeStartUptime);
LocalServices.addService(SystemServiceManager.class, mSystemServiceManager);
// Prepare the thread pool for init tasks that can be parallelized
SystemServerInitThreadPool.get();
} finally {
traceEnd(); // InitBeforeStartServices
}
// Start services.
try {
traceBeginAndSlog("StartServices");
//启动引导服务
//用SystemServiceManager启动了ActivityManagerService、PowerManagerService、 PackageManagerService等服务
startBootstrapServices();
/// M: For mtk systemserver
sMtkSystemServerIns.startMtkBootstrapServices();
//核心服务
//启动BatteryService、UsageStatsService和WebViewUpdateService
startCoreServices();
/// M: for mtk other service.
sMtkSystemServerIns.startMtkCoreServices();
//启动核心服务
//启动了WMS,CameraService、AlarmManagerService、VrManagerService等服务
startOtherServices();
SystemServerInitThreadPool.shutdown();
} catch (Throwable ex) {
throw ex;
} finally {
traceEnd();
}
}
点评:官方把系统服务分为了三种类型,分别是引导服务、核心服务和其他服务,其中其他服务是一些非紧要和一些不需要立即启动的服务。系统服务总共大约有80多个,我们主要来查看引导服务AMS是如何启动的,也就是startBootstrapServices()方法:
frameworks/base/services/java/com/android/server/SystemServer.java
private void startBootstrapServices() {
//Activity manager runs the show.
traceBeginAndSlog("StartActivityManager");
mActivityManagerService = mSystemServiceManager.startService(
ActivityManagerService.Lifecycle.class).getService();
mActivityManagerService.setSystemServiceManager(mSystemServiceManager);
mActivityManagerService.setInstaller(installer);
traceEnd();
}
调用了SystemServiceManager的startService()方法,方法的参数是ActivityManagerService.Lifecycle.class,继续:
frameworks/base/services/core/java/com/android/server/SystemServiceManager.java
public <T extends SystemService> T startService(Class<T> serviceClass) {
try {
final T service;
try {
//serviceClass是Lifecycle.class,得到传进来的Lifecycle的构造器constructor
Constructor<T> constructor = serviceClass.getConstructor(Context.class);
//通过反射,调用constructor的newInstance方法来创建Lifecycle类型的service对象
service = constructor.newInstance(mContext);
} catch (InstantiationException ex) {
............
}
//调用startService()
startService(service);
//返回该service
return service;
} finally {
Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
}
}
public void startService(@NonNull final SystemService service) {
//将刚创建的service添加到ArrayList类型的mServices对象中来完成注册
mServices.add(service);
// Start it.
long time = SystemClock.elapsedRealtime();
try {
//并调用service的onStart方法来启动service
service.onStart();
} catch (RuntimeException ex) {
}
}
点评:Lifecycle是AMS的内部类,代码如下:
frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java
public static final class Lifecycle extends SystemService {
private final ActivityManagerService mService;
public Lifecycle(Context context) {
super(context);
//创建ActivityManagerService实例
mService = new ActivityManagerService(context);
}
@Override
public void onStart() {
//调用AMS的start()方法
mService.start();
}
@Override
public void onBootPhase(int phase) {
mService.mBootPhase = phase;
if (phase == PHASE_SYSTEM_SERVICES_READY) {
mService.mBatteryStatsService.systemServicesReady();
mService.mServices.systemServicesReady();
}
}
@Override
public void onCleanupUser(int userId) {
mService.mBatteryStatsService.onCleanupUser(userId);
}
public ActivityManagerService getService() {
//返回AMS
return mService;
}
}
点评:通过上面的代码我们得知,当通过反射来创建Lifecycle实例时,会创建AMS实例,当调用Lifecycle类型的service的onStart方法时,实际上是调用了AMS的start()方法。
我们现在可以总结下AMS的启动流程了:
mActivityManagerService = mSystemServiceManager.startService(ActivityManagerService.Lifecycle.class).getService();
我们知道SystemServiceManager的startService方法最终会返回Lifecycle类型的对象,紧接着又调用了Lifecycle的getService方法,这个方法会返回AMS类型的mService对象,这样AMS实例就会被创建并且返回。