Java
Android
AndroidStudio

DexIndexOverflowExceptionと戦った話

More than 3 years have passed since last update.

Android Studioでビルドした時に、
com.android.dex.DexIndexOverflowException: method ID not in [0, 0xffff]: 65536
っていうが出て困った。

なんとか解決したので、メモ

参考

手順

Android Studioのアップデート

Canaryチャンネルから最新版をダウンロードする

studio_update_1.png

studio_update_2.png

ここでCanaryチャンネルを選択する

studio_update_3.png

ここまで行ってから、再度「Check for Update」を選択するとAndroid Studioのアップデートが行えるようになる。

2014年11月16日の時点では0.9.3が最新版となる

studio_update_4.png

Gradleのアップデート

Android Studioをアップデートすれば、勝手にGradleはアップデートしてくれる

gradle-wrapper.propertiesのdistributionUrlgradle-2.1-all.zipが指定してあれば良い

gradle-wrapper.properties
distributionUrl=https\://services.gradle.org/distributions/gradle-2.1-all.zip

Android Gradle Pluginのアップデート

gradle-2.1を使うためにはAndroid Gradle Pluginをアップデートする必要がある
build.gradleで0.14.+が指定してあれば良い

build.gradle
dependencies {
    classpath 'com.android.tools.build:gradle:0.14.+'
}

build.gradleの変更

build.gradle
// 最新のbuildToolsを指定
buildToolsVersion '21.1.1'
defaultConfig {     
    // 追加
    multiDexEnabled true
}
dependencies {
    // 追加
    compile 'com.android.support:multidex:1.0.0'
}

applicationの修正

例えばApp.javaなどの

<application
    android:name=".App" ...

のようにAndroidManifest.xmlのapplicationに指定しているjavaファイルで
継承しているandroid.app.Applicationandroid.support.multidex.MultiDexApplicationに変更し、
attachBaseContextOverrideする

App.java
public class App extends MultiDexApplication {
    ...

    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        MultiDex.install(this);
}

これでとりあえず出来た。

必要無さそう

build.gradle
afterEvaluate {
    tasks.matching {
        it.name.startsWith('dex')
    }.each { dx ->
        if (dx.additionalParameters == null) {
            dx.additionalParameters = []
        }
        dx.additionalParameters += '--multi-dex'

        // this is optional
        // dx.additionalParameters += "--main-dex-list=$projectDir/multidex.keep".toString()
    }
}
dexOptions {
    preDexLibraries = false
}

としてみたり、いろいろやったが、最終的にこの辺りを削除しても問題なかった

所感

もっと良い解決策ありそう