**class文件格式與dex文件格式的異同**
- 本質上他們都是一樣的,dex是從class文件演變而來的
- class文件存在許多冗余信息,dex會去除冗余,并整合
**Dalvik 虛擬機字節碼和JVM 字節碼的區別**:
**一、程序結構不同**
JVM字節碼由“.class”文件組成, 每個文件一個class。JVM在運行的時候為每一個類裝載字節碼。相反的,Dalvik 程序只包含一個“.dex”文件, 這個文件包含了程序中所有的類。如圖1所示為生成.dex 文件的過程。
:-: 
圖1 生成.dex的過程
Java編譯器創建了JVM字節碼之后,**Dalvik的dx 編譯器刪除“.class”文件, 重新把它們編譯成Dalvik字節碼,然后把它們寫進一個“.dex”文件中。這個過程包括翻譯、重構、解釋程序的基本元素(常量池、類定義、數據段)**。常量池描述了所有的常量,包括引用、方法名、數值常量等。類定義包括了訪問標志、類名等基本信息。數據段中包含各種被DVM執行的函數代碼以及類和
函數的相關信息(例如Dalvik 虛擬機所需要的寄存器數量、局部變量表、操作數堆找大小),還有實例變量。
**二、寄存器結構不同**
**Dalvik虛擬機是基于寄存器的,但是JVM 是基于堆棧的**。JVM 字節碼中,局部變量會被放入局部變量表中,繼而被壓入堆棧供操作碼進行運算,當然JVM也可以只使用堆棧而不顯式地將局部變量存入變量表中。Dalvik虛擬機字節碼中,局部變量會被賦給65536個可用的寄存器中的任何一個, Dalvik虛擬機指令直接操作這些寄存器,而不是訪問堆棧中的元素。
**三、指令集不同**
**Dalvik虛擬機有218個操作碼,而Java虛擬機有200個,并且二者本質上完全不同**。比如,Java 虛擬機有10 多個操作碼用于堆棧和本地變量表的數據轉移而Dalvik虛擬機完全沒有。Dalvik虛擬機指令要比Java指令更長, 因為它們經常包含了寄存器的源地址和目標地址。因此**Dalvik 虛擬機需要更少的指令**。平均來講,**Dalvik虛擬機字節碼程序指令數要比Java少30%,但是程序要大35%左右**。
**四、常量池結構不同**
**JVM字節碼中許多. class 文件中重復常量池**,比如重復引用函數的名字。dx編譯器消除了這些重復。**Dalvik 虛擬機使用了一個常量池供所有的class同時引用**。除此之外, dx 通過內聯技術消除了一些常量。在實際中,整數、長整數、單精度和雙精度浮點常量在這個過程中消失了。
**五、模糊不清的基本類型不同**
JVM的整數賦值和單精度浮點賦值采用不同的操作碼,長整數賦值和雙精度賦值也不同;而Dalvik虛擬機使用相同的操作碼來對整數和浮點進行賦值。
**六、空引用不同**
Dalvik虛擬機字節碼并沒有一個特定的空類型,而是用常量0來取代。這樣,反編譯時,常量0的模糊不清的含義就應當被正確地區分。
**七、類型引用的不同**
Java 字節碼對對象引用的比較和空類型比較使用不同的操作碼,而Dalvik虛擬機只用了一個操作碼來進行簡化。因此如果做反編譯,就必須還原比較對象的類型信息。
**八、數組原始類型的存儲不同**
Dalvik 虛擬機使用不明確的操作碼來進行數組操作(比如aget 和aget-wide),而JVM在這點上是明確的。因此如果要做反編譯,數組類型信息必須還原。
- 前言
- Android 熱補丁技術——資源的熱修復
- 插件化系列詳解
- Dex分包——MultiDex
- Google官網——配置方法數超過 64K 的應用
- IMOOC熱修復與插件化筆記
- 第1章 class文件與dex文件解析
- Class文件解析
- dex文件解析
- class與dex對比
- 第2章 虛擬機深入講解
- 第3章 ClassLoader原理講解
- 類的加載過程
- ClassLoade源碼分析
- Android中的動態加載
- 第4章 熱修復簡單講解
- 第5章 熱修復AndFix詳解
- 第6章 熱修復Tinker詳解及兩種方式接入
- 第7章 引入熱修復后代碼及版本管理
- 第8章 插件化原理深入講解
- 第9章 使用Small完成插件化
- 第10章 使用Atlas完成插件化
- 第11章 課程整體總結
- DN學院熱修復插件化筆錄
- 插件化
- 熱修復
- Android APP開發應掌握的底層知識
- 概述
- Binder
- AIDL
- AMS
- Activity的啟動和通信原理
- App啟動流程第2篇
- App內部的頁面跳轉
- Context家族史
- Service
- BroadcastReceiver
- ContentProvider
- PMS及App安裝過程