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,保证了安全性



相关文章
|
7月前
|
开发工具 Android开发 git
Windows下载android2.2完整源码(转)
Windows下载android2.2完整源码(转)
91 3
|
4月前
|
Ubuntu 开发工具 Android开发
Repo下载AOSP源码:基于ubuntu22.04 环境配置,android-12.0.0_r32
本文介绍了在基于Ubuntu 22.04的环境下配置Python 3.9、安装repo工具、下载和同步AOSP源码包以及处理repo同步错误的详细步骤。
246 0
Repo下载AOSP源码:基于ubuntu22.04 环境配置,android-12.0.0_r32
|
7月前
|
Java 开发工具 Android开发
如何在Eclipse中查看Android源码或者第三方组件包源码(转)
如何在Eclipse中查看Android源码或者第三方组件包源码(转)
55 4
|
7月前
|
Java Android开发
Android12 双击power键启动相机源码解析
Android12 双击power键启动相机源码解析
196 0
|
4月前
|
开发工具 git 索引
repo sync 更新源码 android-12.0.0_r34, fatal: 不能重置索引文件至版本 ‘v2.27^0‘。
本文描述了在更新AOSP 12源码时遇到的repo同步错误,并提供了通过手动git pull更新repo工具来解决这一问题的方法。
143 1
|
4月前
|
Android开发 Docker 容器
docker中编译android aosp源码,出现Build sandboxing disabled due to nsjail error
在使用Docker编译Android AOSP源码时,如果遇到"Build sandboxing disabled due to nsjail error"的错误,可以通过在docker run命令中添加`--privileged`参数来解决权限不足的问题。
760 1
|
4月前
|
开发工具 uml git
AOSP源码下载方法,解决repo sync错误:android-13.0.0_r82
本文分享了下载AOSP源码的方法,包括如何使用repo工具和处理常见的repo sync错误,以及配置Python环境以确保顺利同步特定版本的AOSP代码。
498 0
AOSP源码下载方法,解决repo sync错误:android-13.0.0_r82
|
4月前
|
Java Android开发 芯片
使用Android Studio导入Android源码:基于全志H713 AOSP,方便解决编译、编码问题
本文介绍了如何将基于全志H713芯片的AOSP Android源码导入Android Studio以解决编译和编码问题,通过操作步骤的详细说明,展示了在Android Studio中利用代码提示和补全功能快速定位并修复编译错误的方法。
155 0
使用Android Studio导入Android源码:基于全志H713 AOSP,方便解决编译、编码问题
|
4月前
|
Android开发
我的Android 进阶修炼(1): AOSP源码根目录结构
本文介绍了AOSP源码的根目录结构,提供了基于MTK9269 Android 9.0源码的目录说明,帮助读者了解AOSP源码的组织方式和各目录的功能。
196 0
我的Android 进阶修炼(1): AOSP源码根目录结构
|
4月前
|
API 开发工具 Android开发
Android源码下载
Android源码下载
509 0