``这一期我们来学习一下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服务启动的一个过程 ``
|