DexIndexOverflowExceptionと戦った話
2014-11-16
QiitaJavaAndroidAndroidStudioAndroid Studio でビルドした時に、
com.android.dex.DexIndexOverflowException: method ID not in [0, 0xffff]: 65536
っていうが出て困った。
なんとか解決したので、メモ
参考
- Building Apps with Over 65K Methods | Android Developers
- android - Unable to execute dex: method ID not in [0, 0xffff]: 65536 - Stack Overflow
- Version Compatibility - Android Tools Project Site
手順
Android Studio のアップデート
Canary チャンネルから最新版をダウンロードする
ここで Canary チャンネルを選択する
ここまで行ってから、再度「Check for Update」を選択すると Android Studio のアップデートが行えるようになる。
2014 年 11 月 16 日の時点では 0.9.3 が最新版となる
Gradle のアップデート
Android Studio をアップデートすれば、勝手にGradle
はアップデートしてくれる
gradle-wrapper.properties のdistributionUrl
でgradle-2.1-all.zip
が指定してあれば良い
distributionUrl=https\://services.gradle.org/distributions/gradle-2.1-all.zip
Android Gradle Plugin のアップデート
gradle-2.1
を使うためにはAndroid Gradle Plugin
をアップデートする必要がある
build.gradle で0.14.+
が指定してあれば良い
dependencies {
classpath 'com.android.tools.build:gradle:0.14.+'
}
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.Application
をandroid.support.multidex.MultiDexApplication
に変更し、
attachBaseContext
をOverride
する
public class App extends MultiDexApplication {
...
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
}
これでとりあえず出来た。
必要無さそう
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