問:簡單說說 dexopt 與 dex2oat 的區(qū)別馁筐?
答:這道題目如果想深入理解就需要去看源碼了涂召,不過對于應(yīng)用層開發(fā)來說有個原理上的大致理解也是必須掌握的,具體區(qū)別可用如下圖概述(圖片來自網(wǎng)絡(luò))敏沉。
通過上圖可以很明顯的看出 dexopt 與 dex2oat 的區(qū)別果正,前者針對 Dalvik 虛擬機(jī),后者針對 Art 虛擬機(jī)盟迟。
dexopt 是對 dex 文件 進(jìn)行 verification 和 optimization 的操作秋泳,其對 dex 文件的優(yōu)化結(jié)果變成了 odex 文件,這個文件和 dex 文件很像攒菠,只是使用了一些優(yōu)化操作碼(譬如優(yōu)化調(diào)用虛擬指令等)轮锥。
dex2oat 是對 dex 文件的 AOT 提前編譯操作,其需要一個 dex 文件要尔,然后對其進(jìn)行編譯舍杜,結(jié)果是一個本地可執(zhí)行的 ELF 文件,可以直接被本地處理器執(zhí)行赵辕。
除此之外在上圖還可以看到 Dalvik 虛擬機(jī)中有使用 JIT 編譯器既绩,也就是說其也能將程序運(yùn)行的熱點(diǎn) java 字節(jié)碼編譯成本地 code 執(zhí)行,所以其與 Art 虛擬機(jī)還是有區(qū)別的还惠。Art 虛擬機(jī)的 dex2oat 是提前編譯所有 dex 字節(jié)碼饲握,而 Dalvik 虛擬機(jī)只編譯使用啟發(fā)式檢測中最頻繁執(zhí)行的熱點(diǎn)字節(jié)碼。