開発する時だけ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に追記
buildTypes {
debug {
...
multiDexEnabled true
...
}
...
}
(2) flavorを追加。名前はdraftにしたけど何でもよい。
productFlavors {
draft {
applicationId "${PACKAGE_NAME}.draft"
minSdkVersion 21 //Optimizing Multidex Builds
}
...
}
(3) メモリを食うらしいので javaMaxHeapSizeを2GBに。
dexOptions {
javaMaxHeapSize "2048M"
}
(4) multidexライブラリを読み込む。
dependencies {
...
debugCompile 'com.android.support:multidex:1.0.1'}
...
}
まとめると次のような build.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クラスを指定。
<application
android:name=".MainApplication"
... >
MainApplication.java
Application.attachBaseContext() メソッドで android.support.multidex.MultiDex.install(this); を実行する必要があるが、ReleaseビルドではMultiDexクラスがないので Product Flavorで切り替える。
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
public class MultiDexs {
public static void install(Application application) {
MultiDex.install(application);
}
}
app/src/release/java/.../MultiDexs.java
public class MultiDexs {
public static void install(Application application) {
//do nothing
}
}
ビルド時間
clean後の ビルド時間 | 2回目の ビルド時間 | 備考 | |
---|---|---|---|
draftDebug | 51秒 | 14秒 | Multidex minSdkVersion 21 |
stagingDebug | 33秒 | 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