SystemServer进程的启动流程

程序员小迷 2024-08-03 11:37:09

一、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等编程技术的技巧经验分享),若作品对您有帮助,请关注、分享、点赞、收藏、在看、喜欢,您的支持是我们为您提供帮助的最大动力。

欢迎关注。助您在编程路上越走越好!

0 阅读:0

程序员小迷

简介:致力于Android、iOS、C、Java等编程技术的技巧经验分享