class文件與dex文件分析

1.什么是class文件

class文件就是可以被JVM識(shí)別支竹,加載,運(yùn)行的一種文件格式券敌。一般情況下唾戚,它可以由java代碼編譯執(zhí)行后得到,但是這并不是一定的壁顶,像kotlin恤煞,scala,python,ruby等JVM語(yǔ)言都可以通過(guò)編譯得到class文件遇伞。

2.如何得到class文件

上面已經(jīng)講了,得到class文件不一定要使用java另假。這里我們只討論使用java去生成class文件础淤。一般情況下,我們都是通過(guò)Ecplise或者Intellij這樣的IDE開(kāi)發(fā)工具去build工程鬼吵,當(dāng)然也可以用個(gè)JDK中的javac命令去編譯java文件扣甲。當(dāng)我們一開(kāi)始接觸java時(shí),老師也是這么教的齿椅。這里回顧下琉挖,前提pc已經(jīng)有java環(huán)境了(安裝了jdk,配置了環(huán)境變量)
寫(xiě)個(gè)簡(jiǎn)單java代碼文件
public class HelloClass{ public static void main(String[] args){ System.out.println("Hello Class!"); } }
然后進(jìn)入終端涣脚,通過(guò)javac命令編譯這個(gè)文件
javac -target 1.6 -source 1.6 HelloClass.java
這是你就會(huì)在當(dāng)前目錄下看到一個(gè)HelloClass.class的文件示辈,這就是我們的目標(biāo)。就這么簡(jiǎn)單...

3.class文件的結(jié)構(gòu)

class文件記錄著整一個(gè)類(lèi)的所有信息遣蚀,是所有矾麻!
class文件結(jié)構(gòu)的3個(gè)特點(diǎn):

  1. 是一種8位字節(jié)的二進(jìn)制流文件
  2. 各個(gè)數(shù)據(jù)按順序緊密的排列,無(wú)間隙
  3. 每個(gè)類(lèi)或者借口都單獨(dú)占據(jù)一個(gè)class文件
QQ截圖20170610093949.png

上面就是完整的class文件的結(jié)構(gòu)芭梯,是不是看暈了...

  • magic 加密字段
  • minor_version 支持最低版本的jdk
  • major_version 編譯使用的jdk版本
  • constant_pool_count 常量池的數(shù)量
  • cp_info constant_pool 常量池的結(jié)構(gòu)體险耀,數(shù)量不定
  • access_flags 訪問(wèn)級(jí)別
  • this_class 當(dāng)前類(lèi)
  • super_class 父類(lèi)
  • interfaces_count 類(lèi)實(shí)現(xiàn)接口的數(shù)量
  • fields_count 類(lèi)成員變量的數(shù)量
  • methods_count 類(lèi)方法的數(shù)量
  • method_info methods 類(lèi)方法的結(jié)構(gòu)體
  • attributes_count 類(lèi)屬性的數(shù)量
  • attribute_info attributes 類(lèi)屬性的結(jié)構(gòu)體

4.什么dex文件

dex文件就是可以被android虛擬機(jī)dvm識(shí)別,加載玖喘,運(yùn)行的文件格式甩牺。

5.如何生成dex文件

一般情況下,我們都是通過(guò)IDE的build工具生成芒涡,當(dāng)然我們也可以手動(dòng)編譯生成柴灯。所需要用到的命令在android sdk路徑下的build-tools\25.0.2(任意版本)\dx,我們現(xiàn)在的目標(biāo)是要將HelloClass.class這個(gè)文件打包成dex文件
dx --dex --output HelloClass.dex HelloClass.class
然后卖漫,你就可以在當(dāng)前目錄下看到一個(gè)叫HelloClass.dex的文件,so easy赠群!

6.運(yùn)行dex文件

因?yàn)閐ex文件是運(yùn)行在android dalvik虛擬機(jī)上的羊始,所以我們要先將dex文件push到手機(jī)中,具體步驟如下:
adb push HelloClass.dex /sdcard/ adb shell 127|root@vbox86p:/sdcard # dalvikvm -cp HelloClass.dex HelloClass
然后就能看到Hello Class!的打印了查描,跟我們?cè)趐c上運(yùn)行一模一樣

7.dex文件的結(jié)構(gòu)

  1. 一種8位字節(jié)的二進(jìn)制流文件
  2. 各個(gè)數(shù)據(jù)按順序緊密排列突委,無(wú)間隙
  3. 整個(gè)應(yīng)用所有java源文件都放在一個(gè)dex文件中(一般情況下)
Paste_Image.png

上面就是完整的dex文件的結(jié)構(gòu),我們可以把dex的文件結(jié)構(gòu)分成3個(gè)區(qū)冬三。
第一個(gè)區(qū)是header匀油,包括header_item dex_header這個(gè)結(jié)構(gòu)體,第二個(gè)區(qū)是索引區(qū)勾笆,包括string_id_list dex_string_ids(字符串索引)敌蚜,type_id_list dex_type_ids(類(lèi)型索引),proto_id_list dex_proto_ids(方法原型索引)窝爪,field_id_list dex_field_ids(域索引)弛车,method_id_list dex_method_ids(方法索引),第三個(gè)區(qū)是數(shù)據(jù)區(qū)蒲每,包括
class_def_item_list dex_class_defs(類(lèi)的定義)纷跛,data(圖中的value),link_data(so)

8.class文件和dex文件的對(duì)比#

兩者本質(zhì)上是一致的邀杏,dex文件也是從class文件演變而來(lái)的贫奠,個(gè)人感覺(jué)像是打包一樣,當(dāng)然不止如此望蜡。dex文件比class文件的優(yōu)勢(shì)是去除了class文件結(jié)構(gòu)中冗余的設(shè)計(jì)唤崭,更加精簡(jiǎn),適合于運(yùn)用在移動(dòng)端泣特。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末浩姥,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子状您,更是在濱河造成了極大的恐慌勒叠,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,607評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件膏孟,死亡現(xiàn)場(chǎng)離奇詭異眯分,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)柒桑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)弊决,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事飘诗∮氤” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,960評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵昆稿,是天一觀的道長(zhǎng)纺座。 經(jīng)常有香客問(wèn)我,道長(zhǎng)溉潭,這世上最難降的妖魔是什么喳瓣? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,750評(píng)論 1 294
  • 正文 為了忘掉前任蹭秋,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘丈挟。我一直安慰自己曙咽,他們只是感情好鱼蝉,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,764評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布洁奈。 她就那樣靜靜地躺著呈野,像睡著了一般商佛。 火紅的嫁衣襯著肌膚如雪幔戏。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,604評(píng)論 1 305
  • 那天陆馁,我揣著相機(jī)與錄音,去河邊找鬼合愈。 笑死叮贩,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的佛析。 我是一名探鬼主播益老,決...
    沈念sama閱讀 40,347評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼寸莫!你這毒婦竟也來(lái)了捺萌?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,253評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤膘茎,失蹤者是張志新(化名)和其女友劉穎桃纯,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體辽狈,經(jīng)...
    沈念sama閱讀 45,702評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡慈参,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,893評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了刮萌。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片驮配。...
    茶點(diǎn)故事閱讀 40,015評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出壮锻,到底是詐尸還是另有隱情琐旁,我是刑警寧澤,帶...
    沈念sama閱讀 35,734評(píng)論 5 346
  • 正文 年R本政府宣布猜绣,位于F島的核電站灰殴,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏掰邢。R本人自食惡果不足惜牺陶,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,352評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望辣之。 院中可真熱鬧掰伸,春花似錦、人聲如沸怀估。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,934評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)多搀。三九已至歧蕉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間康铭,已是汗流浹背惯退。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,052評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留从藤,地道東北人蒸痹。 一個(gè)月前我還...
    沈念sama閱讀 48,216評(píng)論 3 371
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像呛哟,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子匿沛,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,969評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理扫责,服務(wù)發(fā)現(xiàn),斷路器逃呼,智...
    卡卡羅2017閱讀 134,657評(píng)論 18 139
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法鳖孤,類(lèi)相關(guān)的語(yǔ)法,內(nèi)部類(lèi)的語(yǔ)法抡笼,繼承相關(guān)的語(yǔ)法苏揣,異常的語(yǔ)法,線程的語(yǔ)...
    子非魚(yú)_t_閱讀 31,639評(píng)論 18 399
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,152評(píng)論 25 707
  • 照片里的老南京(二) 摘自網(wǎng)絡(luò) (二十世紀(jì)三...
    天行健志強(qiáng)閱讀 265評(píng)論 1 2
  • 今年回家,每個(gè)見(jiàn)面的親戚,都不由自主的發(fā)出感嘆增炭,“**忍燥,你咋又變胖了,前兩年見(jiàn)的時(shí)候多帥啊”隙姿,說(shuō)的這人是老公梅垄,然后...
    無(wú)知者的自我救贖閱讀 378評(píng)論 0 0