[Android] MultiDex

因為前陣子的程式做了重構,加入了 RxJava 相關函式庫,導致 App 內的 Method 總數超過 64435 個,導致 App 無法編譯,於是參考 Google 建議的做法,解決這個問題。
在 App 層級的 build.gradle 加入 multiDexEnabled true
android {
    compileSdkVersion 21
    buildToolsVersion "21.1.0"

    defaultConfig {
        ...
        minSdkVersion 14
        targetSdkVersion 21
        ...

        // Enabling multidex support.
        multiDexEnabled true
    }
    ...
}
如果 App 支援 Android 4.x 的話,要額外做以下的步驟,否則會出現以下的錯誤。
Exception java.lang.NoClassDefFoundError: rx.plugins.RxJavaHooks
rx.Observable.create (Observable.java:98)
retrofit2.adapter.rxjava.RxJavaCallAdapterFactory$SimpleCallAdapter.adapt (RxJavaCallAdapterFactory.java:233)
retrofit2.adapter.rxjava.RxJavaCallAdapterFactory$SimpleCallAdapter.adapt (RxJavaCallAdapterFactory.java:219)
retrofit2.Retrofit$1.invoke (Retrofit.java:147)
首先要引用 Multidex 函式庫
compile 'com.android.support:multidex:1.0.1'
然後,在 Application class 要改成繼承 MultiDexApplication
public class BaseApplication extends MultiDexApplication {
...
}
如果 Application 已繼承自定的方法,也可以直接覆寫 attachBaseContext 方法
@Override 
protected void attachBaseContext(Context base) {
    super.attachBaseContext(base); 
    MultiDex.install(this);
}

結語

Android 的第三方函式庫固然好用,畢竟不用自己造輪子,可是用多了第三方函式庫的話,很容易超過 Android 64K 方法數的限制。即便用了 MultiDex 突破 64K 方法數的限制,可是 MultiDex 可能會有 App 啟動時間過長的問題,在使用前還是事先要評估一下,拿掉不必要的第三方函式庫,也許才是正解。

參考資料


相關文章

如何將電腦畫面經由 Chromecast 投放到電視螢幕上

Mac與Android裝置傳輸檔案的方法

Chrome 的檔案續傳功能

使用 Line Bot API 製作聊天機器人