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)
版权声明:本文为博主原创文章,未经博主允许不得转载。