Dalvik 虚拟机使用的指令是基于寄存器,而 Java 虚拟机则使用的指令集是基于堆栈的。(Dalvik 基于寄存器,而 JVM 基于栈。)...,每一个 Android 应用在底层都会对应一个独立的 Dalvik 虚拟机实例,其代码在虚拟机的解释下得以执行; 不同于 Java 虚拟机运行 java 字节码,Dalvik 虚拟机运行的是其专有的文件格式...而在 Dalvik 字节码中,包含俩种类型,分别为: 基本类型 引用类型 我们常说的对象和数组便是引用类型,下面附上关于 Dalvik 字节码的基本类型图: ?...而 Dalvik 字节码引用类型又包含如下: 对象类型: 例如,L 代表 Java 类型中任何类,而在 Java 代码中引用格式如下: package.name.ObjectName....寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令、数据和地址。在中央处理器的控制部件中,包含的寄存器有指令寄存器(IR)和程序计数器(PC)。
Dalvik 是解释执行加上 JIT,每次app运行的时候,它动态的将一部分 Dalvik 字节码 解释为机器码。随着 App 的运行,更多的字节码被编译和缓存。...JVM 运行的是 Java 字节码,而 Dalvik 运行的是 Dalvik 字节码。...的确,Java 虚拟机的操作码都是单字节的,其指令字总操作码个数不超过 256 条。而 Dalvik 指令则长的多的多,数量也多的多。...2 表示该指令有多少个 16 位的字组成 1 表示该指令最多使用多少个寄存器 c 为类型码,c 代表常量池索引 关于类型码,还有很多种,如下表所示: 助记符 位数 含义 b 8 有符号立即数(字节) c...类型描述符 Dalvik 字节码中只有两种类型,基本类型和引用类型。除了对象和数组以外,其他的所有 Java 类型都是基本类型。这和 JVM 的类型描述符是基本一致的。基本类型都是使用单个字母来表示。
特别是动态类型的处理以及不同引擎对于平台无关的字节码的设计和处理会有很大的帮助。...开始 DFG 会把字节码转成 DFG CPS 格式,这个格式会描述变量和临时数据之间的数据流关系。再用分析信息来推测类型,通过推测的类型减少类型的检查。...Air 在寄存器分配器的选择上使用了经典的图形着色寄存器分配器,叫迭代寄存器合并,简称 IRC。...答案是否定的,Android 使用的虚机叫 Dalvik VM),这款虚机在很多设计上都与 JVM 兼容,字节码是二地址和三地址并用的方式,是基于寄存器的架构。...JVM 和 Dalvik VM 的主要区别是后者字节码指令数量和内存更少。
,Dalvik VM是基于寄存器的,而JVM是基于栈的;Dalvik有专属的文件执行格式dex(dalvik executable),而JVM则执行的是java字节码。...Smali格式是dex格式的一种直观可读形式 Smali文件可以认为是Davilk的字节码文件 详见后续的Smali介绍 2、Dalvik寄存器命名法 Dalvik虚拟机参数传递方式中的规定:假设一个函数使用到...,传入参数位于p1处,传出参数位于v0处 5、dex文件反编译工具 Dalvik 虚拟机并不支持直接执行 JAVA 字节码,所以会对编译生成的 .class 文件进行翻译、重构、解释、压缩等处理,这个处理过程是由...字节码类型 Davilk字节码只有两种类型:基本类型和引用类型,对象和数组都是引用类型。...,比如在Java代码中的java.lang.String对应在Davlik中描述是Ljava/lang/String 二、Dalvik指令集 上面只是简单了解了Dalvik字节码,具体每个方法涉及到的逻辑还需要
; 字段格式:类型(包名+类名)-> 字段名称:字段类型 dalvik 指令 基础字节码 - 名称后缀/字节码后缀 目的寄存器 源寄存器 nop 空操作指令,值为 00,对其代码,无实际操作...move-result vAA 将上一个 invoke 类型指令操作的单字非对象结果赋给 vAA 寄存器 move-result-wide vAA 将上一个 invoke 类型指令操作的双字非对象结果赋给...这条指令占用两个字节,值为 0xooff (Android4.0新增) 实例操作指令 check-cast vAA, type@BBBB 将 vAA 寄存器中的对象引用转换为指定类型 instance-of...BBBB 相同,只是参数寄存器使用 range 字节码指定了取值范围 fill-array-data vAA, +BBBBBBBB 用指定的数据填充数组, vAA 寄存器为数组引用,引用必须为基础类型的数组...,在指令后面会紧跟一个数据表 异常指令 throw vAA 抛出 vAA 寄存器中指定类型的异常 跳转指令 if-eq 等于 if-ne 不等于 if-lt 小于 if-le 小于等于
1.JAVA虚拟机运行的是JAVA字节码,Dalvik虚拟机运行的是Dalvik字节码 java虚拟机:JAVA->class文件 dalvik虚拟机:JAVA->class文件->Dalvik字节码...Dalvik虚拟机 SDK中有个dx工具负责将JAVA字节码转换为Dalvik字节码,**对JAVA类文件重新排列,**将所有JAVA类文件中的常量池分解,消除其中的冗余信息,重新组合形成一个常量池,...2.代码尺寸和解码效率不如基于栈虚拟机,因为它包含操作数,所以指令大于基于堆栈的指令。但是基于寄存器产生更少的代码,所以总的代码数不会增加。...3.寄存器虚拟机必须从操作指令中解码操作数,需要额外的解码操作。...Dalvik虚拟机执行的是dex字节码,ART虚拟机执行的是本地机器码 Dalvik执行的是dex字节码,依靠JIT编译器解释执行,运行时动态地将执行频率很高的dex字节码翻译成本地机器码,然后在执行,
一般来说,基于堆栈的机器必须使用指令才能从堆栈上的加载和操作数据,因此,相对基于寄存器的机器,它们需要更多的指令才能实现相同的性能。...但是基于寄存器机器上的指令必须经过编码,因此,它们的指令往往更大。...常量池已被修改为只使用32位的索引,以简化解释器 标准Java字节码实行8位堆栈指令,Dalvik使用16位指令集直接作用于局部变量。局部变量通常来自4位的“虚拟寄存器”区。...在 Dalvik 下,应用每次运行的时候,字节码都需要通过即时编译器(just in time ,JIT)转换为机器码,这会拖慢应用的运行效率,而在ART 环境中,应用在第一次安装的时候,字节码就会预先编译成机器码...在 Android N 之前,对于在 dalvik 环境中 使用 dexopt 来对 dex 字节码进行优化生成 odex 文件最终存在手机的 data/dalvik-cache 目录下,最后把 apk
smali 的dalvik 操作码链接dalvik_opcodes smali 中的数据类型 smali中有两类数据类型:基本类型和引用类型。 引用类型是指数组和对象,其他都是基础类型。...寄存器 在dalvik字节码中,寄存器都是32位的,能够支持任何类型。64位类型(Long和Double型)用2个寄存器表示。 有两种方式指定一个方法中有多少寄存器是可用的。....registers指令指定了方法中寄存器的总数。 .locals指令表明了方法中非参寄存器的数量。 方法的传参 当一个方法被调用的时候,方法的参数被置于最后N个寄存器中。....registers 指令指定了方法中寄存器的总数 .locals 指令表明了方法中非参寄存器的总数,出现在方法中的第一行 类 如果没有内部类的话一个类在一个文件中; 如果有内部类,则内部类单独一个文件文件名格式为...说了这么多,其实读到这里只要记住两点:在字节码层面表示构造方法,表示静态程序块。
,但JAVA编译后生成的字节码是在JVM上跑,需要由JVM把字节码翻译成机器指令,才能使JAVA程序跑起来。...而DVM 运行的是Dalvik字节码,所有的Dalvik字节码由JAVA字节码转换而来,并被打包到一个DEX(Dalvik Executable)可执行文件中,DVM通过解释DEX文件来执行这些字节码...③JVM基于栈,DVM基于寄存器 JAVA虚拟机基于栈结构,程序在运行时虚拟机需要频繁的从栈上读取写入数据,这个过程需要更多的指令分派与内存访问次数,会耗费很多CPU时间。...Dalvik虚拟机基于寄存器架构,数据的访问通过寄存器间直接传递,这样的访问方式比基于栈方式要快很多。...JIT以JVM为例,javac把程序源码编译成JAVA字节码,JVM通过逐条解释字节码将其翻译成对应的机器指令,逐条读入,逐条解释翻译,执行速度必然比C/C++编译后的可执行二进制字节码程序慢,为了提高执行速度
并拥有一套完整的指令系统 5.提供了对象生命周期管理 堆栈管理 线程管理 安全和异常管理以及垃圾回收等重要功能 6.所有的Android程序都运行在Android系统进程里 每个进程对应一个Dalvik...虚拟机实例 Dalvik虚拟机与Java虚拟机的区别 两者不兼容 1.java虚拟机运行的是Java字节码 Dalvik虚拟机运行的是Dalvik字节码 传统的Java程序经过编译 生成Java字节码保持在...class文件中 Java虚拟机通过编码class文件中的内容来运行程序 而Dalvik虚拟机运行的是Dalvik字节码 所有Dalvik字节码由Java字节码转换而来 并被打包到一个DEX可执行文件中...Dalvik虚拟机通过解释DEX文件来执行这些字节码 2....程序在运行时虚拟机需要频繁的从栈上读取或写入数据 这个过程需要更多的指令与内存访问次数 会耗费不少CPU时间 对于像手机设备资源有限的设备来说这是相当大的一笔开销 Dalvik虚拟机基于寄存器架构 数据的访问通过寄存器间直接传递
,但JAVA编译后生成的.class字节码是在JVM上跑,需要由JVM把字节码翻译成机器指令,才能使JAVA程序跑起来。...Dalvik虚拟机基于 寄存器架构,数据的访问通过寄存器间直接传递,这样的访问方式比基于栈方式要快很多。...基于栈的架构具有更好的可移植性,因为其实现不依赖于物理寄存器 基于栈的架构通常指令更短,因为其操作不需要指定操作数和结果的地址 基于寄存器的架构通常运行速度更快,因为有寄存器的支撑 基于寄存器的架构通常需要较少的指令来完成同样的运算...,因为不需要进行压栈和出栈 执行的字节码不同:Java运行的是Java字节码,DVM运行的是Dalvik字节码。...ART : .dex->.odex(机器码)(AOT Ahead-Of-Time) Dalvik: .dex->.odex(字节码)(JIT Just-In-Time) 机器码可直接执行,而字节码每次启动都需要执行将优化过的
但是这种说法并不准确,因为Dalvik虚拟机并不是按照Java虚拟机的规范来实现的,两者并不兼容;同时还要两个明显的不同: Java虚拟机运行的是Java字节码,而Dalvik虚拟机运行的则是其专有的文件格式...在Java SE程序中的Java类会被编译成一个或者多个字节码文件(.class)然后打包到JAR文件,而后Java虚拟机会从相应的CLASS文件和JAR文 件中获取相应的字节码;Android应用虽然也是使用...基于栈的机器必须使用指令来载入和操作栈上数据,所需指令更多更多 dalvik虚拟机是基于寄存器的 java虚拟机运行的是java字节码。...(java类会被编译成一个或多个字节码.class文件,打包到.jar文件中,java虚拟机从相应的.class文件和.jar文件中获取相应的字节码) Dalvik运行的是自定义的.dex字节码格式。...(1)虚拟机很小,使用的空间也小; (2)Dalvik没有JIT编译器; (3)常量池已被修改为只使用32位的索引,以简化解释器; (4)它使用自己的字节码,而非Java字节码。
,但JAVA编译后生成的.class字节码是在JVM上跑,需要由JVM把字节码翻译成机器指令,才能使JAVA程序跑起来。...Dalvik虚拟机基于 寄存器架构,数据的访问通过寄存器间直接传递,这样的访问方式比基于栈方式要快很多。...基于栈的架构具有更好的可移植性,因为其实现不依赖于物理寄存器 基于栈的架构通常指令更短,因为其操作不需要指定操作数和结果的地址 基于寄存器的架构通常运行速度更快,因为有寄存器的支撑 基于寄存器的架构通常需要较少的指令来完成同样的运算...,因为不需要进行压栈和出栈 执行的字节码不同:Java运行的是Java字节码,DVM运行的是Dalvik字节码。... ART : .dex->.odex(机器码)(AOT Ahead-Of-Time) Dalvik: .dex->.odex(字节码)(JIT Just-In-Time) 机器码可直接执行
文章目录 一、动态字节码技术 二、Dalvik & ART 虚拟机 三、Android 字节码打包过程 总结 一、动态字节码技术 ---- 动态字节码技术 就是在 运行时 , 动态修改 Class 字节码...数据 ; 如 : 修改下面字节码文件中的二进制数据信息 ; 动态字节码技术实现 : 首先 , 要 分析整个 Class 字节码中的信息 ; 然后 , 找到要修改的字节码 数据位置 ; 最后 , 替换对应的二进制数据..., 不需要开发者自己手动分析 Java 字节码文件 ; 二、Dalvik & ART 虚拟机 ---- Android 5.0 之前使用 Dalvik 虚拟机 . 5.0 之后使用 ART 虚拟机...; Dalvik 已经被淘汰 , 目前重点学习 ART 即可 ; JVM 与 Dalvik 虚拟机区别 : JVM 是基于栈的 ; 打包后的字节码文件是 jar 文件 ; Dalvik 是基于寄存器的...; 打包后的字节码文件是 dex 文件 ; 程序在 CPU 上运行 , 通过执行寄存器上的指令对数据进行操作 ; jar 文件与 dex 文件 对比图 : JVM 中有 JIT 即时编译器 , 代码在运行时
DVM是基于寄存器的,它没有基于栈的虚拟机在拷贝数据而使用的大量的出入栈指令,同时指令更紧凑更简洁。...但是由于显示指定了操作数,所以基于寄存器的指令会比基于栈的指令要大,但是由于指令数量的减少,总的代码数不会增加多少。...执行的字节码不同 在Java SE程序中,Java类会被编译成一个或多个.class文件,打包成jar文件,而后JVM会通过相应的.class文件和jar文件获取相应的字节码。...从上图可以看出,首先Java编译器编译的.class文件经过DX工具转换为.dex文件,.dex文件由类加载器处理,接着解释器根据指令集对Dalvik字节码进行解释、执行,最后交与Linux处理。...ART与DVM的区别 DVM中的应用每次运行时,字节码都需要通过即时编译器(JIT,just in time)转换为机器码,这会使得应用的运行效率降低。
Android虚拟机的演变 4.4版本前,使用的是Dalvik虚拟机 5.0版本以后,使用的是Art虚拟机 Dalvik虚拟机 原理 Dalvik是基于寄存器的虚拟机,读取和保存数据会比基于栈的JVM在运行时快很多...基于寄存器的虚拟机允许更快的执行时间,但代价是编译后的程序更大 新的Dex字节码格式 合并多个class字节码文件 减少常量池大小 减少文件的IO操作,提高类的查找速度 减少文件大小 dex的优化格式...Dex的优化 Dalvik的JIT 在运行时对dex的指令进行intercept,解释成机器码 虚拟机根据函数调用的次数,来决定热点代码 以函数为维度将热点代码的机器码进行缓存,在下一次调用时直接调用该机器码...而根据Profile生成AOT的过程就是:Profile Guided AOT 而在JIT的过程中会进行以下事情: JIT的解释器:将字节码解释成机器指令 JIT的编译器:将函数编译成机器指令 根据运行时的环境生成...Android N的ART模式 JIT的解释器 对字节码进行解释 基于计算的跳转指令 基于Arm汇编的Operation Code处理 Profiling以及JIT编译的触发 基于函数执行次数以及搜索式的代码热度
,但JAVA编译后生成的.class字节码是在JVM上跑,需要由JVM把字节码翻译成机器指令,才能使JAVA程序跑起来。...增加了对新的操作码的支持,使文件结构尽量简洁,使用等长的指令,借以提高解析速度。 3、什么是ART虚拟机,和JVM/DVM有什么不同?...Dalvik虚拟机执行的是dex字节码,ART虚拟机执行的是本地机器码。...Dalvik执行的是dex字节码,依靠JIT编译器去解释执行,运行时动态地将执行频率很高的dex字节码翻译成本地机器码,然后在执行,但是将dex字节码翻译成本地机器码是发生在应用程序的运行过程中,并且应用程序每一次重新运行的时候...安卓运行时从Dalvik虚拟机替换成ART虚拟机,并不要求开发者重新将自己的应用直接编译成目标机器码,也就是说,应用程序仍然是一个包含dex字节码的apk文件。
APK、Dalvik字节码和smali文件 APK文件 大家都应该知道APK文件其实就是一个MIME为ZIP的压缩包,我们修改ZIP后缀名方式可以看到内部的文件结构,例如修改后缀后用RAR打开鳄鱼小顽皮...Dalvik字节码 Dalvik是google专门为Android操作系统设计的一个虚拟机,经过深度的优化。...Dalvik VM是基于寄存器的,而JVM是基于栈的;Dalvik有专属的文件执行格式dex(dalvik executable),而JVM则执行的是java字节码。...Dalvik VM比JVM速度更快,占用空间更少。 通过Dalvik的字节码我们不能直接看到原来的逻辑代码,这时需要借助如Apktool或dex2jar+jd-gui工具来帮助查看。...前面说过,Dalvik VM与JVM的最大的区别之一就是Dalvik VM是基于寄存器的。基于寄存器是什么意思呢?
java虚拟机和Dalvik虚拟机的区别: java虚拟机 Dalvik虚拟机 java虚拟机基于栈。 ...基于栈的机器必须使用指令来载入和操作栈上数据,所需指令更多更多 dalvik虚拟机是基于寄存器的 java虚拟机运行的是java字节码。...(java类会被编译成一个或多个字节码.class文件,打包到.jar文件中,java虚拟机从相应的.class文件和.jar文件中获取相应的字节码) Dalvik运行的是自定义的.dex字节码格式。...(java类被编译成.class文件后,会通过一个dx工具将所有的.class文件转换成一个.dex文件,然后dalvik虚拟机会从其中读取指令和数据) 常量池已被修改为只使用32位的索引,以 简化解释器...每个android dalvik应用程序都被赋予了一个独立的linux PID(app_*)) Dalvik虚拟机架构: 在android源码中,Dalvik虚拟机的实现位于“dalvik/”目录下
Dalvik字节码 Dalvik是google专门为Android操作系统设计的一个虚拟机,经过深度的优化。...Dalvik VM是基于寄存器的,而JVM是基于栈的;Dalvik有专属的文件执行格式dex(dalvik executable),而JVM则执行的是java字节码。...goto :goto_0 .end method smali寄存器 Dalvik VM与JVM的最大的区别之一就是Dalvik VM是基于寄存器的。基于寄存器是什么意思呢?...没有“-object”后缀的表示操作的成员变量对象是基本数据类型,带“-object”表示操作的成员变量是对象类型,特别地,boolean类型则使用带“-boolean”的指令操作。...ARM常用指令 ADD 加指令 SUB 减指令 STR 把寄存器内容存到栈上 LDR 把栈上内容载入一个寄存器中 .W 是一个可选指令宽度说明符。
领取专属 10元无门槛券
手把手带您无忧上云