Android 突破64K方法數(shù)的限制

隨著安卓平臺的不斷發(fā)展與壯大左腔,市場上大而全的應(yīng)用比比皆是,產(chǎn)品需求的變更累積和UI交互的極致追求耀找,除了 resources 文件的俱增翔悠,在 Android Project 中依賴的 Library 和 自己寫的 Java 代碼也會越來越多业崖。這些變化,除了會導(dǎo)致打包出的 APK 文件越來越大之外蓄愁,當(dāng)項目中java代碼包含的方法數(shù)(method count)超出一個峰值時双炕。盡管在不同版本的編譯系統(tǒng)中顯示的錯誤內(nèi)容不盡相同,但都提到了一個具體的數(shù)字:65536撮抓,也就是本文要講到的核心內(nèi)容妇斤,Android 64K Method Counts Limit 的峰值。

Android 64K Method Counts Limit

Android Project 經(jīng)過編譯打包丹拯,其中的Java代碼(包括Library)轉(zhuǎn)化為DEX格式的字節(jié)碼文件站超,這是Android 5.0之前的Dalvik虛擬機(jī)決定的(5.0之后改為ART虛擬機(jī)),并且采用short類型引用DEX文件中的method乖酬,這也為method數(shù)量的峰值大小埋下了隱患死相。short類型能夠表示的最大值是65536,也就說單個DEX文件中最多只有65536個method能夠得到引用咬像,如果代碼執(zhí)行了超出部分的method引用算撮,自然會報錯,如methodNotFound等县昂。1K等于1024肮柜,65536剛好是64K,為了便于稱呼和使用倒彰,就將這個限制統(tǒng)稱為64K方法數(shù)的引用限制审洞。

為了解決64K方法數(shù)限制的問題,我們可以在項目中使用multidex配置待讳,當(dāng)項目中的方法數(shù)(包括:Android framework芒澜,library和我們自己寫的代碼)超過64K時,編譯系統(tǒng)會自動編譯出多個DEX文件耙箍。

Multidex Support

Android 5.0之前撰糠,安卓系統(tǒng)采用的是Dalvik虛擬機(jī),采用的是JIT技術(shù)(Just-in-time compilation辩昆,即時編譯,運行時編譯DEX字節(jié)碼文件旨袒,這也是以前為什么安卓手機(jī)用戶總是詬病Android系統(tǒng)比iOS系統(tǒng)運行卡頓的原因)汁针,限制每個APK文件只能包含一個DEX文件(即classes.dex)。為了繞開這個限制砚尽,Google給我們提供了multidex support library兼容包施无,幫助我們實現(xiàn)應(yīng)用程序加載多個DEX文件,并且這個兼容包作為程序的主DEX文件必孤,管理者其他DEX文件的訪問猾骡。

Android 5.0之后瑞躺,安卓系統(tǒng)改用了ART虛擬機(jī)(Android RunTime),采用的是OAT技術(shù)(Ahead-of-time兴想,預(yù)編譯幢哨,在應(yīng)用安裝的時候掃描應(yīng)用中的所有DEX文件,并編譯成一個.oat格式的文件供安卓設(shè)備執(zhí)行嫂便,所以相比Dalvik虛擬機(jī)下的應(yīng)用捞镰,安裝時間較長)。因此可以理解為毙替,使用ART虛擬機(jī)下的安卓系統(tǒng)自動支持APK文件中多個DEX的加載岸售。(注意:使用Instant Run時,如果項目中的minSdkVersion參數(shù)設(shè)為21或更高版本厂画,Android Studio編譯運行時會自動使應(yīng)用支持multidex凸丸。但I(xiàn)nstant Run僅僅作用于debug版本,我們依然需要給release版本配置multidex來避開64K方法數(shù)的限制袱院。)

Config for Multidex With Gradle

Android Gradle 插件在 Android SDK Build Tools 21.1 及更高版本的編譯工具上支持multidex作為編譯配置的一部分屎慢,所以確保我們的Android SDK Build Tools tools已經(jīng)更新至21.1或更高版本,然后再來配置應(yīng)用的multidex部分坑填。

第一步抛人,修改app/build.grale文件,使項目能夠使用multidex:


第二步脐瑰,修改AndroidManifest.xml文件妖枚,引用MultiDexApplication類,或者一般我們都是自定義繼承Application,此時就需要重寫attachBaseContext()方法苍在,并在該方法里面調(diào)用MultiDex.install(this)來支持multidex绝页。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市寂恬,隨后出現(xiàn)的幾起案子续誉,更是在濱河造成了極大的恐慌,老刑警劉巖初肉,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件酷鸦,死亡現(xiàn)場離奇詭異,居然都是意外死亡牙咏,警方通過查閱死者的電腦和手機(jī)臼隔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來妄壶,“玉大人摔握,你說我怎么就攤上這事《〖模” “怎么了氨淌?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵泊愧,是天一觀的道長。 經(jīng)常有香客問我盛正,道長删咱,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任蛮艰,我火速辦了婚禮腋腮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘壤蚜。我一直安慰自己即寡,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布袜刷。 她就那樣靜靜地躺著聪富,像睡著了一般。 火紅的嫁衣襯著肌膚如雪著蟹。 梳的紋絲不亂的頭發(fā)上墩蔓,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天,我揣著相機(jī)與錄音萧豆,去河邊找鬼奸披。 笑死,一個胖子當(dāng)著我的面吹牛涮雷,可吹牛的內(nèi)容都是我干的阵面。 我是一名探鬼主播,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼洪鸭,長吁一口氣:“原來是場噩夢啊……” “哼样刷!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起览爵,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤置鼻,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后蜓竹,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體箕母,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年俱济,在試婚紗的時候發(fā)現(xiàn)自己被綠了司蔬。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡姨蝴,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出肺缕,到底是詐尸還是另有隱情左医,我是刑警寧澤授帕,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站浮梢,受9級特大地震影響跛十,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜秕硝,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一芥映、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧远豺,春花似錦奈偏、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至棺滞,卻和暖如春裁蚁,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背继准。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工枉证, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人移必。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓室谚,卻偏偏與公主長得像,于是被迫代替她去往敵國和親避凝。 傳聞我的和親對象是個殘疾皇子舞萄,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容