Проблема с DexIndexOverflowException после обновления до последней библиотеки приложений и поддержки

Я использую следующие настройки через 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, он отлично работает... но я не могу получить доступ к каким-либо из вариантов API Android 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)

Ответ 1

Это сообщение похоже, что ваш проект слишком велик.

У вас слишком много методов. Могут быть 65536 методов для dex.

Так как плагин gradle 0.14.0 и Build Tools 21.1.0 вы можете использовать поддержку multidex.

Просто добавьте эти строки в build.gradle:

android {

    defaultConfig {
        ...

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

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

Также в Manifest добавьте класс MultiDexApplication из библиотеки поддержки multidex к элементу приложения

<?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.

Ответ 2

1) добавить зависимость к файлу build.radio.exe приложения

compile 'com.android.support:multidex:1.0.2'

2) Если вы не переопределяете класс приложения, отредактируйте файл манифеста, чтобы установить имя android: name в теге следующим образом:

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

Если вы переопределите класс Application, измените его, чтобы расширить MultiDexApplication (если возможно) следующим образом:

public class MyApplication extends MultiDexApplication { ... }

Или, если вы переопределите класс приложения, но не можете изменить базовый класс, вместо этого вы можете переопределить метод attachBaseContext() и вызвать MultiDex.install(this), чтобы включить multidex:

public class MyApplication extends SomeOtherApplication {
  @Override
  protected void attachBaseContext(Context base) {
     super.attachBaseContext(base);
     MultiDex.install(this);
  }
}

3) Добавьте поддержку multidex к defaultConfig в build.gradle

defaultConfig {
        ...
        minSdkVersion 16
        targetSdkVersion 26
        ...
        // Enabling multidex support.
        multiDexEnabled true
    }
...

Ответ 3

Прежде чем возиться с MultiDex

Это либо решение слишком велико (используйте MultiDex), либо вы компилируете и включаете в свой проект некоторые ненужные вещи. У меня проблема с моим крошечным проектом. Вот что я сделал, чтобы исправить это:

Я удалил это из build.gradle:

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
}

И я вручную удалил папку с файлами из корня приложения. Проблема исправлена.

Ответ 4

Следуйте это руководство по обходному ограничению 65K.

Я решил эту проблему в gradle, установив multiDexEnabled true и расширив мое приложение с помощью class MyApp extends MultiDexApplication

Ответ 5

Я просто комментировал компиляцию filetree(include: ['*.jar'], dir: 'libs') в файле build.gradle (как было предложено выше) и перестроен проект. Составлено без ошибок. Мне не нужно было перемещать папки.

Ответ 6

Сначала убедитесь, что в app/build.cradle включена минификация:

buildTypes {
    release {
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        signingConfig signingConfigs.config
    }
    debug {
        signingConfig signingConfigs.config
    }
}

Если это не решит проблему, включите multidex build для вашего приложения.

Ответ 7

Я столкнулся с этой проблемой, когда собрал весь пакет API-интерфейсов Google Play в свое приложение. Я решил проблему с помощью выборочного API.

Например, чтобы включить только API Google Fit и Android Wear, замените следующую строку в файле build.gradle:

compile 'com.google.android.gms:play-services:11.0.2'

с этими строками:

compile 'com.google.android.gms:play-services-fitness:11.0.2'
compile 'com.google.android.gms:play-services-wearable:11.0.2'

Проблема объясняется в следующей ссылке.