Zygote家的大儿子 —— SystemServer
本文基于 Android 9.0 , 代码仓库地址 : android_9.0.0_r45
文中源码链接:
首先来回顾一下上篇文章 Java 世界的盘古和女娲 —— Zygote ,主要介绍了 Android 世界中的第一个 Java 进程 Zygote
,它的主要工作流程如下:
registerServerSocketFromEnv()
, 注册服务端 socket,用于和客户端进程通信preload()
,预加载一系列资源,提高应用启动速度forkSystemServer()
,创建system_server
进程- 功成身退,调用
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