java class dex_class文件与dex文件分析
1.什么是class文件
class文件就是可以被JVM識別,加載,運行的一種文件格式。一般情況下,它可以由java代碼編譯執行后得到,但是這并不是一定的,像kotlin,scala,python,ruby等JVM語言都可以通過編譯得到class文件。
2.如何得到class文件
上面已經講了,得到class文件不一定要使用java。這里我們只討論使用java去生成class文件。一般情況下,我們都是通過Ecplise或者Intellij這樣的IDE開發工具去build工程,當然也可以用個JDK中的javac命令去編譯java文件。當我們一開始接觸java時,老師也是這么教的。這里回顧下,前提pc已經有java環境了(安裝了jdk,配置了環境變量)
寫個簡單java代碼文件
public class HelloClass{ public static void main(String[] args){ System.out.println("Hello Class!"); } }
然后進入終端,通過javac命令編譯這個文件
javac -target 1.6 -source 1.6 HelloClass.java
這是你就會在當前目錄下看到一個HelloClass.class的文件,這就是我們的目標。就這么簡單...
3.class文件的結構
class文件記錄著整一個類的所有信息,是所有!
class文件結構的3個特點:
是一種8位字節的二進制流文件
各個數據按順序緊密的排列,無間隙
每個類或者借口都單獨占據一個class文件
QQ截圖20170610093949.png
上面就是完整的class文件的結構,是不是看暈了...
magic 加密字段
minor_version 支持最低版本的jdk
major_version 編譯使用的jdk版本
constant_pool_count 常量池的數量
cp_info constant_pool 常量池的結構體,數量不定
access_flags 訪問級別
this_class 當前類
super_class 父類
interfaces_count 類實現接口的數量
fields_count 類成員變量的數量
methods_count 類方法的數量
method_info methods 類方法的結構體
attributes_count 類屬性的數量
attribute_info attributes 類屬性的結構體
4.什么dex文件
dex文件就是可以被android虛擬機dvm識別,加載,運行的文件格式。
5.如何生成dex文件
一般情況下,我們都是通過IDE的build工具生成,當然我們也可以手動編譯生成。所需要用到的命令在android sdk路徑下的build-tools\25.0.2(任意版本)\dx,我們現在的目標是要將HelloClass.class這個文件打包成dex文件
dx --dex --output HelloClass.dex HelloClass.class
然后,你就可以在當前目錄下看到一個叫HelloClass.dex的文件,so easy!
6.運行dex文件
因為dex文件是運行在android dalvik虛擬機上的,所以我們要先將dex文件push到手機中,具體步驟如下:
adb push HelloClass.dex /sdcard/ adb shell 127|root@vbox86p:/sdcard # dalvikvm -cp HelloClass.dex HelloClass
然后就能看到Hello Class!的打印了,跟我們在pc上運行一模一樣
7.dex文件的結構
一種8位字節的二進制流文件
各個數據按順序緊密排列,無間隙
整個應用所有java源文件都放在一個dex文件中(一般情況下)
Paste_Image.png
上面就是完整的dex文件的結構,我們可以把dex的文件結構分成3個區。
第一個區是header,包括header_item dex_header這個結構體,第二個區是索引區,包括string_id_list dex_string_ids(字符串索引),type_id_list dex_type_ids(類型索引),proto_id_list dex_proto_ids(方法原型索引),field_id_list dex_field_ids(域索引),method_id_list dex_method_ids(方法索引),第三個區是數據區,包括
class_def_item_list dex_class_defs(類的定義),data(圖中的value),link_data(so)
8.class文件和dex文件的對比#
兩者本質上是一致的,dex文件也是從class文件演變而來的,個人感覺像是打包一樣,當然不止如此。dex文件比class文件的優勢是去除了class文件結構中冗余的設計,更加精簡,適合于運用在移動端。
總結
以上是生活随笔為你收集整理的java class dex_class文件与dex文件分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [转载]深入分析:我们为何需要DDR2内
- 下一篇: CTS测试方法