Android开发

Android系统启动之二-启动SystemServer

本文主要是介绍Android系统启动之二-启动SystemServer,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

前言

继上篇《Android系统启动之一-启动Zygote》,本篇继续来看 SystemServer 进程做了什么事情。

Zygote 和 SystemServer 是 Android 系统最重要的两个进程,Zygote 负责创建新进程,而 SystemServer 负责创建应用所需要的服务,例如 ActivityManagerService。

logo.jpeg

SystemServer.main

源码:frameworks/base/services/java/com/android/server/SystemServer.java

main 方法没有什么内容,就是 new 了一个 SystemServer 类之后调用它的 run 方法。

/**
 * The main entry point from zygote.
 */
public static void main(String[] args) {
    new SystemServer().run();
}
复制代码

SystemServer.run

run 方法的主要工作:

  1. 初始化自身和环境;

  2. 加载 android_server native 库;

  3. 创建 SystemContext 和 SystemServiceManager;

  4. 启动各类 Service;

  5. Looper 当前线程,开始接收消息。

 private void run() {
 	...
 //取消 Java 虚拟机的内存限制,
 VMRuntime.getRuntime().clearGrowthLimit();
   ...
 // Increase the number of binder threads in system_server
 BinderInternal.setMaxThreads(sMaxBinderThreads);
   ...
  // Prepare the main looper thread (this thread).
  //准备 Looper
  android.os.Process.setThreadPriority(
          android.os.Process.THREAD_PRIORITY_FOREGROUND);
  android.os.Process.setCanSelfBackground(false);
  Looper.prepareMainLooper();
  ...
   //创建系统 context
   createSystemContext();

   // Create the system service manager.
   mSystemServiceManager = new SystemServiceManager(mSystemContext);
   mSystemServiceManager.setStartInfo(mRuntimeRestart,
           mRuntimeStartElapsedTime, mRuntimeStartUptime);
   LocalServices.addService(SystemServiceManager.class, mSystemServiceManager);
   ...

    // Start services.
   //启动各项服务
   startBootstrapServices();
   startCoreServices();
   startOtherServices();
   ...
   //开始 Looper
   Looper.loop();
}
复制代码

createSystemContext

关于如何创建系统 context 流程比较长,借用一图(来源:gityuan)来看比较清晰。

SystemServer创建SystemContext流程

startBootstrapServices

该函数负责启动一些关键性的系统服务,以便 Android 系统能开始第一步正常运行。例如安装服务、屏幕显示服务等。

 private void startBootstrapServices(){
 	//启动 WatchDog
 	 final Watchdog watchdog = Watchdog.getInstance();
      watchdog.start();
        ...
    //启动安装服务
    Installer installer = mSystemServiceManager.startService(Installer.class);
    ...
    //启动亮屏服务
    mSystemServiceManager.startService(LightsService.class);
    ...
 }
复制代码

startCoreServices

这个函数启动一些重要的服务,但是不会影响到 Android 系统正常的启动。例如电池服务、用量统计服务等。

private void startCoreServices() {
// 电池服务
mSystemServiceManager.startService(BatteryService.class);
...
//用量统计服务
mSystemServiceManager.startService(UsageStatsService.class);
mActivityManagerService.setUsageStatsManager(
        LocalServices.getService(UsageStatsManagerInternal.class));
...
//设备缓存服务
mSystemServiceManager.startService(CachedDeviceStateService.class);
}

复制代码

startOtherServices

启动其他服务,例如 WindowManagerService、InputManagerService 和 NetworkManagementService 等。

最后最重要的是 AMS 的 systemReady 方法,调用这个方法表示 SystemServer 已经准备好其他服务了,等待 AMS 做最后的状态准备,AMS 回调完成后表示 AMS 可以开始接受启动其他应用程序。

private void startOtherServices() {
  ...
  // We now tell the activity manager it is okay to run third party
  // code.  It will call back into us once it has gotten to the state
  // where third party code can really run (but before it has actually
  // started launching the initial applications), for us to complete our
  // initialization.
  mActivityManagerService.systemReady(() -> {
  	...
  })
}
复制代码

启动Looper

最后,Looper.loop() 进入等待状态,SystemServer 启动完成,等待其他线程发送消息再进行下一步动作。

这篇关于Android系统启动之二-启动SystemServer的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!