这一期我们来学习一下
Android
的一些基本的服务与
Zygote
的启动
首先我们来看一下在
init
脚本中配置的一些服务
我们的服务包括netd
服务,它主要做的是网络管理,第二个是比较重要的
servicemanager
,他就是通过一定的机制使我们的
client
与
service
服务进行通讯,第三个是我们的
surfaceflinge
,也就是我们显示的管理,首先要初始化显示界面,然后初始化
surface
,我们所有的显示,每个应用的叠加,都是通过
surfaceflinge
来实现的,我们
surfaceflinge
底下会挂着我们显示的驱动,第四个是我们的一个核心服务,也就是
zygote
服务,他是我们第一个
java
程序,他负责创建我们的
system service,
把整个系统的服务给启动起来,并且负责创建我们的应用,第五个是我们的
media
服务,包括我们的音频、
camera
、以及我们的媒体播放器,为我们整个系统提供多媒体的服务,第六个是我们的
installd
的服务,它主要是管理应用的安装,最后一个是我们的
bootanim
,它主要是我们的一个开机动画,这就是我们
init
进程中的一些基本的服务。
下面我们来看一下我们
java
虚拟机的创建,和我们第一个
java
程序的引导过程
在我们init
脚本中有这样一个语句,也就是我们的
zygote
服务,他所执行的服务是我们
/system/bin/app_process
,然后传进来一个
-Xzygote
来启动我们的
zygote
服务,在这个
zygote
服务后边我们还加了
--start-system-server,
也就是启动我们系统的一些服务,这些服务都是基于
Java
的,那我们来看一下这个服务的调用过程,首先他会调用我们的
app_process
这个应用程序,这个应用程序是基于
AndroidRuntime
来实现的,在这个里边还会调用
AndroidRuntime.start()
的方法来创建
java
虚拟机,创建虚拟机并注册
Android
的核心函数,即
JNI
函数,注册完之后就调用
CallStaticVoidMethod
来启动
zygote
这个
java
类中的
main
方法,来启动这个
zygote
服务,在创建虚拟机的时候我们会根据
init
脚本中的配置参数来配置我们的虚拟机,并且创建一个虚拟机的实例,并且设置一些虚拟机相关的函数,并且通过一系列的操作函数来寻找到我们
java
类中的方法,来启动我们的
zygote
服务,这就是我们虚拟机的创建,和
zygote
启动的一个大概过程
下面我们来看一下
dalvik
虚拟机的一些基本配置
Dalvik
虚拟机机制是我们
Android
平台的一个基础,我们所有的
apk
都是跑在虚拟机之上的,我们的虚拟机是基于寄存器的,它运行的文件格式是
.dex
,他和我们普通机器上的虚拟机是不一样的,而且我们这个
dalvik
可以在
Linux
上运行多个
dalvik
实例,每一个实例都是一个独立的进程,比如我们每创建一个
Android
的应用,我们都可以理解为是一个单独的
dalvik
实例,这样的话我们有一个程序崩溃了,不会影响到其他的程序,他是我们
dalvik
程序的一个优点。我们再来看一下我们
dalvik
设置的一些主要参数,
dalvik.vm.startheapsize
是启动一个应用程序之后为其分配的初始堆栈的大小,一般会设为
2M
到
48M
,推荐是
8M
左右。我们再来看一下
dalvik.vm.heapsize
,他是虚拟机给我们应用分配的一个最大内存,如果我们内存设的比较大,那我们应用程序跑起来就比较顺畅,所以它的最大限值可以根据我们硬件平台的大小进行一个合理的限制。第三个是我们的
dalvik.vm.checkjni
,这个是当我们调用外部
JNI
链接库时,是否做一个安全检查,这个在我们
init
脚本中会有配置,默认是不做的。接下来我们再来看一下我们
dalvik
虚拟机的一个执行模式,基本上分为三种模式:第一种
int
:
portable
这种兼容性运行模式,这种模式兼容性最高,执行效率最低;第二种是我们的
int
:
fast
模式,它又被称为快速自优化模式,这种模式他的兼容性和执行效率都比较高,所以我们比较倾向于这种模式,他还允许程序使用自己定义代码和模块。第三种是
int
:
jit
模式,这种模式呢效率最高,兼容性最差
下面我们来看一下我们
Zygote
的一个启动流程
首先,我们会调用AndroidRuntime
的方法去创建一个虚拟机和我们
JNI
的环境变量,在这个环境变量中会设置一些相关的函数,这些函数用于去寻找我们
java
中的方法,调用我们
java
中的方法。第二个就是开始注册我们
Android
的一些
JNI
的函数,最后根据我们
start
方法中传进来的一些参数,去启动我们相关的
java
服务,我们的服务就是我们的
zygote
,这个就是
dalvik
虚拟机的创建以及我们
zygote
服务启动的一个过程