Android 的一些基本的服务与 Zygote 的启动

init 脚本中配置的一些服务


android底层源码java android底层开发技术实战详解_Android



服务,它主要做的是网络管理,第二个是比较重要的 servicemanager ,他就是通过一定的机制使我们的 client 与 service 服务进行通讯,第三个是我们的 surfaceflinge ,也就是我们显示的管理,首先要初始化显示界面,然后初始化 surface ,我们所有的显示,每个应用的叠加,都是通过 surfaceflinge 来实现的,我们 surfaceflinge 底下会挂着我们显示的驱动,第四个是我们的一个核心服务,也就是 zygote 服务,他是我们第一个 java 程序,他负责创建我们的 system service, 把整个系统的服务给启动起来,并且负责创建我们的应用,第五个是我们的 media 服务,包括我们的音频、 camera 、以及我们的媒体播放器,为我们整个系统提供多媒体的服务,第六个是我们的 installd 的服务,它主要是管理应用的安装,最后一个是我们的 bootanim ,它主要是我们的一个开机动画,这就是我们 init 进程中的一些基本的服务。


java 虚拟机的创建,和我们第一个 java 程序的引导过程



android底层源码java android底层开发技术实战详解_java_02



脚本中有这样一个语句,也就是我们的 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 虚拟机的一些基本配置



android底层源码java android底层开发技术实战详解_android底层源码java_03



虚拟机机制是我们 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 的一个启动流程



android底层源码java android底层开发技术实战详解_应用程序_04


的方法去创建一个虚拟机和我们 JNI 的环境变量,在这个环境变量中会设置一些相关的函数,这些函数用于去寻找我们 java 中的方法,调用我们 java 中的方法。第二个就是开始注册我们 Android 的一些 JNI 的函数,最后根据我们 start 方法中传进来的一些参数,去启动我们相关的 java 服务,我们的服务就是我们的 zygote ,这个就是 dalvik 虚拟机的创建以及我们 zygote 服务启动的一个过程