ANDROID分包總結(jié)

本篇文章主要是對(duì)產(chǎn)品項(xiàng)目6.5.0版本的分包處理及總結(jié)墓卦。先附上在處理過程中查閱的一些博客及資料:

騰訊Bugly dex分包變形記

Android Dex分包之旅

android 官方文檔

1枚粘、背景

由于6.5.0版本加入了大量的需求,導(dǎo)致項(xiàng)目方法數(shù)超過了65536個(gè)际长,項(xiàng)目無法正常編譯,在加入官方分包方法后解決了單個(gè)dex過大的問題兴泥,但又發(fā)現(xiàn)在Android3.0以下手機(jī)出現(xiàn)INSTALL_FAILED_DEXOPT安裝失敗工育。然后這時(shí)才意識(shí)到分包的影響很大,慌忙查閱資料試圖解決此問題搓彻,然后才發(fā)現(xiàn)這上面的一個(gè)個(gè)的坑如绸。

方法數(shù)超了的直觀體現(xiàn)是,編譯時(shí)報(bào)如下異常:

TROUBLE WRITING OUTPUT: TOO MANY METHOD REFERENCES: 70048; MAX IS 65536.

或者

UNEXPECTED TOP-LEVEL EXCEPTION: JAVA.LANG.ILLEGALARGUMENTEXCEPTION: METHOD ID NOT IN [0, 0XFFFF]: 65536

此時(shí)如果添加官方的分包方法旭贬,編譯問題得到解決怔接,但是正式打包安裝時(shí)會(huì)出現(xiàn)INSTALL_FAILED_DEXOPT問題導(dǎo)致無法安裝。

INSTALL_FAILED_DEXOPT問題的原因稀轨,從根本上分析扼脐,主要有2個(gè):

單個(gè)dex文件方法總數(shù)65536的限制

Dexopt的LinearAlloc限制

65536限制

這是由于Dex文件對(duì)于方法索引是用一個(gè)short類型的數(shù)據(jù)來存放的.而short的最大值是65535,因此當(dāng)項(xiàng)目足夠大包含方法數(shù)目足夠多超過了65535(包括引用的外部Lib里面的所有方法)

LinearAlloc限制

LinearAlloc 主要用來管理 Dalvik 中 class 加載時(shí)的內(nèi)存,就是讓 App 在執(zhí)行時(shí)減少系統(tǒng)內(nèi)存的占用奋刽。在 App 的安裝過程中瓦侮,系統(tǒng)會(huì)運(yùn)行一個(gè)名為 dexopt 的程序?yàn)樵搼?yīng)用在當(dāng)前機(jī)型中運(yùn)行做準(zhǔn)備。dexopt 使用 LinearAlloc 來存儲(chǔ)應(yīng)用的方法信息杨名。App 在執(zhí)行前會(huì)將 class 讀進(jìn) LinearAlloc 這個(gè) buffer 中脏榆,這個(gè) LinearAlloc 在 Android 2.3 之前是 4M 或 5M ,到 4.0 之后變?yōu)?8M 或 16M台谍。因?yàn)?5M 實(shí)在是太小了须喂,可能還沒有 65536 就已經(jīng)超過 5M 了吁断,什么意思呢,就是只有一個(gè)包的情況下也有可能出現(xiàn) INSTALL_FAILED_DEXOPT 坞生,原因就在于 LinearAlloc仔役。

2、解決65536及LinearAlloc限制

按照官方MultiDex方式配置實(shí)現(xiàn):

通過在defaultConfig節(jié)中設(shè)置multiDexEnabled標(biāo)簽為true是己,開啟multi-dex支持.

在項(xiàng)目的build.gradle文件的dependencies 節(jié)中添加分包設(shè)置:

代碼中加入支持Multidex的功能又兵,有三種方案實(shí)現(xiàn),此處只列一種卒废,重寫的Application中加入:

通過上述可解決方法數(shù)的問題沛厨,但是打包出的dex可能還是過大,無法安裝摔认。

通過如下方式逆皮,設(shè)置每個(gè)dex的最大方法數(shù)–set-max-idx-number=,可以解決LinearAlloc限制:

3参袱、存在的問題

雖然上述的方法可以解決問題电谣,但還是會(huì)留下很多的坑。

1抹蚀、啟動(dòng)時(shí)間變長(zhǎng)剿牺,容易黑屏或ANR

2、NoClassDefFoundError異常

3环壤、不知道哪些文件該放在主dex文件中

第一個(gè)是因?yàn)榉殖啥鄠€(gè)dex文件之后晒来,除主dex外的從dex(dex2、dex3)太大加載比較耗時(shí)導(dǎo)致郑现;第二個(gè)是由于啟動(dòng)引用的class打包時(shí)不在主dex文件中潜索,所有class文件找不到;為了解決class not found問題需要將所有啟動(dòng)時(shí)的類都要放到主dex文件中懂酱,這又是一個(gè)比較難解決的問題,因?yàn)槲募嗔恕?/p>

4誊抛、最后總結(jié)

鑒于發(fā)版在即列牺,暫時(shí)無法做到完美。

本次的解決方案:先按照官方分包方式拗窃,保證從dex比較小瞎领,主dex比較大,這樣避免啟動(dòng)ANR及Crash問題随夸,但缺點(diǎn)是3.0以下手機(jī)無法正常安裝(3.0以下LinearAlloc限制問題)九默。

后續(xù)解決方案:將項(xiàng)目中百川sdk和一元奪寶模塊移除作為插件apk加載,這樣減少主apk的方法數(shù)宾毒,從而達(dá)到解決方法數(shù)及3.0限制問題驼修。插件化的實(shí)現(xiàn)方案目前在研究360助手的方式,后續(xù)實(shí)現(xiàn)完成后會(huì)繼續(xù)分享。

上述主要是記錄本次分包原因乙各、過程及最終選擇的方案墨礁,具體細(xì)節(jié)的分包原理及解析大家可以看下開頭的資料及網(wǎng)上查閱,此處不做細(xì)節(jié)述說耳峦。

PS:5月25日嘗試將百川sdk和奪寶移到插件項(xiàng)目中發(fā)現(xiàn)即使這樣在2.3以下手機(jī)上依然安裝不了恩静,所以通過插件話方式暫時(shí)也無法解決。繼續(xù)嘗試分包方式蹲坷。

PS:5月26日嘗試分包處理驶乾,通過設(shè)置每個(gè)dex的最大方法數(shù)(48000)打包后可安裝到2.3及以下手機(jī),而且通過測(cè)試幾部手機(jī)暫時(shí)未發(fā)現(xiàn)啟動(dòng)ANR和Crash現(xiàn)象(包括2.3手機(jī))循签,暫時(shí)這樣處理级乐,后續(xù)再添加maindexlist文件。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末懦底,一起剝皮案震驚了整個(gè)濱河市唇牧,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌聚唐,老刑警劉巖丐重,帶你破解...
    沈念sama閱讀 217,509評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異杆查,居然都是意外死亡扮惦,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門亲桦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來崖蜜,“玉大人,你說我怎么就攤上這事客峭≡チ欤” “怎么了?”我有些...
    開封第一講書人閱讀 163,875評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵舔琅,是天一觀的道長(zhǎng)等恐。 經(jīng)常有香客問我,道長(zhǎng)备蚓,這世上最難降的妖魔是什么课蔬? 我笑而不...
    開封第一講書人閱讀 58,441評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮郊尝,結(jié)果婚禮上二跋,老公的妹妹穿的比我還像新娘。我一直安慰自己流昏,他們只是感情好扎即,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評(píng)論 6 392
  • 文/花漫 我一把揭開白布吞获。 她就那樣靜靜地躺著,像睡著了一般铺遂。 火紅的嫁衣襯著肌膚如雪衫哥。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,365評(píng)論 1 302
  • 那天襟锐,我揣著相機(jī)與錄音撤逢,去河邊找鬼。 笑死粮坞,一個(gè)胖子當(dāng)著我的面吹牛蚊荣,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播莫杈,決...
    沈念sama閱讀 40,190評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼互例,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了筝闹?” 一聲冷哼從身側(cè)響起媳叨,我...
    開封第一講書人閱讀 39,062評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎关顷,沒想到半個(gè)月后糊秆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,500評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡议双,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評(píng)論 3 335
  • 正文 我和宋清朗相戀三年痘番,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片平痰。...
    茶點(diǎn)故事閱讀 39,834評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡汞舱,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出宗雇,到底是詐尸還是另有隱情昂芜,我是刑警寧澤,帶...
    沈念sama閱讀 35,559評(píng)論 5 345
  • 正文 年R本政府宣布赔蒲,位于F島的核電站说铃,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏嘹履。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評(píng)論 3 328
  • 文/蒙蒙 一债热、第九天 我趴在偏房一處隱蔽的房頂上張望砾嫉。 院中可真熱鬧,春花似錦窒篱、人聲如沸焕刮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽配并。三九已至括荡,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間溉旋,已是汗流浹背畸冲。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留观腊,地道東北人邑闲。 一個(gè)月前我還...
    沈念sama閱讀 47,958評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像梧油,于是被迫代替她去往敵國(guó)和親苫耸。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評(píng)論 2 354

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,111評(píng)論 25 707
  • 最近項(xiàng)目apk方法數(shù)即將達(dá)到65536上限儡陨,雖然通過瘦身減少了一些方法數(shù)褪子,但是隨著更多sdk的接入,終究還是避免不...
    the_q閱讀 16,468評(píng)論 6 39
  • 為什么需要對(duì)Dex進(jìn)行分包 Android在安裝應(yīng)用的過程中骗村,系統(tǒng)會(huì)運(yùn)行一個(gè)名為DexOpt的程序?yàn)樵搼?yīng)用在當(dāng)前機(jī)...
    Boreas_su閱讀 4,288評(píng)論 0 9
  • 引言 如果App引用的庫(kù)太多嫌褪,方法數(shù)超過65536后無法編譯。這是因?yàn)閱蝹€(gè)dex里面不能有超過65536個(gè)方法叙身。為...
    喜歡丶下雨天閱讀 10,212評(píng)論 2 20
  • 每每捧起一卷古書,最讓我向往的是這樣一種生活:身著一襲長(zhǎng)衫财忽,手持一柄折扇倘核,一躺椅,一卷書即彪,一杯茶... 愜意而又舒...
    良心冷性閱讀 802評(píng)論 0 1