1-Android的启动流程
Android 的启动流程
Android-Notes/blogs/Android/Framework/Android 系统启动.md at master · Omooo/Android-Notes
当启动电源系统启动后加载 Linux 内核后,加载各种驱动,当有了驱动以后,开始启动 Android 系统同时会加载用户级别的第一个进程 init(system\core\init. c),加载 init. rc 文件,会启动一个 Zygote 进程,此进程是 Android 系统的一个母进程,用来启动 Android 的其他服务进程,然后接着在里面启动了 System Server 进程,负责启动和管理整个 Java framework,包含 ActivityManager,WindowManager,PackageManager,PowerManager 等服务,被 SystemServer 进程启动的 ActivityManagerService 会启动 Launcher,Launcher 启动后会将已安装应用的快捷图标显示到界面上。
- System Server 进程,是由 Zygote 进程 fork 而来(fork 一般都用 socket),System Server 是 Zygote 孵化的第一个进程,System Server 负责启动和管理整个 Java framework,包含 ActivityManager,WindowManager,PackageManager,PowerManager 等服务。
- Zygote 进程孵化出的第一个 App 进程是 Launcher,这是用户看到的桌面 App;
- Zygote 进程还会创建 Browser,Phone,Email 等 App 进程,每个 App 至少运行在一个进程上。
所有的 App 进程都是由 Zygote 进程 fork 生成的。
启动流程总结
- 启动电源以及系统启动
当电源按下时引导芯片代码开始从预定义的地方(固化在 ROM)开始执行。加载引导程序 Bootloader 到 RAM,然后执行。 - 引导程序 BootLoader
引导程序 BootLoader 是在 Android 操作系统开始运行前的一个小程序,它的主要作用是把系统 OS 拉起来并运行。 - Linux 内核启动
内核启动时,设置缓存、被保护存储器、计划列表、加载驱动。当内核完成系统设置,它首先在系统文件中寻找 init. rc 文件,并启动 init 进程。 - init 进程启动
初始化和启动属性服务,并且启动 Zygote 进程。
解析 init. zygote. rc 中的参数,创建 AppRuntime 并调用 AppRuntime.start()方法;
调用 AndroidRuntime 的 startVM ()方法创建虚拟机,再调用 startReg ()注册 JNI 函数;
通过 JNI 方式调用 ZygoteInit. main (),第一次进入 Java 世界
Zygote 进程启动
创建 JavaVM 并为 JavaVM 注册 JNI,创建服务端 Socket,启动 SystemServer 进程。
SystemServer 进程启动
启动 Binder 线程池和 SystemServiceManager,并且启动各种系统服务。
Launcher 启动
被 SystemServer 进程启动的 ActivityManagerService 会启动 Launcher,Launcher 启动后会将已安装应用的快捷图标显示到界面上。
路线
1.启动电源以及系统启动->2. 引导程序 BootLoader->3. Linux 内核启动->4. init 进程启动->5. Zygote 进程启动->6. SystemServer 进程启动->7. Launcher 启动
init 进程启动
init 是 Android 系统中用户控件的第一个进程,init 进程启动过程中主要分三个部分:
- 创建和挂载启动所需的文件目录
- 初始化和启动属性服务
- 解析 init. rc 配置文件并启动 Zygote 进程
源码如下 system/core/init/init. cpp
init. rc 是一个配置文件,里面是一些脚本,该脚本的意思是 service 通知 init 进程创建名 zygote 的进程(fork 出来的)并启动 SystemService
Zygote
Zygote 进程主要包括:
- 加载 ZygoteInit 类,注册 Zygote Socket 服务端套接字
- 加载虚拟机
- 提前加载类 preloadClasses
- 提前加载资源 preloadResources
frameworks/base/services/java/com/android/server/SystemServer. java:
1 |
|
总结:
Zygote 进程主要做了以下几件事:
- 创建 AppRuntime 并调用其 start 方法,启动 Zygote 进程
- 创建 Java 虚拟机并为 Java 虚拟机注册 JNI 方法
- 通过 JNI 调用 ZygoteInit 的 main 方法进入 Zygote 的 Java 框架层
- 通过 registerZygoteSocket 方法创建服务端 Socket,并通过 runSelectLoop 方法等待 AMS 的请求来创建新的应用程序进程
- 启动 SystemServer 进程
应用程序进程启动过程
启动过程可以分为两步:
- AMS 发送启动应用程序进程的请求
AMS 如果想要启动应用程序进程,就需要向 Zygote 进程发送创建应用程序进程的请求,AMS 会通过调用 startProcessLocked 方法向 Zygote 进程发送请求。 - Zygote 接受请求并创建应用程序进程
SystemServer 进程启动
SystemServer 进程主要用于创建系统服务,比如 AMS、WMS、PMS 等都是由它来创建的。
SystemServer 进程被创建后,主要做了以下工作:
- 启动 Binder 线程池,这样就可以与其他进程进行通信
- 启动 SystemServiceManager,其用于对系统的服务进程创建、启动和生命周期管理
- 启动各种系统服务
从上面 ZygoteInit 的 main 方法中我们可以看到调用了 startSystemServer 方法启动 SystemServic。
解析 SyetemServer 进程,我们看下 SystemService 的 main 函数
1 |
|
main 函数中只调用了 SystemServer 的 run 函数,如下所示。
1 |
|
ServiceManager
创建的 SystemServiceManager 会对系统的服务进行创建、启动和生命周期管理,启动的引导服务 startBootstrapServices 函数中用 SystemServiceManager 启动了 ActivityManagerService、PowerManagerService、PackageManagerService 等服务。
SystemServiceManager 用来管理系统中的各种 Service,用于系统 C/S 架构中的 Binder 机制通信:Client 端要使用某个 Service,则需要先到 ServiceManager 查询 Service 的相关信息,然后根据 Service 的相关信息与 Service 所在的 Server 进程建立通讯通路,这样 Client 端就可以使用 Service 了