本文基于 Android 9.0 , 代码仓库地址 : android_9.0.0_r45

文中源码链接:

SystemServer.java

SystemServiceManager.java

SystemService.java

首先来回顾一下上篇文章 Java 世界的盘古和女娲 —— Zygote ,主要介绍了 Android 世界中的第一个 Java 进程 Zygote,它的主要工作流程如下:

  1. registerServerSocketFromEnv(), 注册服务端 socket,用于和客户端进程通信
  2. preload(),预加载一系列资源,提高应用启动速度
  3. forkSystemServer(),创建 system_server 进程
  4. 功成身退,调用 runSelectLoop() 等待响应客户端请求,创建应用进程

本篇文章的主角 system_server 进程是 Zygote 进程 fork 出的第一个进程,它负责管理和启动整个 Framework 层。

 

再来看看 Gityuan 的这张图片,找一下 System Server 的位置,它承载了各类系统服务的创建和启动。关于 system_server 进程的创建流程,上篇文章中已经做了详细介绍,这里再简单看一下流程图:

最终会调用到 SystemServer.main() 方法。下面就以此为起点,来具体分析 SystemServer 都做了些什么。

SystemServer 启动流程

public static void main(String[] args) {     new SystemServer().run(); }

接着看 run() 方法。

private void run() {     try {         ......         // 如果设备时间早于 1970 年,很多 API 处理负数时会 crash。所以直接设置为 1970 年 1 月 1 日         if (System.currentTimeMillis() < EARLIEST_SUPPORTED_TIME) {             Slog.w(TAG, "System clock is before 1970; setting to 1970.");             SystemClock.setCurrentTimeMillis(EARLIEST_SUPPORTED_TIME);         }          // 未设置时区的话默认设为 GMT         String timezoneProperty =  SystemProperties.get("persist.sys.timezone");         if (timezoneProperty == null || timezoneProperty.isEmpty()) {             Slog.w(TAG, "Timezone not set; setting to GMT.");             SystemProperties.set("persist.sys.timezone", "GMT");         }          // 语言地区设置         if (!SystemProperties.get("persist.sys.language").isEmpty()) {             final String languageTag = Locale.getDefault().toLanguageTag();              SystemProperties.set("persist.sys.locale", languageTag);             SystemProperties.set("persist.sys.language&q