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源文件而得
参考文章: