Dalvik和ART简介

1、classes.dex文件初识

我们先把QQ_236.apk后缀改为QQ_236.zip,然后解压,发现有一个classes.dex文件,这个classes.dex是java源码编译后生成的java字节码文件.但由于Android使用的dalvik虚拟机与标准的java虚拟机是不兼容的,dex文件与class文件相比,不论是文件结构还是opcode(机器语言操作码)都不一样.

2、Android Dalvik虚拟机跟一般的Java虚拟机的对比介绍

tips:

①Android使用的Dalvik虚拟机加载.dex文件并翻译执行,一般的虚拟机加载.class文件进行翻译执行;

②一般的反编译步骤是:首先利用dex2jar工具将classes.dex文件转制成.jar文件,然后利用jd-gui将.jar反编译成java源码;

③ Android系统在安装应用时对.dex进行修改和优化,结果保存在 /data/dalvik-cache目录,这样加载应用时无需每次都进行优化;

④JIT(just in time)是运行时环境的一部分,它把解释型语言的可执行文件程序集转换成native机器码执行;

⑤ART仍把.dex文件作为标准输入文件,但是ART会把dex文件再编译成native字节码,仍把编译后的结果保存在 /data/dalvik-cache目录;

3、Dalvik

Dalvik是一个开源软件,最开始由名叫Dan Bornstein的人进行编写的。Android 4.4之前的版本一直使用Dalvik虚拟机。应用程序一般使用java进行编写,并编译成java虚拟机字节码,然后被转制成Dalvik字节码并保存在.dex(Dalvik执行字节码)文件和.odex(优化后的Dalvik执行字节码)文件中。

Dalvik虚拟机跟java虚拟机不同。java虚拟机是基于栈的(stack machines),而Dalvik使用基于寄存器的架构(register-based
architecture)(需要更少的复杂的虚拟机指令集)。dx工具将java生成的.class文件转换成.dex格式,多个class文件保存在一个.dex文件中。被多个class文件使用的strings和常量在.dex文件中只会包含一份存根以节省空间。

当应用安装时Dalvik可执行文件.dex可能会被再一次修改。为了进一步优化,字节码可能被交换顺序,简单的数据结构和功能lib库可能在内部进行链接(linked inline)。

为了优化内存占用,Dalvik虚拟机跟其他java虚拟机相比做了以下处理:①对虚拟机做了精简以节省空间;②常量池已被修改为仅使用32位索引,以简化解释;③标准的Java字节码执行8位栈指令集,局部变量必须拷贝或通过指令从栈中指定,而Dalvik使用自己的16位指令集直接操作局部变量,局部变量一般从4字节的虚拟寄存器中取出。这些使得更少的Dalvik指令数目并提升了翻译执行速率。

4、ART(Android Runtime)

Android L上默认用ART替代了Dalvik。在Android 2.2时为Dalvik引入了JIT编译器,通过在应用运行时不断地剖析应用字节码和动态地把那些频繁执行的短的段落字节码编译成native机器码,那些未翻译成native的字节码便靠Dalvik虚拟机翻译执行。跟Dalvik不同的是,ART引入提前编译(AOT),也就是在应用安装时便把整个应用编译成native机器码。去掉了Dalvik的翻译执行和JIT,ART提升了整个执行效率并减少了电量消耗。

ART带来的更快的应用执行效率,优化了内存分配和垃圾回收机制,加入了新的应用调试feature(applications debugging features)和更精确的高等级的应用剖析(more
accurate high-level profiling of applications)。

为了向后进行兼容,ART仍把.dex文件作为apk文件的一部分,但是.odex文件被ELF( Executable
and Linkable Format )文件替代了。一旦应用程序被ART设备上的dex2oat工具编译后,运行时便是基于前面编译好的ELF可执行文件。

ART让人不爽的地方有两个,一个是ART在应用安装时需要额外的时间进行编译,另一个便是需要消耗大量的Flash存储空间来保存编译出来的字节码。

参考文章:

http://stackoverflow.com/questions/7541281/what-is-dalvik-and-dalvik-cache

https://en.wikipedia.org/wiki/Android_Runtime

https://en.wikipedia.org/wiki/Dalvik_(software)

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-11 22:25:35

Dalvik和ART简介的相关文章

Dalvik 与 ART

Dalvik 本词条缺少信息栏,补充相关内容使词条更完整,还能快速升级,赶紧来编辑吧! Dalvik是Google公司自己设计用于Android平台的Java虚拟机.Dalvik虚拟机是Google等厂商合作开发的Android移动设备平台的核心组成部分之一.它可以支持已转换为 .dex(即Dalvik Executable)格式的Java应用程序的运行,.dex格式是专为Dalvik设计的一种压缩格式,适合内存和处理器速度有限的系统.Dalvik 经过优化,允许在有限的内存中同时运行多个虚拟机

Dalvik和ART的区别

什么是Dalvik:    Dalvik是Google公司自己设计用于Android平台的Java虚拟机.Dalvik虚拟机是Google等厂商合作开发的Android移动设备平台的核心组成部分之一.它可以支持已转换为 .dex(即Dalvik Executable)格式的Java应用程序的运行,.dex格式是专为Dalvik设计的一种压缩格式,适合内存和处理器速度有限的系统.Dalvik 经过优化,允许在有限的内存中同时运行多个虚拟机的实例,并且每一个Dalvik 应用作为一个独立的Linux

安卓执行机制JNI、Dalvik、ART之间的比較 。android L 改动执行机制。

Android L默认採用ART执行环境.全然兼容64位移动处理器.Google称这将比此前的Dalvik模式性能提高两倍,可是会占用很多其它的内存空间.Android有三种执行模式:JNI.Dalvik.ART.Dalvik明显是最慢的,全然的JNI模式是最快的可是开发难度高,ART介于两者之间.而且不影响现有开发模式,所以Google选了ART.我们的技术project师对此做了技术解读: 1)JNI:在开发过程中使用编译器在C/C++等语言直接编译成机器码.执行的时候可以充分利用系统性能,

安卓运行机制JNI、Dalvik、ART之间的比较 。android L 修改运行机制。

Android L默认采用ART运行环境,完全兼容64位移动处理器.Google称这将比此前的Dalvik模式性能提高两倍,但是会占用更多的内存空间.Android有三种运行模式:JNI.Dalvik.ART.Dalvik明显是最慢的,完全的JNI模式是最快的但是开发难度高,ART介于两者之间,并且不影响现有开发模式,所以Google选了ART.我们的技术工程师对此做了技术解读: 1)JNI:在开发过程中使用编译器在C/C++等语言直接编译成机器码,运行的时候能够充分利用系统性能,这是最快的.i

安卓dalvik和art区别

Dalvik模式像是一台折叠自行车,每次骑之前都要组装后才能上路.而ART模式就是一个已经装好的自行车,直接就能上车走人.所以ART模式在效率上肯定是要好于Dalvik. 通过以上这种表格,我们可以直白的看出,全新的ART模式具备用RAM内存小.流畅度更好以及更省电的特性. 1:ART模式是Android runtime的简称.在ART虚拟机环境下,Android对程序只进行一次编译,就是在程序安装时.在安装应用时,ART虚拟机就先将程序的Java语言转化为适合Android系统运行的机器语言,

Android_对android虚拟机的理解,包括内存管理机制垃圾回收机制。dalvik和art区别

虚拟机很小,空间很小,谈谈移动设备的虚拟机的大小限制 16M ,谈谈加载图片的时候怎么处理大图片的,outmemoryExceptionBitmapFactory.option 垃圾回收,没有引用的对象,在某个时刻会被系统gc掉 . Dalvik和标准Java虚拟机(JVM)首要差别Dalvik 基于寄存器,而 JVM 基于栈.基于寄存器的虚拟机对于编译后变大的程序来说,在它们执行的时候,花费的时间更短.Dalvik和Java运行环境的区别1:Dalvik主要是完成对象生命周期管理,堆栈管理,线

Dalvik和ART

Dalvik虚拟机的运行效率远低于ART,这就是为什么从5.0开始android开始使用ART. 什么是Dalvik: Dalvik是Google公司自己设计用于Android平台的Java虚拟机.Dalvik虚拟机是Google等厂商合作开发的Android移动设备平台的核心组成部分之一.它可以支持已转换为 .dex(即Dalvik Executable)格式的Java应用程序的运行,.dex格式是专为Dalvik设计的一种压缩格式,适合内存和处理器速度有限的系统.Dalvik 经过优化,允许

阿里巴巴 说说 Android 虚拟机Dalvik与ART区别在哪里?

本专栏专注分享大型Bat面试知识,后续会持续更新,喜欢的话麻烦点击一个关注 废话不多说先上面试目录 Android开发中我们接触的是与Java虚拟机类似的Dalvik虚拟机和ART虚拟机,下面梳理一下三者区别和原理: 一,Dalvik虚拟机 Dalvik虚拟机( Dalvik Virtual Machine ),简称Dalvik VM或者DVM.Dalvik 发音有道词典并没有收录.说说来历,它是由Dan Bornstein编写的,名字源于他的祖先居住过的名为Dalvik的小渔村.DVM是Goo

Dalvik和JVM,Art的几点区别

Dalvik和JVM的几点区别      1.Dalvik 基于寄存器,而 JVM 基于栈.基于寄存器的虚拟机对于更大的程序来说,在它们编译的时候,花费的时间更短.      2.Dalvik主要是完成对象生命周期管理,堆栈管理,线程管理,安全和异常管理,以及垃圾回收等等重要功能.      3.Dalvik负责进程隔离和线程管理,每一个Android应用在底层都会对应一个独立的Dalvik虚拟机实例,其代码在虚拟机的解释下得以执行.      4.不同于Java虚拟机运行java字节码,Dal