64K 方法數(shù)也被稱為65K方法數(shù)問(wèn)題,本質(zhì)上都是指Android Dalvik 可執(zhí)行文件.dex 中的Java方法數(shù)引用超過(guò)65536,64K的計(jì)算方法是65536除以1024,65K的計(jì)算方法是65536除以1000,Android 官方的叫法是64K。
Android Apk 文件本質(zhì)上是一個(gè)壓縮文件,它里面包含的classs.dex 文件是可執(zhí)行的Dalvik 字節(jié)碼文件,這個(gè).dex文件中存放的是所有編譯后的Java 代碼。Dalvik 可執(zhí)行文件規(guī)范限制了(事實(shí)上最初設(shè)計(jì)上的一個(gè)失誤)單個(gè).dex文件最多能引用的方法數(shù)是65536個(gè),這其中包含了Android Framework、App 引用的第三方函數(shù)庫(kù)以及App自身的方法。
Android 5.0(api 21)之前,系統(tǒng)使用的是Dalvik 虛擬機(jī)來(lái)執(zhí)行Android 應(yīng)用,默認(rèn)情況下,Dalvik為每個(gè)Apk 只生成一個(gè)classes.dex 文件,為了規(guī)避單個(gè).dex 文件方法數(shù)超過(guò)64K 的問(wèn)題,我們需要拆分這個(gè)單一的classes.dex 文件,拆分后可能存在類似于classes.dex、classes2.dex、classes3.dex 等多個(gè).dex 文件,具體有多少個(gè)需要看開發(fā)者的配置以及應(yīng)用的總方法數(shù),在應(yīng)用啟動(dòng)時(shí),會(huì)先加載classes.dex 文件,我們稱之為主(Primary)dex文件,應(yīng)用啟動(dòng)后才會(huì)依次加載其他的.dex 文件,這些統(tǒng)稱為(Secondary)dex文件。為了規(guī)避64K限制,Google 推出了一個(gè)名為MultiDex Support Library 的函數(shù)庫(kù),當(dāng)我們下載了Android Support Libraries 之后,可以在/extras/android/support/multidex/目錄中找到這個(gè)函數(shù)庫(kù)。
5.0 開始,Android 使用名為ART 的虛擬機(jī)來(lái)代碼Dalvik 虛擬機(jī),ART 天然支持從APK 中加載多個(gè).dex 文件,在應(yīng)用的安裝期間,它會(huì)執(zhí)行一個(gè)預(yù)編譯操作,掃描Apk 中的classes(..N).dex 文件并將它們編譯成一個(gè)單一的.oat 文件,在應(yīng)用運(yùn)行時(shí)去加載這個(gè).dex 文件,而不是一個(gè)一個(gè)的加載.dex 文件。
當(dāng)你的App 開始接觸碰到64K 方法數(shù)的天花板時(shí),并不建議立即使用MultiDex Support Library 來(lái)將apk 中的單一的.dex 文件拆分成多個(gè),從而規(guī)避64K 方法數(shù)限制引起的編譯錯(cuò)誤問(wèn)題。
最佳的實(shí)踐是永遠(yuǎn)保持應(yīng)用的方法不超過(guò)64K,永遠(yuǎn)沒(méi)有機(jī)會(huì)使用MultiDex Support Library ,因?yàn)槭褂肕ultiDex 是下下策,在大多數(shù)情況下會(huì)降低應(yīng)用的性能,這個(gè)后面會(huì)說(shuō)的。因此,我們有必要先來(lái)了解哪些方法可以將應(yīng)用的方法數(shù)降低到64K 一下。
1、檢查硬的直接和間接第三方庫(kù)
2、使用Proguard 移除無(wú)用的代碼
這個(gè)不多說(shuō),參考官方文檔