mixocial_04

[Android開發] 當 android app 中 method 數量超過 65k 就必須開啟 multiDexEnabled

當 app 中包含的 method 數量超過 65k,就必須啟用這個功能,這個時候每次build一次所花的時間都要3分鐘以上,非常之痛苦Orz…

1. multiDexEnabled 參數設定為 true

android {
    defaultConfig {
        ...
        multiDexEnabled true
        ...
    }
}

2. dependencies 設定

dependencies {
    ...
    compile 'com.android.support:multidex:1.0.0'
    ...
}

3. AndroidManifest.xml

3.1 如果你沒有寫自己的 Application class

<application
    ...
 android:name="android.support.multidex.MultiDexApplication">
    ...
</application>

3.2 如果你有寫自己的 Application class,Application必需繼承自 MultiDexApplication

public class DWApplication extends MultiDexApplication {
   ...
}

在 AndroidManifest.xml 中套用你自己的 Application

<application
    ...
 android:name=".Application.DWApplication">
    ...
</application>

 

2016/3/6更新:
因為速度實在太慢了,嚴重影響工作效率,實在不建議開啟這個功能,而是應該好好想方法把 method 降低到 65k 以下。所以後來我認真檢查了 gradle 中的 dependency 發現罪魁禍首就是…Google!

這是 Google Play Service API for Android 的 說明頁面
https://developers.google.com/android/guides/setup

現在 Google Play Service 最新版本已經到 8.4,你可以用以下方式加入所有 Google Play Service 的 library,但是這樣 method 數量肯定超過 65k。

compile 'com.google.android.gms:play-services:8.4.0'

一個有基本水平的 Android 開發者都知道,如果要讓 method 數量少一點,在使用 Google Play Service 的時候,絕對不能直接在 gradle 加上上面那行,而是要依照你所需要的功能,來選擇要加入的 Google Service API, 很慶幸的我還有那麼一點點基本水平,所以因為我只是想加個Admob廣告到我的APP,所以我在 gradle 加上的是下面這行:

compile 'com.google.android.gms:play-services-ads:8.4.0'

可惜的是,一加就超過…超過…超過…65k~!!!

最後,研究半天,我發現加入以下這版,應該是在不會超過65k的狀況下,又比較新的版本。6.5.87之後的版本都太肥了!

compile 'com.google.android.gms:play-services-ads:6.5.87'

2016/06/30更新

即使透過調整 Google Mobilde SDK 來減少方法數量,最後我的專案方法數依然超過了 65k,所以提供給大家另外一個處理的方法,Dynamic Load apk。概念上,就是透過將一個大專案,拆分成不同的小專案,每個小專案,都會 build 出自己的 apk 檔案。在實際執行 APP 程式的時候,會有一個「父APP」,透過「父APP」下載小專案所 build 出的「子APP」的 apk 檔案,當執行哪一個功能,就下載與那個功能相對應的「子APP」。

這樣做的好處:

  1. 加速程式啟動速度,避免過大的程式在執行的時候容易出現ANR的狀況(這也是原本的目的)
  2. 避開 65k 方法數的限制。因為每個小專案都拆開來,build 自己的 apk,因此方法數量就同時也被拆分開來

只是這個方法工程頗為浩大,所以我自己目前還沒有實際使用過。但是,看起來要避開 65k 的魔咒,最後還是必須走上這個不歸路阿~Orz..

 

Business vector designed by Freepik

標籤: , , ,

很愛畫虎爛的我,開始了用文章唬爛社會大眾的志業!