一、SystemServer 进程简介
1. SystemServer 进 程 主 要 的 作 用 是 启 动 各 种 系 统 服 务 , 比 如ActivityManagerService,PackageManagerService,WindowManagerService 等各种服务。当我们的应用需要使用各种系统服务的时候也是通过与 SystemServer进程通讯获取各种服务对象的句柄的。
2.SystemServer进程由Zygote进程通过调用forkSystemServer方法(底层调用fork方法)创建出来。
二、SystemServer进程main()创建的Looper对象的消息循环的 run 方法的执行流程
1. 首先判断系统当前时间,若当前时间小于 1970年1月1日,则设置系统当前时间为该时间点。
2. 然后是设置系统的语言环境。
3. 接着设置虚拟机运行内存,加载运行库,设置SystemServer的异步消息。
4. run 方法中 createSystemContext() 的调用
1) 调用 createSystemContext()方法来创建系统级别的上下文,涉及到加载系统资源、主题等。
2) 在 SystemServer 进程中也存在着 Context对象,并且是通过ActivityThread.systemMain 方法创建的。
5. mSystemServiceManager 的创建
1) 在 run 方 法 中 , 通 过 SystemServiceManager 的 构 造方 法 创 建 了 一 个 新 的SystemServiceManager 对象。我们知道SystemServer 进程主要是用来构建系统各种service 服务的,而 SystemServiceManager 负责管理这些系统服务的生命周期,包括启动、停止和绑定服务。
2) 将 SystemServiceManager 对象保存到SystemServer进程中的一个数据结构中。
三、 启动服务
1. 简介
在开始执行启动服务之前会先尝试通过 socket 方式连接 Zygote进程,在成功连接之后才会开始启动其他服务。
2. Installer 的 onStart 方法
执行 mInstaller 的 waitForConnection方法。Installer 类是系统安装 apk 时的一个服务类,继承 自SystemService(系统服务的一个抽象接口),需要在启动完Installer 服务之后才能启动其他的系统服务。
3. waitForConnection()方法
不断的通过 ping 命令连接 Zygote 进程(SystemServer 和 Zygote 进程通过 socket方式通信,其他进程之间通过 Binder方式通信)。
源码如下:
public void waitForConnection() {
for (;;) {
if (execute("ping") >= 0) {
return;
}
Slog.w(TAG, "installd not ready");
SystemClock.sleep(1000);
}
}
四、总结
1. SystemServer 进程是 android 中一个很重要的进程,并由 Zygote 进程启动。
2. SystemServer 进程主要用于启动系统中的服务。
3. SystemServer 进程启动服务的入口点为 main 方法。
4. SystemServer在执行过程中会初始化一些系统变量,加载类库,创建 Context 对象,创建 SystemServiceManager对象等之后才开始启动系统服务。
5. SystemServer 进程将系统服务分为三类:引导服务(Bootstrap Services),核心服务(Core Services)和 其他服务(Other Services),并逐步启动。
6. SystemServer 进程在启动服务之前会首先尝试与 Zygote进程 建立 socket 通讯,只有通讯成功之后才会开始启动服务。
7. 创建系统服务的过程中主要通过 SystemServiceManager 对象来管理,通过调用服务对象的构造方法和onStart方法来初始化服务的相关变量。
8. 服务对象都有自己的异步消息对象,并运行在单独的线程中。
9. SystemServer进程需要与其他进程进行通信,因此会初始化Binder线程池,以便可以通过Binder机制与其他进程进行跨进程通信。
10. 在启动完所有必要的系统服务后,SystemServer进程会通过调用Looper.loop()方法进入消息循环,并等待并处理其他进程的请求或系统内部的事件。
11. 在SystemServer进程创建之后,会关闭Zygote进程在子进程中不需要的文件描述符。
微风不燥,阳光正好,你就像风一样经过这里,愿你停留的片刻温暖舒心。
我是程序员小迷(致力于C、C++、Java、Kotlin、Android、iOS、Shell、JavaScript、TypeScript、Python等编程技术的技巧经验分享),若作品对您有帮助,请关注、分享、点赞、收藏、在看、喜欢,您的支持是我们为您提供帮助的最大动力。
欢迎关注。助您在编程路上越走越好!