※ 引述《gn00618777 (非常念舊)》之銘言:
: ※ 引述《gn00618777 (非常念舊)》之銘言:
: : 我查詢了網路上以及書本
: : 版本1: JIT是將source code 轉換成 byte code之後,在程式執行期間
: : 再將byte code編譯成機械碼。
: : 版本2: 擁有JIT表示Dalvik將APP的byte code轉換成二進制組合指令,那將
: : 以原生方式執行在目標的CPU上,而不是由VM一次解譯一條指令。
: : 這兩者,哪種比較對阿.....版本1說得好像就是執行期間,需要才編譯成機械碼。
: : 這和版本2是直接說"不是由VM一次解譯一條指令"好像有點抵觸,希望能為我解惑,
: : 謝謝。版本2出自於O'REILY翻譯的書,我個人覺得翻譯的好爛,前因後果要自己兜起來。
: 我還是不太懂版本二..
: "不是由VM一次解譯一條指令",意思是說不是在執行中需要才編譯?
: 是說JIT已經在執行前將APP byte code編譯成機械碼了嗎?這樣在執行前
: 是不是不用佔用CPU來編譯比較省電?
: 這是我的理解,希望有神人為我補充...謝謝。
.dex檔是我們製作完app後打包進apk的東西
它基本上是java .class檔的變形 為行動裝置做過優化的一種byte code
是platform independent的
而在Android 2.2 Froyo之前完全沒有JIT compiler的時候
dalvik vm 做的事就跟java vm 做的差不多
就是直譯這些byte code
在有JIT之後 dalvik 每直譯一條指令 會統計這條指令被直譯的次數
如果次數多到超過門檻 就會把它編譯成native code
也就是platform dependent的機器碼了
它這種不是一次把整份byte code編成native code 因此叫做JIT(just-in-time)
而最近幾年推出的Android ART就不是用JIT而是用AOT(ahead-of-time)
顧名思義就是在執行之前 就會把整份byte code編譯成native code
而且跟JIT不同 它會把native code存成一個檔案
雖然編玩的native code你用file指令下去看它會告訴你是一個ELF可執行檔
但我上次把它dump出來看 基本上裡面的區段都是android專用的
不可能獨立執行
基本上下一個正式版本的android(沒意外的話是今年秋天)就會把dalvik完全拿掉了
全換成ART
但就算是目前潮的滴水的Android L 內部runtime的轉換仍屬於陣痛期
例如編好的native code副檔名仍叫.dex
還有就是用過Android L的朋友都知道 有用JNI且比較複雜的app幾乎爆光光
因為ART對於JNI的檢查特別嚴格 有些dalvik可以過的ART都不能
其實google很早就在官網說了 但就算Unity3D如此大公司都沒有落實
用unity3d當引擎的遊戲一開就閃退
糟了我是不是說很多不相關的事XD
希望有解答原po的疑問