感谢您的阅读与点赞!欢迎点击右上角关注:「大猫玩程序」
微信公众号:大猫玩程序
![1ae6b0b164fe9312f89b36b3a7fef281.png](https://i-blog.csdnimg.cn/blog_migrate/acd93e0bc56d5d41917d2eb36b757772.jpeg)
上一节讲解了SystemServer的架构以及被Zygote 进程fork的流程,这一节重点讲解SystemServer启动后做了什么, 加载了哪些服务。
Android 10.0系统源码取经之路——启动篇
Android系统架构浅析-「Android取经之路」
Android是怎么启动的-「Android取经之路」
Android 10.0系统启动之init进程(二)-「Android取经之路」
Android 10.0系统启动之init进程(二)-「Android取经之路」
Android 10.0系统启动之init进程(三)-「Android取经之路」
Android 10.0系统启动之init进程(四)-「Android取经之路」
Android 10.0系统启动之Zygote进程(一)-「Android取经之路」
Android 10.0系统启动之Zygote进程(二)-「Android取经之路」
Android 10.0系统启动之Zygote进程(三)-「Android取经之路」
Android 10.0系统启动之Zygote进程(四)-「Android取经之路」
Android 10.0系统启动之SystemServer进程(一)
4.2 SystemServer 启动后的流程
![18fe8afa265442e0e4a21f6b27ff19be.png](https://i-blog.csdnimg.cn/blog_migrate/10b3cfa1c1a5702b6c10b9fdef1c13ae.jpeg)
4.2.1[SystemServer.java] main
说明:main函数由Zygote进程 fork后运行,作用是new 一个SystemServer对象,再调用该对象的run()方法
源码:
public static void main(String[] args) {
//new 一个SystemServer对象,再调用该对象的run()方法
new SystemServer().run();
}
4.2.2[SystemServer.java] run
说明:先初始化一些系统变量,加载类库,创建Context对象,创建SystemServiceManager对象等候再启动服务,启动引导服务、核心服务和其他服务
源码:
private void run() {
try {
traceBeginAndSlog("InitBeforeStartServices");
// Record the process start information in sys props.
//从属性中读取system_server进程的一些信息
SystemProperties.set(SYSPROP_START_COUNT, String.valueOf(mStartCount));
SystemProperties.set(SYSPROP_START_ELAPSED, String.valueOf(mRuntimeStartElapsedTime));
SystemProperties.set(SYSPROP_START_UPTIME, String.valueOf(mRuntimeStartUptime));
EventLog.writeEvent(EventLogTags.SYSTEM_SERVER_START,
mStartCount, mRuntimeStartUptime, mRuntimeStartElapsedTime);
//如果一个设备的时钟是在1970年之前(0年之前),
//那么很多api 都会因为处理负数而崩溃,尤其是java.io.File#setLastModified
//我把把时间设置为1970
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