class 文件与dex文件区别 (dvm与jvm区别)及Android DVM介绍

区别一:dvm执行的是.dex格式文件  jvm执行的是.class文件   android程序编译完之后生产.class文件,然后,dex工具会把.class文件处理成.dex文件,然后把资源文件和.dex文件等打包成.apk文件。apk就是android package的意思。 jvm执行的是.class文件。

区别二:dvm是基于寄存器的虚拟机  而jvm执行是基于虚拟栈的虚拟机。寄存器存取速度比栈快的多,dvm可以根据硬件实现最大的优化,比较适合移动设备。

区别三:.class文件存在很多的冗余信息,dex工具会去除冗余信息,并把所有的.class文件整合到.dex文件中。减少了I/O操作,提高了类的查找速度

Android 运行环境主要指的虚拟机技术——Dalvik。Android中的所有Java程序都是运行在Dalvik VM上的。Android上的每个程序都有自己的线程,DVM只执行.dex的Dalvik executable 文件。每个Android应用在底层都对应有一个独立的DVM实例并在其解释下执行。

虽然DVM也是用Java编程语言,Dalvik虚拟机和一般JAVA虚拟机(Java VM)并不兼容,他们两个的区别是JVM标准执行的是.class的字节码(bytecode ),而是DVM执行的是其专有的(.dex)执行文件。在编译过程中,Java把类编译成一个或多个.class byte code 文件,然后打包到jar中,JVM会从中jar文件中获得相应的.class文件和JRE字节码。
Android VM虽然也是是用Java语言进行编程, Java程序通过编译后,还需要通过SDK中的dex工具转化成.dex格式,DVM再从其中读取指令和数据。

每一个应用程序即一个进程(Linux的一个Process)。二者最大的区别在于Java VM是以基于栈的虚拟机(Stack-based),而Dalvik是基于寄存器的虚拟机(Register-based)。显然,后者最大的好处在于可以根据硬件实现更大的优化,这更适合移动设备的特点。

DVM非常适合在移动终端上使用,与PC相比,它不需要很快的CPU和大量的内存空间. Google的测算显示,64MB的内存已经能让系统正常运转了。其中24MB被用于底层系统的初始化和启动。另外20MB被用于启动高层服务。DVM有如下特征:

?使用专有的.dex格式。

?原因是java类文件在编译过后,会产生至少一个.class文件包含大量陈余信息,dex文件格式会把所有的.class文件内容整合到一个.dex文件中。即减少了整体文件的尺寸和IO操作,也提高了类的查找速度。

?增加了对新的操作码的支持

?文件结构尽量简洁,使用等长的指令,借以提高解析速度。

?尽量扩大只读结构的大小,借以提高跨进程的数据共享。

?dex的优化,dex文件的结构是紧凑的,但是如果想提高运行时的性能,就需要对dex文件进行进一步的优化,这些优化针对以下几个方面:

?验证dex文件中的所有类

?对一些特定的类和方法里面的操作码进行优化

?调整所有的字节序(Little_endian)和对齐结构中的每一个域

?基于寄存器,基于寄存器的虚拟机虽然比基于堆栈的虚拟机在硬件,通用性上要差一些,但是它的代码执行效率去更好

?每一个Android应用都运行在它自己的DVM实例中,每一个DVM实例都是一个独立的进程空间。所有的Android应用的线程都对应一个Linux线程,DVM因此可以更多地依赖操作系统的线程调度和管理机制。不同的应用在不同的进程空间里运行,不同的应用都是用不同的Linux用户来运行以最大程度地保户应用程序的安全性和独立性 http://blog.csdn.net/virus026/archive/2010/12/19/6085779.aspx

时间: 2024-10-12 15:12:10

class 文件与dex文件区别 (dvm与jvm区别)及Android DVM介绍的相关文章

【转】Android系统中的.apk文件和dex文件

1. *.apk文件 APK是Android Package的缩写,即Android安装包.通过将APK文件直接传到Android模拟器或Android手机中执行即可安装. 使用Android打包工具(aapt)将DEX文件,资源文件以及AndroidManifest.xml文件组合成一个应用程序包(APK).Dex是Dalvik VM executes的全称,即Android Dalvik执行程序. META-INF\ Jar文件 res\ 存放资源文件 AndroidManifest.xml

用Classpy分析.dex文件

DVM 了解Android的人都知道,可以用Java语言开发Android应用.但是Android操作系统其实只是使用了Java语言而已,真正运行Java代码的虚拟机,并不是JVM,而是DVM(Dalvik Virtual Machine).DVM并不符合JVM规范,主要表现在以下几个方面: JVM是Stack Based,DVM是Register Based JVM执行的是Java Bytecode,DVM有自己的Bytecode JVM要求Java代码编译成.class文件,而DVM要求把.

一步步手动实现热修复(一)-dex文件的生成与加载

热修复技术自从QQ空间团队搞出来之后便渐渐趋于成熟. 我们这个系列主要介绍如何一步步手动实现基本的热修复功能,无需使用第三方框架. 在开始学习之前,需要对基本的热修复技术有些了解,以下文章可以帮助到你: 安卓App热补丁动态修复技术介绍 [腾讯Bugly干货分享]Android Patch 方案与持续交付 Android dex分包方案 dodola/HotFix dex文件的生成与加载 我们在这部分主要做的流程有: 1.编写基本的Java文件并编译为.class文件. 2.将.class文件转

在内存中dump Dex文件

在现在的移动安全环境中,程序加壳已经成为家常便饭了,如果不会脱壳简直没法在破解界混的节奏.ZJDroid作为一种万能脱壳器是非常好用的,但是当作者公开发布这个项目后就遭到了各种加壳器的针对,比如说抢占ZJDroid的广播接收器让ZJDroid无法接收命令等.我们也会在”安卓动态调试七种武器之多情环 - Customized DVM”这篇文章中介绍另一种架构的万能脱壳器.但工具就是工具,当我们发布的时候可能也会遭到类似ZJDroid那样的针对.所以说手动脱壳这项技能还是需要学习的.在这一节中我们会

Dalvik指令分析(二) 从java文件到dex

写这个系列文章是想了很久但是一直没有时间付诸行动,趁着这两天假期还没有结束, 赶紧动笔,怕上班了就没有时间再静下心来写这些文章,所以有点赶,表现在系列文章的 内容安排上就不是很合理,有些内容还需要丰富,但是聊胜于无吧,先写下再修改,如果 有一些反馈也可以根据反馈来修改.好了,开始第二篇文章. 这篇文章可以成为dx的HelloWorld,在这篇文章里我会介绍如果将一个java文件编译 成一个dex文件.ok,go! step1: 准备java文件,文件名HelloWorld.java,内容如下 p

一篇文章带你搞懂DEX文件的结构

DEX文件就是Android Dalvik虚拟机运行的程序,关于DEX文件的结构的重要性我就不多说了.下面,开练! 建议:不要只看,跟着我做.看再多遍不如自己亲自实践一遍来的可靠,别问我为什么知道.泪崩ing..... 首先,我们需要自己构造一个dex文件,因为自己构造的比较简单,分析起来比较容易.等你简单的会了,难的自然也就懂了. 0x00■  构造DEX文件 首先,我们编写一个简单的Java程序,如下: public class HelloWorld { int a = 0; static

C++中#include包含头文件带 .h 和不带 .h 的区别

C++中#include包含头文件带 .h 和不带 .h 的区别? 如 #include <iostream> 和 #include <iostream.h> 包含的东西有哪些不同? 之前在写C++程序的时候只知道使用 #include <iostream> 的时候,使用函数前要用 using namespace std; 导入命名空间,而 #include <iostream.h> 则不用,这个得看C+ +标准化过程为C++开发者做了哪些有意义的工作. (

APPK反编译 dex文件查看源码

00x01 工具准备 Android逆向助手_v2.2 jd-gui apk 7z-zip 00x02 详细步骤 a. 从应用宝官网下载apk,这里我下载了借贷宝: b. 使用 7z-zip提取客户端apk文件,也可先把客户端apk文件后缀名改为 .zip后解压: c. 使用Android逆向助手_v2.2 lib目录下的 dex2jar.bat工具对客户端apk中的 classes.dex文件进行反编译,具体操作如下图: d. 反编译得到的 .jar文件使用Android逆向助手_v2.2 l

文件系统结构以及软链接和硬链接的区别

文件系统结构 /boot:引导文件存放目录,内核文件(vmlinuz).引导加载器(bootloader, grub)都存放于此目录 /bin:供所有用户使用的基本命令:不能关联至独立分区,OS启动即会用到的程序 /sbin:管理类的基本命令:不能关联至独立分区,OS启动即会用到的程序 /lib:启动时程序依赖的基本共享库文件以及内核模块文件(/lib/modules)     /lib64:专用于x86_64系统上的辅助共享库文件存放位置 /etc:配置文件目录 /home/USERNAME: