概述
在Android系统中,所有的应用程序进程以及系统服务进程SystemServer都是由Zygote进程孕育(fork)出来的,这也许就是为什么要把它称为Zygote(受精卵)的原因吧。由于Zygote进程在Android系统中有着如此重要的地位,本文将详细分析它的启动过程
总体时序
先概述一下总体运行流程,当按电源键,首先是加载系统引导程序BootLoader,然后启动linux内核,再启动init进程,最后Zygote进程启动完成。理论上Android系统中的所有应用程序理论上都是由Zygote启动的。Zygote前期启动启动服务,后期主要fork程序。
init启动流程
- 用户空间的第一个进程,进程号为1(在《深入理解安卓内核思想》的257页里面写的是0,在这记录一下)
- 职责
- 创建Zygote
- 初始化属性服务
- init文件位于源码目录system/core/init中
init进程的启动三个阶段
- 启动电源以及系统的启动,加载引导程序BootLoader。
- 启动Linux内核
- 启动init进程。
- 启动Zygote进程
- 初始化启动属性服务。
Zygote进程
- 所有App的父进程,ZygoteInit.main
- Zygote进程,是由init进程通过解析init.rc文件后fork生成的,Zygote进程主要包括
- 加载Zygoteinit类,注册Zygote Socket服务端套接字
- 加载虚拟机
- 提前加载类PreloadClasses
- 提前加载资源PreLoadResouces
- system_server进程,是由Zygote fork而来,System Server是Zygote孵化出的第一个进程,System Server 负责启动和管理整个Java FrameWork,包含ActivityManagerService, WorkManagerService,PagerManagerService,PowerManagerService等服务
system_server进程
系统各大服务的载体, SystemServer.main system_server进程从源码角度来看可以分为,引导服务,核心服务和其他服务
- 引导服务(7个):ActivityManagerService、PowerManagerService、LightsService、DisplayManagerService、PackageManagerService、UserManagerService、SensorService;
- 核心服务(3个):BatteryService、UsageStatsService、WebViewUpdateService;
- 其他服务(70个+):AlarmManagerService、VibratorService等。
ServiceManger进程
bInder服务的大管家
ServiceManager 是Binder IPC通信过程中的守护进程,本身也是一个Binder,但是并没有采用多线程模型来跟Binder通信,而是自行编写了binder.c直接和Binder驱动来通信,并且只有一个binder_loop来读取和处理事务,这样做的好处是简单和高效 ServiceManager本身工作相对简单,其工能查询和注册服务
流程图
ServiceManager 集中管理系统内的所有服务,通能过权限控制进程是否有权注册服务,通过字符串来查找是否有对应的Service,由于ServiceManager进程注册了Service的死亡通知,那么服务所在的进程死亡后,只需告诉ServiceManager,每个Client通过查询ServiceManager可以获取Service的情况
启动主要包括以下几个阶段
- 打开Binder驱动,并调用mmap()方法分配128k的内存映射空间,binder_open
- 注册成为Binder服务的大管家binder_become_context_manager
- 验证selinux权限,判断进程是否有权注册查看指定服务
- 进入无限循环,处理Client发来的请求 binder_loop
- 根据服务的名称注册服务,重复注册会移除之前的注册信息
- 死亡通知,当所在进程死亡后,调用binder_release方法,然后调用binder_node_release,这个过程发出死亡通知回调
App进程
- 通过Process.start启动的App进程ActivityThread.main
- Zygote 孵化出的第一个App进程是Launcher,这是用户看到的桌面App
- Zygote 还会创建出Browser,Phone,Email等App进程,每个App至少运行在一个进程上
- 所有的App进程都是由Zygote fork而成
3)Zygote进程的启动
Zygote进程, 一个在Android系统中扮演重要角色的进程. 我们知道Android系统中的两个重要服务PackageManagerService和ActivityManagerService, 都是由SystemServer进程启动的, 而这个SystemServer进程本身是Zygote进程在启动的过程中fork出来的. 这样一来, 想必我们就知道Zygote进程在Android系统中的重要地位了.
从图中可得知Android系统中各个进程的先后顺序为:
init进程 –-> Zygote进程 –> SystemServer进程 –>应用进程
链接
- 在init启动Zygote时主要是调用app_main.cpp的main函数中的AppRuntime.start()方法来启动Zygote进程的;
- 接着到AndroidRuntime的start函数:使用JNI调用ZygoteInit的main函数,之所以这里要使用JNI,是因为ZygoteInit是java代码。最终,Zygote就从Native层进入了Java FrameWork层。在此之前,并没有任何代码进入Java FrameWork层面,因此可以认为