詮釋Android開發(fā)時(shí)報(bào)64K或65536錯(cuò)誤問題

相信一位有經(jīng)驗(yàn)的安卓開發(fā)人員,都會(huì)遇到過以下錯(cuò)誤<如果你還沒遇到類似情況,要么你是高手,要么就是你的開發(fā)經(jīng)驗(yàn)還沒到觸發(fā)這種情況的條件>

android_64k.png

上圖中的錯(cuò)誤主要是由于我們打包后classes.dex文件里方法數(shù)量超出的65536個(gè)
Google官方文檔:https://developer.android.com/intl/zh-cn/tools/building/multidex.html

問題:那這個(gè)65536倒底是怎么計(jì)算的了?

有兩種說法

  • 項(xiàng)目工程的方法總和<包括library>
  • 方法引用次數(shù)的總和
    第一種是目前大部分網(wǎng)上的說法;第二種是本人聽說的<但當(dāng)時(shí)很是疑惑>

1.項(xiàng)目工程的方法總和<包括library>

這種說法并沒有說錯(cuò),但不完全對,為什么了,如果你什么都不做的話,正常編譯打包確實(shí)是可以按照這種說法來進(jìn)行計(jì)算,但肯定我們還是可以做點(diǎn)什么的?<后話>

2.方法引用次數(shù)的總和

這種說法如果單獨(dú)拿出來講,基本是錯(cuò)的,為什么?
我們想想,引用次數(shù),也就是調(diào)用次數(shù),那意思是說,我只要調(diào)用方法的次數(shù)超出了65536次,那是不是就會(huì)報(bào)出65536的限制問題了了?
答:No,本人測試過;測試方法很簡單:
1.寫個(gè)方法;
2.然后用for循環(huán)<循環(huán)次數(shù)肯定是大于65536的>,每次循環(huán)調(diào)用同一個(gè)方法,編譯后,安然無樣;
3.for循環(huán)后我不死心,遞歸,編譯后,安然無樣,所以說這種說法站不穩(wěn)腳.

正確的計(jì)算方法

本人經(jīng)過各種測試,測試過程就不說了,得出了幾個(gè)結(jié)論

  1. 兩種說法單獨(dú)拿出來說都不算對
  2. 說法1比說法2要靠譜一點(diǎn)
  3. 兩種說法相結(jié)合,才算是完美的答案

下面分析情況來說明計(jì)算方法
關(guān)鍵:是否混淆

  • 無混淆

    當(dāng)你的工程在編譯的時(shí)候沒有采取任何混淆措施,那么計(jì)算方式參考說法1

  • 有混淆

    當(dāng)你的工程在編譯的時(shí)候采取了混淆措施,那么計(jì)算方式如果按說法2來講,并不對,應(yīng)該是:程序中被使用/調(diào)用的方法數(shù)量的總和

情景說明

看完上面后基本就說完了,但對于有混淆的情況時(shí),要知道幾點(diǎn)
情景一
有一個(gè)類 class A,里面有10個(gè)方法,但整個(gè)工程中用到了class A中的某一個(gè)方法,這時(shí)如果你的工程采用了混淆,那么class A中其余的9個(gè)方法并不會(huì)統(tǒng)計(jì)進(jìn)去
情景二
有一個(gè)接口 interface A,里面有10個(gè)方法,然后有一個(gè)實(shí)現(xiàn)類class B;

如果你整個(gè)工程中是調(diào)用了class B里的某一個(gè)方法或某幾個(gè)方法,那么情況和<情景一>一樣,代碼是么寫的:

B b = new B();
b.xxx();

如果你是采用的多態(tài)的形式編寫的代碼,類似寫法:

A a = new B();
a.xxx();

那么方法數(shù)量是interface A 與 class B 里面被調(diào)用的那些方法之和,通俗的講就是調(diào)用的這個(gè)方法要當(dāng)兩個(gè)來計(jì)算

總結(jié)

  • 用混淆來盡量讓64k的錯(cuò)誤晚點(diǎn)到來
  • 少用多態(tài)的寫法來避免同一方法被重復(fù)核算
  • 在不必要的情況下,盡量把邏輯寫在一個(gè)方法中
  • 同樣的操作抽出成基類,在基類中統(tǒng)一實(shí)現(xiàn)
  • 不要沒事就重寫父類的方法,主要表現(xiàn)在Activity與Fragment中的生命周期方法
  • 如果你的app最低只兼容到4.0,Fragment就可以不用v4包中的
  • 一句話:能不用兼容包的就不要用兼容包的,引入jar或library工程時(shí)注意下它們的方法數(shù)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末报咳,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子买乃,更是在濱河造成了極大的恐慌嘱蛋,老刑警劉巖千康,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件戒劫,死亡現(xiàn)場離奇詭異传透,居然都是意外死亡凄敢,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進(jìn)店門庸追,熙熙樓的掌柜王于貴愁眉苦臉地迎上來霍骄,“玉大人,你說我怎么就攤上這事淡溯《琳” “怎么了?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵咱娶,是天一觀的道長绘沉。 經(jīng)常有香客問我煎楣,道長,這世上最難降的妖魔是什么车伞? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮喻喳,結(jié)果婚禮上另玖,老公的妹妹穿的比我還像新娘。我一直安慰自己表伦,他們只是感情好谦去,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蹦哼,像睡著了一般鳄哭。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上纲熏,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天妆丘,我揣著相機(jī)與錄音,去河邊找鬼局劲。 笑死勺拣,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的鱼填。 我是一名探鬼主播药有,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼苹丸!你這毒婦竟也來了愤惰?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤赘理,失蹤者是張志新(化名)和其女友劉穎宦言,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體感憾,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蜡励,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了阻桅。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片凉倚。...
    茶點(diǎn)故事閱讀 40,117評論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖嫂沉,靈堂內(nèi)的尸體忽然破棺而出稽寒,到底是詐尸還是另有隱情,我是刑警寧澤趟章,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布杏糙,位于F島的核電站慎王,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏宏侍。R本人自食惡果不足惜赖淤,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望谅河。 院中可真熱鬧咱旱,春花似錦、人聲如沸绷耍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽褂始。三九已至诸典,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間崎苗,已是汗流浹背狐粱。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留益缠,地道東北人脑奠。 一個(gè)月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像幅慌,于是被迫代替她去往敵國和親宋欺。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,060評論 2 355

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,180評論 25 707
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法胰伍,類相關(guān)的語法齿诞,內(nèi)部類的語法,繼承相關(guān)的語法骂租,異常的語法祷杈,線程的語...
    子非魚_t_閱讀 31,643評論 18 399
  • 倚山林外 坐彈三點(diǎn)滴 樓臺(tái)下 你我記憶猶新
    沐_子閱讀 247評論 0 1
  • 可惜沒有如果 如果有吻別, 也算僅有的溫存渗饮。 床有余香但汞,沒有了溫度。 蘭州下雪了互站,卻一眼灰蒙私蕾。 就像說,立春了胡桃,跟...
    王兄保重閱讀 137評論 0 1
  • 影片的結(jié)尾,徐太宇對林真心說:好久不見容贝!那一刻自脯,看著眼前的這個(gè)少年,已然歸來斤富,耳邊響起了田馥甄的小幸運(yùn)膏潮,你是我最想...
    依然sir閱讀 605評論 2 10