petitviolet blog

    DexIndexOverflowExceptionと戦った話

    2014-11-16

    QiitaJavaAndroidAndroidStudio

    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
    }
    

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

    所感

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

    from: https://qiita.com/petitviolet/items/a1b5b2efea8e2163e1ba