Skip to content
On this page

📆 2015-10-30

開発のときだけMultidexにする

開発する時だけMultidexにしてみた。その時のメモ。 Lollipop以降のOSに限定すれば、Multidexにしてもビルド時間は長くならないようなので、その設定に落ち着いた。

状況

  • Debugビルドでだけ65kを超えた。
  • ReleaseビルドはProguardを使っていて、まだメソッド数に余裕があるので、Mutlidexにはしたくない。
  • ビルドが遅くなってしまうので、DebugビルドではProguardを使いたくない。
  • Lollipop以降はMultidexのビルドが速いらしい。

ということで、Debugビルドでだけ minSdkVersion 21 にしてMultidexを導入してみた。

Multidex導入

ここを参考に導入。 https://developer.android.com/intl/ja/tools/building/multidex.html#mdex-gradle

build.gradle

(1) multiDexEnabled true をbuildTypes.debugに追記

gradle
    buildTypes {
        debug {
            ...
            multiDexEnabled true
            ...
        }
        ...
    }

(2) flavorを追加。名前はdraftにしたけど何でもよい。

gradle
    productFlavors {
        draft {
            applicationId "${PACKAGE_NAME}.draft"
            minSdkVersion 21 //Optimizing Multidex Builds
        }
        ...
    }

(3) メモリを食うらしいので javaMaxHeapSizeを2GBに。

gradle
    dexOptions {
        javaMaxHeapSize "2048M"
    }

(4) multidexライブラリを読み込む。

gradle
dependencies {
    ...
    debugCompile 'com.android.support:multidex:1.0.1'}
    ...
}

まとめると次のような build.gradle になった。

gradle
android {
    compileSdkVersion 22
    buildToolsVersion 22.0.1

    defaultConfig {
        minSdkVersion 14
        targetSdkVersion 22
        ...
    }
    buildTypes {
        debug {
            ...
            multiDexEnabled true
            ...
        }
        release {
            ...
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            ...
        }
    }

    productFlavors {
        draft {
            applicationId "${PACKAGE_NAME}.draft"
            minSdkVersion 21 //Optimizing Multidex Builds
        }
        develop {
            applicationId "${PACKAGE_NAME}.develop"
        }
        staging {
            applicationId "${PACKAGE_NAME}.staging"
        }
        production {
            applicationId PACKAGE_NAME
        }
    }
    dexOptions {
        javaMaxHeapSize "2048M"
    }
}


dependencies {
    ...
    debugCompile 'com.android.support:multidex:1.0.1'}
    ...
}

使い分けは、

  • 開発時は draftDebug でビルドして Lollipop端末で確認
  • Lollipop以前のOSで確認する場合は、productionDebug、stagingDebug、developDebugのいづれかでビルド
  • リリース時は productionRelease でビルド

AndroidManifest.xml

Applicationクラスを指定。

xml
    <application
            android:name=".MainApplication"
            ... >

MainApplication.java

Application.attachBaseContext() メソッドで android.support.multidex.MultiDex.install(this); を実行する必要があるが、ReleaseビルドではMultiDexクラスがないので Product Flavorで切り替える。

java
public class MainApplication extends Application {
    ....
    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        if (BuildConfig.DEBUG) {
            MultiDexs.install(this);
        }
    }
    ....
}

app/src/debug/java/.../MultiDexs.java

java
public class MultiDexs {
    public static void install(Application application) {
        MultiDex.install(application);
    }
}

app/src/release/java/.../MultiDexs.java

java
public class MultiDexs {
    public static void install(Application application) {
        //do nothing
    }
}

ビルド時間

clean後の
ビルド時間
2回目の
ビルド時間
備考
draftDebug51秒14秒Multidex
minSdkVersion 21
stagingDebug33秒33秒Multidex
minSdkVersion 14
stagingDebug
※Multidex導入前
55秒17秒Not Multidex
minSdkVersion 14

draftDebugとMultidex導入前のstaginDebugはPreDexが効くので2回目以降のビルドが速いらしい。

参考

https://developer.android.com/intl/ja/tools/building/multidex.htmlhttp://qiita.com/KeithYokoma/items/579fb16bc6387e4f21d6

Released under the MIT License.