dv虚拟机,art虚拟机

2019-02-05  本文已影响0人  miky_zheng

虽然,dv虚拟机4.4以后已经过时,但安卓系统的架构和联系,大部分还是没有变动,通过本文的几个问题出发,探索虚拟机和进程之前的联系。

zygote进程和虚拟机的联系

答:所有运行的应用程序的虚拟机进程都是由zygote创建的。
zygote进程,fork应用进程,接着在进程中运行各自的虚拟机。

dv虚拟机包括哪些功能模块。

答:
1.进程管理:进程隔离,每一个Android应用在底层都对应独立的虚拟机,依赖zygote机制。
2.线程管理:Android应用的所有线程都对应一个Linux线程。
3.类加载器:解析dex文件并加载dv字节码
4.解释器:根据自身指令集解释字节码
5.内层管理:分配系统启动初始化和应用程序运行时需要的内存资源。
6.JIT(just-in-time):即时编译.在解释器解释字节码时动态的编译程序,以缓解解释器的低效工作。
7.JNI:本地方法调用。
8.反射机制实现模块。
9.调试支持模块。

zygote任务

zygote启动后主要负责:
1)启动系统服务 SystemServer进程。
2)创建子进程运行Android应用程序。

zygote机制是如何实现的

zygote进程是由init进程根据system/core/rootdir/init.rc文件中的配置项创建的,init进程是系统启动后运行在用户空间的首个进程。init进程启动完系统运行所需的各种Daemon线程,即守护线程,然后启动zygote进程。

zygote是一个虚拟机进程,也是虚拟机实例的孵化器。他在系统启动时产生,完成虚拟机的初始化,库的加载,预制类库和初始化等操作。
每当系统要求执行一个andorid应用程序,zygote就会fork出一个子进程。
zygote首先会fork出system_server进程(它是绝大多数系统服务的守护进程,监听socket等待请求命令),当系统需要一个新的虚拟机实例时,zygote会迅速复制自身,以最快的速度提供给系统。对于只读的系统库,所有虚拟机实例都和zygote共享一块内存区域,有效的节省开销。

zygote复制自身创建虚拟机进程的好处

zygote进程通过复制本身快速提供虚拟机实例来执行Android应用程序,能有效的减少系统负担,提高设备利用率。

1.应用程序每次运行都要重新初始化和启动虚拟机,这过程比价耗时。
zygote通过复制,共享已运行的虚拟机代码与内存信息,缩短应用运行所耗时间。
2.zygote启动时,先将应用程序要使用的Androidframework中的类和资源加载到内存中,并组织形成所用资源的链接信息。新运行的应用程序不需要重新形成资源的链接信息。

zygote创建进程的三种方式

1.fork 子进程
2.forSystemServer 系统进程会一直存在系统中,一旦子进程退出,父zygote进程也会退出。系统init 进程通过重启zygote 进程,进而重启系统进程。
3.forkAndSpecialize

dv虚拟机启动流程

1.启动init进程
2.创建并启动zygote进程
3.创建虚拟机,初始化虚拟机
4.装载运行时核心类并校验字节码 (apk解压dex文件并对dex解析,类加载)
5.加载main 方法,分配内存
6.执行程序字节码(本地方法调用,解释器,即时编译,反射机制等)

apk文件生成

1.将java文件编译成字节码(.class)文件,
2.dx工具将字节码转成dex文件(classes.dex)
3.aapt工具将dex、资源(Resource)AndroidMainfest.XML组合成一个应用程序包。

为什么第一次打开apk,会较慢?
答:为了提高性能,android系统会对dex文件进行优化。优化后的文件以odex
结尾,之后启动会直接使用优化后的文件。

附上Android系统结构图:


image

art虚拟机

art虚拟机启动流程和dv虚拟机类似。
art好比JIT 技术的升级版:(运行时动态加载),直接转成本地机器码。

1.启动:
都实现了Java虚拟机的接口,只不过加载库文件不一样。虚拟机接口如下:
a) JNI_GetDefaultJavaVMInitArgs -- 获取虚拟机的默认初始化参数
b)JNI_CreateJavaVM -- 在进程中创建虚拟机实例
c)JNI_GetCreatedJavaVMs -- 获取进程中创建的虚拟机实例

在Android系统中,Davik虚拟机实现在libdvm.so中,ART虚拟机实现在libart.so中。也就是说,libdvm.so和libart.so导出了JNI_GetDefaultJavaVMInitArgs、JNI_CreateJavaVM和JNI_GetCreatedJavaVMs这三个接口,供外界调用。

2.apk安装:
a)解析:
都是需要解析dex 字节码
b)加载:
一个需要加载dex字节码,需要解释器的帮忙。
一个直接加载本地机器码。
c)安装时优化。
一个翻译成odex文件, (优化的dex文件)
一个直接翻译成oat文件,(elf文件,包含机器指令)

都是fork新的进程,创建新的虚拟机,只是一个是dv,一个是art。

上一篇下一篇

猜你喜欢

热点阅读