系统启动流程(五)之分析SystemServer的main函数

187 阅读2分钟

前言

系统启动流程(四)之Zygote如何启动SystemServer进程文章中,我们知道了Zygote进程启动SystemServer,源码最终走到了SystemServermain函数,接下来我们来简单看看这个main函数里面做了什么:

//代码文件位置:frmework/base/services/java/com/android/server/SystemServer.java
public static void main(String[] args) { 
    new SystemServer().run(); 
}

main方法中只调用了SystemServerrun方法:

//代码文件位置:frmework/base/services/java/com/android/server/SystemServer.java
private void run() { 
    try {
        *****省略部分代码*****
        
        //创建消息Looper
        Looper.prepareMainLooper(); 
        
        //加载了动态库libandroid_servers.so
        System.loadLibrary("android_servers"); 
        
        //创建系统的Context
        createSystemContext(); 
        
        //创建SystemServiceManager,它会对系统服务进行创建、启动和生命周期的管理
        mSystemServiceManager = new SystemServiceManager(mSystemContext);
        
        *****省略部分代码*****
        
        try { 
            traceBeginAndSlog("StartServices"); 
            //启动引导服务
            startBootstrapServices(); 
            
            //启动核心服务
            startCoreServices(); 
            
            //启动其他服务
            startOtherServices(); 
          
            *****省略部分代码***
    }
}

可以看到,在run方法中:

  • 首先加载了动态库libandroid_server.so
  • 接下来创建了SystemServiceManager,用来对系统服务的创建、启动、以及管理它们的生命周期;
  • 接着调用startBootstrapServices()方法,里面主要是使用刚刚创建的SystemServiceManager去启动AMSPKMS等服务;
  • 调用startCoreServices()方法,则是去启动DropBoxManagerServiceBatteryService等服务;
  • startOtherServices()方法也是去启动一些系统服务。

到这里可以知道,官方把系统服务分为了是那种类型:分别是引导服务核心服务其他服务(指一些非紧要和不需要立即启动的服务):

image.png

总结

SystemServer进程被创建后,主要做了以下工作:

  • 启动Binder线程池,这样就可以和其他进程通信了;
  • 创建SystemServiceManger,用于对系统服务进行创建、启动和管理它们的生命周期;
  • 启动各种系统服务

系列文章

点击直达→→ 更多系统启动流程文章

有所收获的朋友,请多多关注、点赞,谢谢大家!