ActivityManagerService
简称AMS
,具有管理Activity行为、控制Activity的生命周期、派发消息事件、内存管理等功能。查看AMS源码之前一定要先看一下前文System_Server进程启动过程:https://blog.csdn.net/u010982507/article/details/104123531
以下源码为8.0系统。
从上文中的system_server进程启动流程分析中可以得知,在SystemServer.java
类(路径是:/frameworks/base/services/java/com/android/server/SystemServer.java
)中的run方法中调用了启动引导服务,代码如下:
private void run() {
...
// Initialize the system context.
// 第一步:创建系统上下文
createSystemContext();
// Create the system service manager.
// 启动SystemServiceManager管理器
mSystemServiceManager = new SystemServiceManager(mSystemContext);
mSystemServiceManager.setRuntimeRestarted(mRuntimeRestart);
LocalServices.addService(SystemServiceManager.class, mSystemServiceManager);
// Prepare the thread pool for init tasks that can be parallelized
SystemServerInitThreadPool.get();
// 第二步:启动引导服务
startBootstrapServices();
// 第三步:systemReady处理
startOtherServices();
...
}
一、在SystemServer中创建ActivityThread
实例
查看createSystemContext()
方法,该方法主要用来是初始化 System Context和SystemUi Context,并设置主题。
private void createSystemContext() {
// 1.得到ActivityThread 对象
ActivityThread activityThread = ActivityThread.systemMain();
// 获取系统上下文
mSystemContext = activityThread.getSystemContext();
// 设置主题
mSystemContext.setTheme(DEFAULT_SYSTEM_THEME);
// 获取系统ui上下文
final Context systemUiContext = activityThread.getSystemUiContext();
// 设置主题
systemUiContext.setTheme(DEFAULT_SYSTEM_THEME);
}
在该方法中调用了ActivityThread
类的systemMain
方法,这个方法得到了一个ActivityThread对象,它代表当前进程 (此时为系统进程) 的主线程;找到ActivityThread
的类,文件路径为:/frameworks/base/core/java/android/app/ActivityThread.java
public static ActivityThread systemMain() {
// The system process on low-memory devices do not get to use hardware
// accelerated drawing, since this can add too much overhead to the
// process.
if (!ActivityManager.isHighEndGfx()) {
ThreadedRenderer.disable(true);
} else {
ThreadedRenderer.enableForegroundTrimming();
}
// 创建ActivityThread 类
ActivityThread thread = new ActivityThread();
// 调用attach函数
thread.attach(true);
return thread;
}
二、ActivityThread类
ActivityThread功能说明
为此,Android提供了一个IApplicationThread接口,该接口定义了AMS和应用进程之间的交互函数。
1、从ActivityThread
的systemMain()
方法中得知ActivityThread
的创建,找到ActivityThread类的构造方法如下:
public final class ActivityThread {
...
//定义了AMS与应用通信的接口,拿到ApplicationThread的对象
final ApplicationThread mAppThread = new ApplicationThread();
//拥有自己的looper,说明ActivityThread确实可以代表事件处理线程
final Looper mLooper = Looper.myLooper();
//H继承Handler,ActivityThread中大量事件处理依赖此Handler
final H mH = new H();
//用于保存该进程的ActivityRecord
final ArrayMap<IBinder, ActivityClientRecord> mActivities = new ArrayMap<>();
//用于保存进程中的Service
final ArrayMap<IBinder, Service> mServices = new ArrayMap<>();
用于保存进程中的Application
final ArrayList<Application> mAllApplications
= new ArrayList<Application>();
//构造函数
@UnsupportedAppUsage
ActivityThread() {
mResourcesManager = ResourcesManager.getInstance();
}
}
构造方法中获取了ResourcesManager
类单例模式创建的对象。
2、在ActivityThread
的systemMain()
方法中还调用了ActivityThread类的attach方法,对于系统进程而言,ActivityThread的attach函数最重要的工作就是创建了Instrumentation、Application和Context。
private void attach(boolean system) {
sCurrentActivityThread = this;
mSystemThread = system;
if (!system) {
// 应用进程
...
} else {
// 系统进程的处理流程,该情况只在SystemServer中处理
android.ddm.DdmHandleAppName.setAppName("system_process",
UserHandle.myUserId());
try {
//创建ActivityThread中的重要成员:Instrumentation、 Application 和 Context
mInstrumentation = new Instrumentation();
// 创建context
ContextImpl context = ContextImpl.createAppContext(
this, getSystemContext().mPackageInfo);
// 创建Application
mInitialApplication = context.mPackageInfo.makeApplication(true, null);
mInitialApplication.onCreate();
} catch (Exception e) {
throw new RuntimeException(
"Unable to instantiate Application():" + e.toString(), e);
}
}
}
...
(1)、Instrumentation(仪表盘)
Instrumentation是Android中的一个工具类,当该类被启用时,它将优先于应用中其它的类被初始化。
此时,系统先创建它,再通过它创建其它组件。
(2)、Context
Context是Android中的一个抽象类,用于维护应用运行环境的全局信息。
通过Context可以访问应用的资源和类,甚至进行系统级的操作,例如启动Activity、发送广播等。attach方法中通过调用如下方法创建Context:
// 创建context
ContextImpl context = ContextImpl.createAppContext(
this, getSystemContext().mPackageInfo);
找到ContextImpl
类,路径为/frameworks/base/core/java/android/app/ContextImpl.java
中的createAppContext方法:
static ContextImpl createAppContext(ActivityThread mainThread, LoadedApk packageInfo) {
if (packageInfo == null) throw new IllegalArgumentException("packageInfo");
ContextImpl context = new ContextImpl(null, mainThread, packageInfo, null, null, null, 0,
null);
context.setResources(packageInfo.getResources());
return context;
}
而这个方法中传入的参数是getSystemContext().mPackageInfo
,这里调用了getSystemContext()
方法,找到该方法:
public ContextImpl getSystemContext() {
synchronized (this) {
if (mSystemContext == null) {
mSystemContext = ContextImpl.createSystemContext(this);
}
return mSystemContext;
}
}
这里又调用了ContextImpl.createSystemContext(this)
方法,找到ContextImpl类的该方法:
static ContextImpl createSystemContext(ActivityThread mainThread) {
//创建LoadedApk类,代表一个加载到系统中的APK
//注意此时的LoadedApk只是一个空壳
//PKMS还没有启动,无法得到有效的ApplicationInfo
LoadedApk packageInfo