第二章

2.2 Zygote进程启动

  1. Zygote是什么?

DVM、ART、应用程序进程以及运行系统的关键服务的SystemServer进程都是有Zygote进程通过fork(复制进程)来创建的,我们称它为孵化器. 由于Zygote进程在启动时会创建DVM或者ART,因此通过fork而创建的应用程序进程和SystemServer进程可以在内部获取一个DVM或ART的实例副本。

  1. Zygote进程启动总结

(1) 创建AppRuntime并调用其start方法,启动Zygote进程

(2) 创建Java虚拟机并为Java虚拟机注册JNI方法

(3) 通过JNI调用ZygoteInit的main函数(Java代码)进入Zygote的(从Native层到)Java框架层

(5) 通过registerZygoteSocket方法创建服务端Socket(name 为zygote),并通过runSelectLoop方法循环无限等待AMS的请求来创建新的应用程序进程。

(4) 通过Zygote.forkSystemServer()创建并启动SystemServer进程

2.3SystemServer处理过程

SystemServer进程作用:创建系统服务,AMS,WMS,PMS都是它创建的。

SystemServer进程复制了Zygote进程的地址空间,因此也会得到Zygote进程创建的Socket,这个对SystemServer进程没用,它需要关掉。

SystemServiceManager它会对系统服务进行创建、启动和生命周期管理。它自己是在SystemServer.java中的run方法中创建的,而run方法是由SystemServer.java的main方法调用的。

可以将SystemServer.main()方法看成是SystemServer进程的入口。

引导服务 作用
Installer 系统安装 APK 刑的一个服务类,启动完成 Installer 服务之后才能启动其 他的系统服务
ActivityManagerService 负责四大组件的启动、切换、调度
PowerManagerService 计算系统中和 Power 相关的计算,然后决策系统应该如何反应
PackageManagerService 用来对 APK 进行安装、解析、删除、卸载等操作
核心服务
Battery Service 管理电池相关的服务
UsageStatsService 收集用户使用每一个 App 的频率、使用时长
其他服务
CameraService
AlarmManagerService
InputManagerService
WindowManagerService

系统服务启动逻辑举例

mPowerManagerService = mSystemServiceManager . startService(PowerManagerService

. class) ;

image-20200804125326531
  1. 注册 将service存储到mServices中,mServices是一个存储SysterService的ArrayList.

  2. 启动service , 通过调用service&onStart()方法

启动系统服务的第二种方法:直接调用PackageManagerService.main()方法

  • 直接创建PackageManagerService
  • 将上面创建的注册到ServiceManager中

ServiceManger 用来管理系统中的各种Service,用于系统C/S架构中的Binder通信机制:

​ Client 端要使用某个 Service ,则需要先到 ServiceManager 查询 Service 的相关信息,然后根据 Service 的相关信息与 Service 所在的 Server 进程建立通信通 路,这样 Client 端就可以使用 Service 了。

SystemServer进程总结:

主要工作如下

  1. 启动 Binder 线程池,这样就可以与其他进程进行通信 。
  2. 创建 SystemServiceManager ,其用于对系统的服务进行创建、启动和生命周期管理。
  3. 启动各种系统服务。

2.4 Launcher(Android 系统的桌面)启动过程

2.4.1概述

系统启动的最后一步是启动一个应用程序用来显示系统中已经安装的应用程序,这个 应用程序就叫作 Launcher Launcher 在启动过程中会请求 PackageManagerService 返回系统 中已经安装的应用程序的信息,并将这些信息封装成一个快捷图标列表显示在系统屏幕上。

2.4.2启动过程


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!