SystemServer 是 Zygote创建的第一个 Java 进程,由startSystemServer()@ZygoteInit.java方法进行 fork,以下以 SystemServer 的入口函数是 SystemServer.main()为基础,其调用时机在Zygote进程及其孵化子进程(system_server及ActivityThread)的流程一
public static void main(String[] args){
new SystemServer().run();
}
下面摘抄run()的关键步骤:
private void run(){
//一些参数初始化工作
...
Looper.prepareMainLooper();
...
//创建系统上下文对象,包含关键的 ActivityThread和 Context
createSystemContext();
...
//启动服务,包括 AMS,WMS,PMS 等
startBootstrapServices();
startCoreServices();
startOtherServices();
...
Looper.loop();
}
这里主要看createSystemContext();
private void createSystemContext(){
ActivityThread activityThread = ActivityThread.systemMain();
mSystemContext = activityThread.getSystemContext();
}
下面转到 ActivityThread.java 中
- 分析 systemMain()
public static ActivityThread systemMain(){
...
ActivityThread thread = new ActivityThread();
thread.attach(true);
}
构造函数没有做什么工作,主要是这个 attach(true)方法
private void attach(boolean system){
sCurrentActivityThread = this;
//是否是系统进程,这里的system = true;
mSystemThread = system;
if(!system){
...
}else{
...
//就是创建了 Instrumentation 对象,并且创建其 Application 对象
mInstrumentation = new Instrumentation();
ContextImpl context = ContextImpl.createAppContext(this,getSystemContext().mPackageInfo);
mInitialApplication = context.mPackageInfo.makeApplication(true,null);
mInitialApplication.onCreate();
}
}
public ContetImpl getSystemContext(){
synchronized(this){
if(mSystemContext == null){
//创建一个 Context 对象,其实在 Android 中Context 的实现类只有 ContextImpl,在你运行的 Activity 等组件中,Context 的方法实质上都是这个 ContextImpl.
mSystemContext = ContextImpl.createSystemContext(this);
}
return mSystemContext;
}
}
static ContextImpl createSystemContext(ActivityThread mainThread){
LoadedApk packageInfo = new LoadeApk(mainThread);
ContextImpl context = new ContextImpl(null,mainThread,packageInfo,null,null,false,null,null,Display.INVALID_DISPLAY);
...
return context;
}