Dalvik ART 浅析

210 阅读4分钟

Dalvik简介

1、Google自己设计的用于Android平台的虚拟机;

2、支持已转化为dex格式的java应用程序运行;

dex是专为Dalvik设计的一种压缩格式

3、允许在有限的内存中同时运行多个虚拟机实例,并未每一个Dalvik应用作为一和独立的Linux进程运行;

4、5.0以后,Google直接删除Dalvik,取而代之的是ART

Dalvik与JVM区别

Dalvik虚拟机(DVM)也是实现了JVM规范的一个虚拟器,默认使用CMS垃圾回收器

1、Dalvik是基于寄存器,JVM基于栈,寄存器存取速度比栈快的多;基于寄存器的虚拟机对于编译后变大的程序来说,在它们执行的时候,花费的时间更短

2、Dalvik运行dex文件,JVM运行java字节码;

ART(Android Runtime)

ART(Android Runtime) 是在 Android 4.4 中引入的一个开发者选项,也是 Android 5.0 及更高版本的默认 Android 运行时。ART 和 Dalvik 都是运行 Dex 字节码的兼容运行时。

1、在Dalvik下,应用每次运行,字节码都需要通过即时编译器转化为机器码,这样会拖慢应用的运行效率;

2、在ART下,应用第一次安装时,字节码就会预先变异成机器码,使其真正成为本地应用。这个过程叫做预编译(AOT),这样,每次启动和执行的时候都会更快。

Dalvik与ART区别

最大的不同就是:Dalvik是即时编译,每次运行前都先编译;而ART采用预编译。

ART优缺点

优点:

1、系统性能显著提升;

2、应用启动更快,运行更快,体验更流畅;

3、更长的电池续航能力;

4、支持更低的硬件。

缺点:

1、机器码占用存储空间更大;

2、应用安装时间变长。

为什么apk采用dex文件而不是class?

先了解下class文件的特性: class文件的作用 class文件的作用是记录一个类文件的所有信息。 例如记住了当前类的引用this、父类super等等。class文件记录的信息往往比java文件多。

class文件结构:

1、一种8位字节的二进制流文件

2、各个数据按照顺序紧密的排列,无间隙

3、每个类或接口都单独占据一个class文件

class文件的弊端:

1、内存占用大,不适合于移动端

2、堆栈的加载模式导致加载速度慢

3、文件IO操作多,类查找慢,因为每个class文件中只存储了一个Java源文件信息

以上只是3个比较明显的弊端,还有一些小的缺陷,因此针对移动端开发的特点而言,字节码class文件并不是存储数据的最佳选择, 接下来将介绍dex文件 ,它的特性摒除了class文件存在的缺陷,并做了相关优化,是目前移动端存储数据的最优解。

Dex文件是Dalvik的可执行文件,Dalvik是针对嵌入式设备设计的java虚拟机,所以Dex文件和Class文件的结构上有很大区别。为了更好的利用嵌入式你设备的资源,Dalvik在java程序编译后,还需要用dx工具将编译产生的数个Class文件整合成一个Dex文件。这样其中的各个类就可以共享数据,减少冗余,使文件结构更加紧凑。android程序编译完之后生产.class文件,然后,dex工具会把 .class文件处理成 .dex文件,然后把资源文件和.dex文件等打包成.apk文件。并非只有Java源码可以生成class文件,而对于dex文件而言同是,除了Java外,C和C++皆可生成dex文件,因此它们也可编写Android应用程序。

class文件存在许多冗余信息,例如每个类的class文件中都有一个常量池,而dex会去除冗余,区域复用并整合,整个工程中的同类型数据存储在一个数据区域。简而言之,dex工具会去除冗余信息,并把所有的.class文件整合到.dex文件中。减少了I/O操作,减少了文件体积,加快加载速度。更适合内存宝贵的移动设备。

不过dex文件和class本质上是一样的,dex是在class文件基础上编译而得,class文件是编译Java源文件而得

参考文章:

blog.csdn.net/baidu_31093…

www.jianshu.com/p/a70546962…

blog.csdn.net/ITermeng/ar…

www.jianshu.com/p/6074c0415…

www.jianshu.com/p/047d5b00f…