SystemServer进程

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;
}

你可能感兴趣的:(SystemServer进程)