Ich verwende die folgenden Einstellungen durch 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
Ich habe auch die folgenden Einstellungen in meiner Gradle-Datei:
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'
Ich bekomme immer den Fehler UNEXPECTED TOP LEVEL EXCEPTION
.
Aber wenn ich das mache 21.0.0
, 20.0.0
funktioniert es gut ... aber ich kann auf keine der Android API 21-Optionen zugreifen. Gibt es etwas, was ich hier falsch mache? Wie kann ich es ohne diese Ausnahme kompilieren? Ich habe die Support-Gläser nirgendwo anders als in anderen Klassenprojekten (Facebook usw.).
Hier ist die vollständige Stapelverfolgung:
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)
Antworten:
Diese Meldung klingt so, als wäre Ihr Projekt zu groß.
Sie haben zu viele Methoden. Es kann nur 65536 Methoden für Dex geben .
Seit dem Gradle-Plugin 0.14.0 und den Build Tools 21.1.0 können Sie die Multidex-Unterstützung verwenden .
Fügen Sie einfach diese Zeilen in das Feld ein
build.gradle
:android { defaultConfig { ... // Enabling multidex support. multiDexEnabled true } ... } dependencies { compile 'com.android.support:multidex:1.0.1' }
Fügen Sie außerdem
Manifest
dieMultiDexApplication
Klasse aus der Multidex-Unterstützungsbibliothek zum Anwendungselement hinzu<?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>
Wenn Sie eine eigene
Application
Klasse verwenden, ändern Sie die übergeordnete Klasse vonApplication
inMultiDexApplication
.quelle
multi-dex
war der Grund dafür.1) Fügen Sie der Anwendungsdatei build.gradle eine Abhängigkeit hinzu
compile 'com.android.support:multidex:1.0.2'
2) Wenn Sie die Anwendungsklasse nicht überschreiben, bearbeiten Sie Ihre Manifestdatei, um android: name im Tag wie folgt festzulegen:
<?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>
Wenn Sie die Anwendungsklasse überschreiben, ändern Sie sie, um MultiDexApplication (falls möglich) wie folgt zu erweitern:
public class MyApplication extends MultiDexApplication { ... }
Wenn Sie die Anwendungsklasse überschreiben, die Basisklasse jedoch nicht geändert werden kann, können Sie stattdessen die Methode attachBaseContext () überschreiben und MultiDex.install (this) aufrufen, um Multidex zu aktivieren:
public class MyApplication extends SomeOtherApplication { @Override protected void attachBaseContext(Context base) { super.attachBaseContext(base); MultiDex.install(this); } }
3) Fügen Sie defaultConfig unter build.gradle Multidex-Unterstützung hinzu
defaultConfig { ... minSdkVersion 16 targetSdkVersion 26 ... // Enabling multidex support. multiDexEnabled true } ...
quelle
Bevor Sie mit MultiDex herumspielen
Entweder ist die Lösung zu groß (verwenden Sie MultiDex) oder Sie kompilieren einige nicht benötigte Elemente und fügen sie in Ihr Projekt ein. Ich habe dieses Problem bei meinem kleinen Projekt. Folgendes habe ich getan, um das Problem zu beheben:
Ich habe dies entfernt von
build.gradle
:dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) }
Und ich habe meinen Build-Ordner manuell aus dem Anwendungsstamm entfernt. Problem gelöst.
quelle
Befolgen Sie diese Anleitung, um das 65K-Limit zu umgehen.
Ich habe dieses Problem in gradle gelöst,
multiDexEnabled true
indem ich meine Anwendung mit eingestellt und erweitert habeclass MyApp extends MultiDexApplication
quelle
Ich habe die Kompilierung
filetree(include: ['*.jar'], dir: 'libs')
in derbuild.gradle
Datei einfach auskommentiert (wie oben vorgeschlagen) und das Projekt neu erstellt. Ohne Fehler kompiliert. Ich musste keine Ordner verschieben.quelle
Stellen Sie zunächst sicher, dass die Minimierung aktiviert ist in
app/build.cradle
:buildTypes { release { minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' signingConfig signingConfigs.config } debug { signingConfig signingConfigs.config } }
Wenn das Problem dadurch nicht behoben wird , aktivieren Sie den Multidex-Build für Ihre App.
quelle
Ich hatte dieses Problem, als ich das gesamte Paket der Google Play Services-APIs in meine App kompiliert hatte. Ich habe das Problem mithilfe einer selektiven API gelöst.
Ersetzen Sie beispielsweise die folgende Zeile in Ihrer build.gradle-Datei, um nur die APIs Google Fit und Android Wear einzuschließen:
compile 'com.google.android.gms:play-services:11.0.2'
mit diesen Zeilen:
compile 'com.google.android.gms:play-services-fitness:11.0.2' compile 'com.google.android.gms:play-services-wearable:11.0.2'
Das Problem wird unter folgendem Link erläutert .
quelle