Java
Android
gradle
MultiDex

続・Multi-dex Support を使おう

More than 3 years have passed since last update.

前回の Multi-dex Support

はい。もうすでに以前書いた情報が古くなってしまったので、改めて書き直します。

Multi-dex Support が一体なんぞやというのは前回の記事を参照してください。

準備

maven にサポートライブラリがあるので、依存関係にそれを追加します。

compile 'com.android.support:multidex:1.0.0'

また、ビルドツールは新しいものにしておきましょう。21.1.0 以降で公式にサポートされます。

buildToolsVersion "21.1.1"

defaultConfigに以下を追記すると、Multi-dex Support が動作するようになります。

defaultConfig {
    multiDexEnabled true
}

Multi-dex ではビルドプロセスで相当量のメモリを食います。また、minSdkVersion が 20 以前の場合、preDexLibraries が使えなくなりますので、以下のようにdexOptionsを書きます。

dexOptions {
    preDexLibraries false
    javaMaxHeapSize "2g" // ヒープの最大を 2GB にする
}

MultiDexApplication

https://developer.android.com/reference/android/support/multidex/MultiDexApplication.html

独自に Application クラスを継承した Application クラスを持っていない場合は、AndroidManifest の <application>MultiDexApplicationを指定しましょう。

独自に Application クラスを持っている場合は、親を MultiDexApplication にするか、ないしは自分で実装を移植しましょう。

実装自体は至極単純です。

public class MyApp extends Application {
    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        MultiDex.install(this);
    }
}

Multi-dex Support において最初の dex に含めなければならないクラスの扱いはビルドツールがよしなにやってくれるようになったので、自分たちで定義ファイルを用意する必要はなくなりました。

ProductFlavor を活用する

AndroidRuntime を標準搭載している Lollipop では、デフォルトで Multi-dex APK が扱えるように作られています。ですので、Lollipop 向けの ProductFlavor を用意することで、ビルドプロセスの最適化が図られ、若干ビルド時間が改善します。

productFlavors {
    lollipop {
        minSdkVersion 21
    }
}

まとめ

Multi-dex Support を使う以外に、メソッド数上限を回避する方法にはこの記事にあるようなものもあります。
Google Play Services は6.5.87からドメイン毎に独立してつまみ食いできるようになりましたので、適宜組み合わせていくとよいでしょう。