解決Android方法數(shù)超出限定的問題(有關(guān)multiDex锤躁,jumboMode的解釋)

在Android項(xiàng)目中引入過多的jar會(huì)出現(xiàn)錯(cuò)誤:

android.dex.DexIndexOverflowException: Cannot merge new index xxxx into a non-jumbo instruction!

這個(gè)錯(cuò)誤出現(xiàn)的原因是 Android設(shè)定的方法數(shù)是65536個(gè)(DEX 64K problem)涯呻,超過這個(gè)方法數(shù)黍翎,導(dǎo)致dex無法生成面徽,就無法生成APK.

限制原因:早期的Dalvik VM內(nèi)部使用short類型變量來標(biāo)識(shí)方法的id,就有了 最大方法數(shù)的限制65536。

解決方法:

  • 刪除不用的方法趟紊,刪除不使用的jar
    項(xiàng)目維護(hù)時(shí)間長了氮双,里面會(huì)出現(xiàn)不再使用的類和不再使用的方法,建議集中清理下霎匈,把不再使用的方法戴差,不再使用的類都清除,這樣的好處是代碼也干凈了铛嘱,如果方法數(shù)超出的不是太多的話通過清理就可以讓方法數(shù)減少到65536以下暖释,一般來說jar里面的方法數(shù)最好,清除一兩個(gè)無用的jar包就能大大的減少方法數(shù)墨吓。

  • 分包
    通過在defaultConfig中設(shè)置multiDexEnabled可以開啟分包模式饭入,分包之后的Dex就低于了限制數(shù),保證了正常的打包肛真。

defaultConfig {
    multiDexEnabled=true
}
  • 忽略方法數(shù)限制的檢查
android.dexOptions {
    jumboMode = true
}

設(shè)置dexOptions的,不做方法數(shù)限制的檢查爽航,這樣做的缺點(diǎn)是apk無法再低版本的設(shè)備上面安裝蚓让,會(huì)出現(xiàn)錯(cuò)誤:

INSTALL_FAILED_DEXOPT

關(guān)于dexoptionsjumboMode在stackoverflow中有一段解釋,我翻譯一下:

In the standard java world:

  • When you compile standard java code : the compiler produce *.class file. A *.class file contains standard java bytecode that can be executed on a standard JVM.

  • 在標(biāo)準(zhǔn)Java的世界
    當(dāng)你編譯java代碼時(shí)讥珍,編譯器生成.class文件历极。.class文件包含了java的字節(jié)碼。這些字節(jié)碼在JVM中執(zhí)行衷佃。

In the Android world:

  • It is different. You use the java language to write your code, but the compiler don't produce *.class files, it produce *.dex file. A *.dex file contains bytecode that can be executed on the Android Virtual Machine (dalvik) and this is not a standard Java Virtual Machine.
    To be clear: a dex file in android is the equivalent of class in standard java.
    So dexoptions is a gradle object where some options to configure this java-code-to-android-bytecode transformation are defined. The options configured via this object are :
    • targetAPILevel
    • force-jumbo mode (when enabled it allows a larger number of strings in the dex files)

在安卓的世界則不同:

  • 你用java語音寫安卓的代碼趟卸,但是編譯器生成的是.dex文件,不是.java文件氏义。.dex文件包含了在Android虛擬機(jī)中可以執(zhí)行的字節(jié)碼锄列,而不是JVM。所以.dex文件的作用和標(biāo)準(zhǔn)Java中的.class文件差不多惯悠。
    dexoptions是一個(gè)gradle對(duì)象邻邮,這個(gè)對(duì)象用來設(shè)置從java代碼向.dex文件轉(zhuǎn)化的過程中的一些配置選項(xiàng)。其中一個(gè)就是force-jumbo mode克婶。force-jumbo mode允許你創(chuàng)建更大的.dex文件筒严。

參考資料:

  1. https://segmentfault.com/a/1190000004187484
  2. https://stackoverflow.com/questions/24224186/what-is-dex-in-gradle/24224385#24224385
  3. http://google.github.io/android-gradle-dsl/current/com.android.build.gradle.internal.dsl.DexOptions.html
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市情萤,隨后出現(xiàn)的幾起案子鸭蛙,更是在濱河造成了極大的恐慌,老刑警劉巖筋岛,帶你破解...
    沈念sama閱讀 212,816評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件娶视,死亡現(xiàn)場離奇詭異,居然都是意外死亡泉蝌,警方通過查閱死者的電腦和手機(jī)歇万,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門揩晴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人贪磺,你說我怎么就攤上這事硫兰。” “怎么了寒锚?”我有些...
    開封第一講書人閱讀 158,300評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵劫映,是天一觀的道長。 經(jīng)常有香客問我刹前,道長泳赋,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,780評(píng)論 1 285
  • 正文 為了忘掉前任喇喉,我火速辦了婚禮祖今,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘拣技。我一直安慰自己千诬,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評(píng)論 6 385
  • 文/花漫 我一把揭開白布膏斤。 她就那樣靜靜地躺著徐绑,像睡著了一般。 火紅的嫁衣襯著肌膚如雪莫辨。 梳的紋絲不亂的頭發(fā)上傲茄,一...
    開封第一講書人閱讀 50,084評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音沮榜,去河邊找鬼盘榨。 笑死,一個(gè)胖子當(dāng)著我的面吹牛蟆融,可吹牛的內(nèi)容都是我干的较曼。 我是一名探鬼主播,決...
    沈念sama閱讀 39,151評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼振愿,長吁一口氣:“原來是場噩夢啊……” “哼捷犹!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起冕末,我...
    開封第一講書人閱讀 37,912評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤萍歉,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后档桃,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體枪孩,經(jīng)...
    沈念sama閱讀 44,355評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,666評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蔑舞。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拒担。...
    茶點(diǎn)故事閱讀 38,809評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖攻询,靈堂內(nèi)的尸體忽然破棺而出从撼,到底是詐尸還是另有隱情,我是刑警寧澤钧栖,帶...
    沈念sama閱讀 34,504評(píng)論 4 334
  • 正文 年R本政府宣布低零,位于F島的核電站,受9級(jí)特大地震影響拯杠,放射性物質(zhì)發(fā)生泄漏掏婶。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,150評(píng)論 3 317
  • 文/蒙蒙 一潭陪、第九天 我趴在偏房一處隱蔽的房頂上張望雄妥。 院中可真熱鬧,春花似錦依溯、人聲如沸茎芭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至壹粟,卻和暖如春拜隧,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背趁仙。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評(píng)論 1 267
  • 我被黑心中介騙來泰國打工洪添, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人雀费。 一個(gè)月前我還...
    沈念sama閱讀 46,628評(píng)論 2 362
  • 正文 我出身青樓干奢,卻偏偏與公主長得像,于是被迫代替她去往敵國和親盏袄。 傳聞我的和親對(duì)象是個(gè)殘疾皇子忿峻,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,724評(píng)論 2 351

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,867評(píng)論 25 707
  • afinalAfinal是一個(gè)android的ioc,orm框架 https://github.com/yangf...
    passiontim閱讀 15,412評(píng)論 2 45
  • 在媳婦老家又看到了美麗的星空 灌腸真難吃都是面 兩個(gè)侄子真2
    左右逢石閱讀 241評(píng)論 0 0
  • 序 這是一個(gè)關(guān)于麻城的系列作品辕羽,我所取人 物逛尚、環(huán)境、故事線索刁愿,皆能在這個(gè)荒涼的小 鎮(zhèn)...
    傅立東閱讀 543評(píng)論 1 1
  • 兩年后回來寫續(xù)集绰寞,順便改了標(biāo)題 2016.3.28 分手第一天去跑了15公里,接著又馬不停蹄練了1個(gè)小時(shí)hiit....
    hffbnkkhnm閱讀 1,004評(píng)論 0 0