赞
踩
在第三章,我们分析了SystemServer的启动流程,也概括性的描述了其启动后做了些什么事情,其中最重要的就是启动了很多SystemService,那么这个章节,我们来具体看看SystemServer进程是如何启动ActivityMangerService的。
我们再来看下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
好了,概念明确后,我们继续接着分析。
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)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。