android源码宇宙——SystemServer源码

简介: android源码宇宙——SystemServer源码

SystemServer


老生常谈了,也不是啥重点,不过懂的话还是很有用的。这东西用来创建和管理系统服务,同时也可以管理我们的应用进程

关于他们的源码分析,并不能只看他自己,需要从zygote开始查看,然后还要辅助app进程的启动来理解


源码


从Zygote到SystemServer的准备过程源码

  1. 从ZygoteInit.main开始看起

main方法主要做的事情是:

  • 初始化zygote进程
  • 创建socket连接,等待应用进程创建和SystemServer进程创建
  • 创建SystemServer进程

image.png

image.png

image.png

image.png

  1. forkSystemServer做了什么

这个方法主要做的事情是,孵化SystemServer进程,并且在孵化成功后关闭SystemServer和Zygote之间的socket连接。

image.png

image.png

  1. zygoteServer.runSelectLoop是如何等待socket连接的

这部分代码我理解的很浅薄,只能把关键的部分结合其它博主的文章标记一下

image.png

image.png

  1. 3中的handleSystemServerProcess方法是如何工作的

image.png

image.png

  1. RuntimeInit.applicationInit方法后的逻辑调用

RuntimeInit.applicationInit-> RuntimeInit._findStaticMain,所以我们查看一下_RuntimeInit.findStaticMain方法

需要说明的是这个findStaticMain方法返回的MethodAndArgCall最终会返回到ZygoteInit.main方法中,然后再mian方法中调用caller.run,这样我们的SystemServer货值ActivityThread的main函数就调用起来了

image.png

简单展览一下MethodAndArgsCall:

image.png

上一步我们已经知道了SystemServer.main方法是如何被调用的了,那么下一节就看看SystemServer.main方法吧


SystemServer源码

  1. 首先单纯的new了一个SystemServer然后调用run方法

image.png

  1. run方法

image.png

image.png

image.png

image.png

  1. 查看如何启动SystemServer中的系统服务类

我们通过startCoreServices来看看我们是如何启动系统服务的

image.png

  1. SystemServiceManager.startService

image.png

  1. SystemServiceManager.startService(SystemService)

image.png

  1. 结束

我们发现查看SystemServer源码,大头竟然是zygote源码,好尴尬。 补充:还有startServiceFromJar也是一种启动系统服务的方法

image.png


关于init进程、Zygote进程、SystemServer进程、App进程


  1. init进程是linux的所有进程的父进程,通过解析init.rc可以解析出zygote进程。手机开机后linux在加载完内核后,会启动init进程
  2. Zygote是所有java进程的父进程,app进程都是通过zygote孵化出来的
  3. SystemServer是zygote孵化的第一个进程,他用来管理系统服务
  4. 为什么使用zygote fork进程,因为zygote会把已经运行的虚拟机的代码和内存信息共享,起到一个预加载资源和类的作用,从而缩短启动时间


总结


SystemServer的启动一般需要从Zygote的启动说起来。Zygote的初始化是在ZygoteInit类的main方法中开始的。在main方法中Zygote初始化自己的相关配置,然后会创建一个ZygoteServer,ZygoteServer中会创建一个死循环,死循环内部会维护socket连接,这个连接是用来等待SystemServer和应用的创建请求的。在我们创建SystemServer的过程中会进行Zygote的底层环境的创建,同时会根据我们SystemServer的类名反射获取SystemServer的实例,并且反射获取SystemServer.mian方法的Method。然后会将这个Method包装成一个MethodAndArgsCall,这个MethodAndArgsCall是一个实现了Runnable接口的类,我们会把MethodAndArgsCall的对象实例返回给ZygoteInit.mian中的forkSystemServer方法调用,然后调用MethodAndArgsCall.run方法。run方法中会反射执行SystemServer.main方法,这样流程就走到了SystemServer的启动流程之中。

现在开始说SystemServer的启动。SystemServer的启动是从SystemServer.main方法开始的,方法内部也会维护一个Loop事件循环队列,当然了最重要的工作是启动系统服务。SystemServer内部会创建一个SystemServerManager,SystemServerManager会根据系统服务的类名或者Class启动系统服务。并且将server实例添加到系统服务列表中(可以通过这个列表中的系统服务引用调用系统服务),然后会调用系统服务SystemServer.onStart方法启动系统服务。


其它


为什么zygote和SystemServer通信用Socket

blog.csdn.net/anhenzhufen…

  1. zygote比SystemServer先启动,而Binder是SystemServer来管理的,所以他没有Binder可以用来注册
  2. 有人可能说可以等SystemServer创建完成后再让zygote来创建Binder连接,但是我说这样就没必要了,创建连接不还是要使用一种方式实现两个进程间通信才能创建Binder吗,对吧。多次一举
  3. 这个socket所有者是root,保证了安全性



相关文章
|
3天前
|
JSON 编译器 开发工具
VS Code阅读Android源码
VS Code阅读Android源码
9 1
|
23天前
|
XML Java Android开发
Android实现自定义进度条(源码+解析)
Android实现自定义进度条(源码+解析)
51 1
|
23天前
|
Java Android开发
Android反编译查看源码
Android反编译查看源码
25 0
|
3月前
|
数据采集 小程序 数据可视化
智慧校园电子班牌管理系统源码 Java Android原生
家长通过家长小程序端随时了解孩子在校的情况,实时接收学生的出勤情况,学生到校、离校时间。随时了解学生在校的表现、学生成绩排名,及时与教师沟通,关注孩子的健康成长。
30 0
智慧校园电子班牌管理系统源码 Java Android原生
|
3月前
|
算法 Java 定位技术
分享104个益智休闲安卓游戏源码,总有一款适合你
分享104个益智休闲安卓游戏源码,总有一款适合你
157 1
|
2天前
|
Linux 开发工具 Android开发
Docker系列(1)安装Linux系统编译Android源码
Docker系列(1)安装Linux系统编译Android源码
6 0
|
1月前
|
定位技术 API 数据库
基于Android的在线移动电子导航系统的研究与实现(论文+源码)_kaic
基于Android的在线移动电子导航系统的研究与实现(论文+源码)_kaic
|
1月前
|
搜索推荐 测试技术 定位技术
基于Android的自助导游系统的设计与实现(论文+源码)_kaic
基于Android的自助导游系统的设计与实现(论文+源码)_kaic
|
1月前
|
Java 关系型数据库 应用服务中间件
基于Android的人事管理系统设计与实现(论文+源码)_kaic
基于Android的人事管理系统设计与实现(论文+源码)_kaic
|
1月前
|
设计模式 测试技术 数据库
基于Android的食堂点餐APP的设计与实现(论文+源码)_kaic
基于Android的食堂点餐APP的设计与实现(论文+源码)_kaic