65536問題理解v4

keyboard3發表於2017-12-13

com.android.dex.DexIndexOverflowException 首先出現這個問題場景:當Android應用工程引用方法數>65536時,gradle構建時會報65536問題,肯定是gradle構建任務時做了方法數的檢測。大牛們都去翻開構建原始碼做了驗證 method id not in [0,0xffff]。

無論你的應用只執行在Dalvik上還是Art上,都只能打包成dex檔案。雖然應用安裝之後,dex會被優化成其他格式的檔案。

Dalvik Executable 規範將可在單個 DEX 檔案內可引用的方法總數限制在 65,536,其中包括 Android 框架方法、庫方法以及您自己程式碼中的方法。在電腦科學領域內,術語[*千(簡稱 K)*](https://en.wikipedia.org/wiki/Kilo-)表示 1024(或 2^10)。由於 65,536 等於 64 X 1024,因此這一限制也稱為“64K 引用限制”。
複製程式碼

而且在dalvik的虛擬機器實現裡執行時裡方法引用索引數是 16 位。這一點官方davlik指令有說明

image.png

Dalvik虛擬機器和Art虛擬機器安裝過程中的區別 Apk在Dalvik上安裝時,僅載入優化一個dex檔案(class.dex)成odex檔案 Apk在Art上安裝時,會載入多個dex檔案,合併優化成oat檔案 所以要繞過64k應用限制,首先需要在構建打包過程中將程式碼分成多個小於64k的檔案 在dalvik上需要解決的是如何在執行時載入其他dex檔案 而在art上則不需要擔心,它會自動處理合並所有dex檔案

各路大神的gradle構建原始碼探究過程移步

巴神的Android 上為啥會有65536的限制,解釋下原因

參考:配置方法數超過 64K 的應用

相關文章