1. ホーム
  2. android

最新の appcompat とサポートライブラリに更新した後に DexIndexOverflowException が発生する問題

2023-09-12 14:30:58

質問

私は以下の設定を gradle :

compileSdkVersion 21
ANDROID_BUILD_MIN_SDK_VERSION=14
ANDROID_BUILD_TARGET_SDK_VERSION=21
ANDROID_BUILD_TOOLS_VERSION=21.0.2
ANDROID_BUILD_SDK_VERSION=21

また、gradleファイルには以下のような設定をしています。

compile 'com.android.support:support-annotations:21.0.0'
compile 'com.android.support:appcompat-v7:21.0.0'
compile 'com.android.support:support-v4:21.0.0'

私はいつもエラー UNEXPECTED TOP LEVEL EXCEPTION .

しかし 21.0.0 から 20.0.0 でうまくいくのですが、Android API 21のどのオプションにもアクセスすることができません。何か間違ったことをしているのでしょうか?どうすれば、この例外を発生させずにコンパイルできるようになりますか?私は他の等級プロジェクト(facebookなど)以外のどこにもサポートジャーを持っていません。

ここに完全なスタックトレースがあります。

UNEXPECTED TOP-LEVEL EXCEPTION:
com.android.dex.DexIndexOverflowException: method ID not in [0, 0xffff]: 65536
    at com.android.dx.merge.DexMerger$6.updateIndex(DexMerger.java:502)
    at com.android.dx.merge.DexMerger$IdMerger.mergeSorted(DexMerger.java:283)
    at com.android.dx.merge.DexMerger.mergeMethodIds(DexMerger.java:491)
    at com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:168)
    at com.android.dx.merge.DexMerger.merge(DexMerger.java:189)
    at com.android.dx.command.dexer.Main.mergeLibraryDexBuffers(Main.java:454)
    at com.android.dx.command.dexer.Main.runMonoDex(Main.java:302)
    at com.android.dx.command.dexer.Main.run(Main.java:245)
    at com.android.dx.command.dexer.Main.main(Main.java:214)
    at com.android.dx.command.Main.main(Main.java:106)

どのように解決するのですか?

このメッセージは、プロジェクトが大きすぎるようです。

メソッドが多すぎます。あるのは 65536 個の dex 用メソッド .

gradleプラグイン0.14.0とBuild Tools 21.1.0以降では、DeXを使用するために マルチデックスのサポート .

これらの行を build.gradle :

android {

    defaultConfig {
        ...

        // Enabling multidex support.
        multiDexEnabled true
    }
    ...
}

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

また Manifest を追加します。 MultiDexApplication クラスをアプリケーション要素に追加します。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.android.multidex.myapplication">
    <application
        ...
        android:name="android.support.multidex.MultiDexApplication"> 
        ...
    </application>
</manifest>

もし、自分の Application クラスを使用している場合は、親クラスを Application から MultiDexApplication .