Dalvik 65K methods limit
你很快就會(huì)遇到的,不過放心呆躲,multidexing
會(huì)幫助你捣卤。
什么是Dalvik 65K methods limit忍抽?我們知道八孝,我們寫完java code之后,dx tool會(huì)把java編譯的class文件再編譯成Dalivik虛擬機(jī)能識(shí)別的DEX文件鸠项,這個(gè)文件里最多能夠索引65536個(gè)method唆阿。關(guān)于這個(gè)有兩點(diǎn)要注意:
- 這些method是指能夠索引(reference)到的,而不是定義(define)
的锈锤。或者說闲询,如果你定義了一個(gè)方法久免,但這個(gè)方法并沒有被調(diào)用,那么就不算在內(nèi)扭弧。 - 這些method不僅僅是開發(fā)人員自己寫的阎姥,還包括所有第三方library里面的method。
索引是用一個(gè)鏈表結(jié)構(gòu)存儲(chǔ)的鸽捻,類型是short呼巴,short占2字節(jié),16位御蒲,2^16=65536衣赶,所以,我們總共可以索引65536
個(gè)方法厚满,包括自己寫的和引入第三方庫(kù)里的府瞄。
那么,我們?nèi)绾文芸焖僦牢覀兊腶pp里已經(jīng)有多少個(gè)method了呢碘箍?
- bash script: dex-method-counts遵馆。這個(gè)工具可以快速計(jì)算,并且提供一個(gè)清晰的視圖來閱讀丰榴。
- dex.sh by Jake Wharton货邓。這個(gè)工具由于采用了遞歸算法,所以耗時(shí)比較長(zhǎng)四濒。(Jake大神還寫了一篇有趣的分析文章Play Services 5.0 Is A Monolith Abomination换况,針對(duì)Play Services 5.0太大的問題進(jìn)行了分析,有空時(shí)我再翻譯下給各位峻黍。雖然Play Services 6.5已經(jīng)模塊化复隆,更加輕量級(jí)了)。
現(xiàn)在姆涩,既然我們已經(jīng)知道了自家app里的method數(shù)了挽拂,那么如何來處理這種情況呢?(官方做法骨饿、減少方法數(shù)亏栈、分包台腥、插件化、增大可容納的方法數(shù))
- Multidex绒北,官方提供的解決方案(這個(gè)jar包最低可以支持到API 4的版本黎侈,5.0及以上版本默認(rèn)支持),這篇文章里有詳細(xì)的使用方法闷游,此不贅述(使用Multidex support library)原理:將Multidex作為基本的dex峻汉,用它再去管理其他的dex。
-
ProGuardProGuard
可以把code里unnecessary的method移除脐往,壓縮apk休吠,當(dāng)然還有代碼混淆
的奇效。 - 使用H5文件代替一部分的邏輯代碼业簿。
- 再創(chuàng)建一個(gè)DEX File
瘤礁。把a(bǔ)pp里可以獨(dú)立的模塊或code提取出來,放到一個(gè)獨(dú)立的dex文件里梅尤,你可以使用Custom ClassLoader來加載這些類柜思,然后使用接口
或反射
來調(diào)用這些方法。不過巷燥,這個(gè)過程還是比較麻煩的赡盘。 - 插件化: https://github.com/singwhatiwanna/dynamic-load-apk
- 如果使用eclipse,可以在Project.proterty中配置一句話就Ok啦矾湃, dex.force.jumbo=true,應(yīng)該是暫時(shí)增大可容納的方法數(shù)亡脑,也就是說方法在增大,還是會(huì)遇到問題邀跃,具體不是很了解霉咨,請(qǐng)各位大神指教!