Проблема с 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'
Проблема объясняется в следующей ссылке.