文章目录
前言
在第三章,我们分析了SystemServer的启动流程,也概括性的描述了其启动后做了些什么事情,其中最重要的就是启动了很多SystemService,那么这个章节,我们来具体看看SystemServer进程是如何启动ActivityMangerService的。
SystemServer.run()
一、AMS/ATMS的启动前的一些工作
我们再来看下SystemServer的run方法:
public static void main(String[] args) {
new SystemServer().run();
}
private void run() {
...
//1.初始化 System Context
createSystemContext();
//2.创建 SystemServiceManager 对象,用来启动后面的服务
mSystemServiceManager = new SystemServiceManager(mSystemContext);
mSystemServiceManager.setStartInfo(mRuntimeRestart,
mRuntimeStartElapsedTime, mRuntimeStartUptime);
//把SystemServiceManager添加到本地服务的全局注册表中
LocalServices.addService(SystemServiceManager.class, mSystemServiceManager);
// Prepare the thread pool for init tasks that can be parallelized
//3.准备SystemServer的线程池
SystemServerInitThreadPool.get();
...
//4.启动服务
startBootstrapServices(); //启动引导服务
startCoreServices(); //启动核心服务
startOtherServices(); //启动其他服务
...
}
看到这里可能有的同学有点模糊了,从前几个章节的介绍到现在,出现了SystemServer、ServiceManager、SystemServiceManger、SystemService,这里需要给同学们做个概念上的讲解:
SystemServer:这是一个进程,zygote fork的第一个进程,AMS等SystemService都在该进程运行。
SystemService:系统服务类的抽象基础类,AMS等服务往往都自身或内部类继承于该抽象类。
SystemServiceManger:这是一个创建服务实例,启动服务实例,管理服务实例的生命周期的一个类。
ServiceManager:这个类的主要职责是控制用户访问服务,控制服务是否可以使用这一接口(通过注册时的检查权限),只管理Service,并不负责创建和启动服务实例。
这里有篇博客做了比较详细说明:https://blog.csdn.net/b1480521874/article/details/79422909
好了,概念明确后,我们继续接着分析。
1.初始化 System Context:createSystemContext()
private void createSystemContext() {
ActivityThread activityThread = ActivityThread.systemMain();
//获取system context
mSystemContext = activityThread.getSystemContext();
//设置系统主题
mSystemContext.setTheme(DEFAULT_SYSTEM_THEME);
//获取systemui context
final Context systemUiContext = activityThread.getSystemUiContext();
//设置systemUI 主题
systemUiContext.setTheme(DEFAULT_SYSTEM_THEME);
}
在该方法中,主要完成了几件事:
1.创建了 ActivityThread
2.在ActivityThread中,初始化了 Instrumentation、System Context、Application
3.设置主题
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();
thread.attach(true, 0);
return thread;
}
private void attach(boolean system, long startSeq) {
mSystemThread = system;
if (!system) {
//应用进程的处理流程
...
} else {
//系统进程的处理流程,该情况只在SystemServer中处理
//创建ActivityThread中的重要成员:Instrumentation、 Application 和 Context
mInstrumentation = new Instrumentation();
mInstrumentation.basicInit(this);
//创建系统的Context,Context是Android中的一个抽象类,用于维护应用运行环境的全局信息
//通过Context可以访问应用的资源和类,甚至进行系统级的操作,例如启动Activity、发送广播等
ContextImpl context = ContextImpl.createAppContext(
this, getSystemContext().mPackageInfo);
//调用LoadedApk的makeApplication函数,Application类用于保存应用的全局状态
mInitialApplication = context.mPackageInfo.makeApplication(true, null);
mInitialApplication.onCreate();
}
}
public ContextImpl getSystemContext() {
synchronized (this) {
if (mSystemContext == null) {
//调用ContextImpl的静态函数createSystemContext
mSystemContext = ContextImpl.createSystemContext(this);
}
return mSystemContext;
}