Die Anzahl der Methodenreferenzen in einer .dex-Datei darf 64k API 17 nicht überschreiten

154

Ich erstelle eine App mit SugarORM Library, aber wenn ich versuche, das Projekt für API 17 zu erstellen (nicht nach anderen gesucht), wird ein Erstellungsfehler angezeigt.

    Information:Gradle tasks [:app:assembleDebug]
:app:preBuild UP-TO-DATE
:app:preDebugBuild UP-TO-DATE
:app:checkDebugManifest
:app:preReleaseBuild UP-TO-DATE
:app:prepareComAndroidSupportAnimatedVectorDrawable2330Library UP-TO-DATE
:app:prepareComAndroidSupportAppcompatV72330Library UP-TO-DATE
:app:prepareComAndroidSupportCardviewV72330Library UP-TO-DATE
:app:prepareComAndroidSupportDesign2330Library UP-TO-DATE
:app:prepareComAndroidSupportMediarouterV72300Library UP-TO-DATE
:app:prepareComAndroidSupportRecyclerviewV72330Library UP-TO-DATE
:app:prepareComAndroidSupportSupportV42330Library UP-TO-DATE
:app:prepareComAndroidSupportSupportVectorDrawable2330Library UP-TO-DATE
:app:prepareComAndroidVolleyVolley100Library UP-TO-DATE
:app:prepareComGithubSatyanSugar14Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServices840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesAds840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesAnalytics840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesAppindexing840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesAppinvite840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesAppstate840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesAuth840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesBase840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesBasement840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesCast840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesDrive840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesFitness840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesGames840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesGcm840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesIdentity840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesLocation840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesMaps840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesMeasurement840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesNearby840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesPanorama840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesPlus840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesSafetynet840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesVision840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesWallet840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesWearable840Library UP-TO-DATE
:app:prepareMeDrakeetMaterialdialogLibrary131Library UP-TO-DATE
:app:prepareDebugDependencies
:app:compileDebugAidl UP-TO-DATE
:app:compileDebugRenderscript UP-TO-DATE
:app:generateDebugBuildConfig UP-TO-DATE
:app:generateDebugAssets UP-TO-DATE
:app:mergeDebugAssets UP-TO-DATE
:app:generateDebugResValues UP-TO-DATE
:app:generateDebugResources UP-TO-DATE
:app:mergeDebugResources UP-TO-DATE
:app:processDebugManifest UP-TO-DATE
:app:processDebugResources UP-TO-DATE
:app:generateDebugSources UP-TO-DATE
:app:compileDebugJavaWithJavac
Note: Some input files use or override a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
:app:compileDebugNdk UP-TO-DATE
:app:compileDebugSources
:app:prePackageMarkerForDebug
:app:transformClassesWithDexForDebug
Error:The number of method references in a .dex file cannot exceed 64K.
Learn how to resolve this issue at https://developer.android.com/tools/building/multidex.html
Error:Execution failed for task ':app:transformClassesWithDexForDebug'.
> com.android.build.api.transform.TransformException: com.android.ide.common.process.ProcessException: java.util.concurrent.ExecutionException: com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command '/Library/Java/JavaVirtualMachines/jdk1.8.0_51.jdk/Contents/Home/bin/java'' finished with non-zero exit value 2
Information:BUILD FAILED
Information:Total time: 21.663 secs
Information:2 errors
Information:0 warnings
Information:See complete output in console

Aber wenn ich dieses Projekt für Android v5.0 oder höher baue, funktioniert es gut. Wenn ich die SugarORM-Gradle-Abhängigkeit entferne, funktioniert sie für beide Geräte v4.2.2 und v5.0 einwandfrei.

Sandeep Singh Rana
quelle
1
developer.android.com/tools/building/multidex.html . Überprüfen Sie dies
Raghunandan
Versuchen Sie, Proguard zu verwenden. Dieser Link android-arsenal.com/details/1/337 gibt die Verwendung von SugarORM mit Proguard an
Shaan_B
19
Ich habe dies gerade nach dem Upgrade auf API 23 erhalten. Es ist einfach unmöglich, mit Android produktiv zu sein. Jeder SDK bricht Sachen. Jedes Update auf AS bricht Sachen. Fehlermeldungen unbrauchbar. AS kaputt. Müll, Müll, Müll.
RunLoop
1
@ RunLoop nicht die Hoffnung verlieren .... Ich fand, dass Android die beste Plattform ist, die jemals entwickelt wurde .... Moch Flexibel und leistungsstark .... Da Sie sich beim Codieren die Hände schmutzig machen .... Es wird in Ordnung sein .... Jede Fehlermeldung ist nützlich. Aber müssen Nachrichten verstehen
Sandeep Singh Rana
2
@ Balaj Khan One or more of the answers is exemplary and worthy of an additional bounty.Just to the point and accurate answer.Ich schlage die beste (und akzeptierte) Antwort vor!
Jon Goodwin

Antworten:

330

Sie haben zu viele Methoden. Es kann nur 65536 Methoden für Dex geben .

Wie vorgeschlagen können Sie die Multidex-Unterstützung verwenden .

Fügen Sie einfach diese Zeilen in das Feld ein module/build.gradle:

android {

    defaultConfig {
        ...

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

dependencies {
  implementation 'com.android.support:multidex:1.0.3'  //with support libraries
  //implementation 'androidx.multidex:multidex:2.0.1'  //with androidx libraries
}

Fügen Sie außerdem Manifestdie MultiDexApplicationKlasse 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">

            <!-- If you are using androidx use android:name="androidx.multidex.MultiDexApplication" -->

            <!--If you are using your own custom Application class then extend -->
            <!--MultiDexApplication and change above line as-->
            <!--android:name=".YourCustomApplicationClass"> -->

            ...
        </application>
    </manifest>

Wenn Sie Ihre eigene ApplicationKlasse verwenden, ändern Sie die übergeordnete Klasse von Applicationin MultiDexApplication.
Wenn Sie dies nicht tun können, überschreiben Sie in Ihrer Anwendungsklasse die attachBaseContextMethode mit:

@Override
protected void attachBaseContext(Context newBase) {
    super.attachBaseContext(newBase);
    MultiDex.install(this);
}

Eine andere Lösung besteht darin, zu versuchen, nicht verwendeten Code mit ProGuard zu entfernen. Konfigurieren Sie die ProGuard- Einstellungen für Ihre App, um ProGuard auszuführen, und stellen Sie sicher, dass das Verkleinern für Release-Builds aktiviert ist.

Gabriele Mariotti
quelle
1
@Override protected void attachBaseContext (Kontext newBase) {super.attachBaseContext (newBase); MultiDex.install (this); } auch überschreiben
Sandeep Singh Rana
1
Wenn Sie mit dem Befehl auf MultiDexApplication klicken, wird die dekompilierte .class-Datei bereits genau die von Ihnen beschriebene Überschreibung von attachBaseContext () ausführen. Es wird also nicht notwendig sein, das noch einmal zu überschreiben, denke ich.
Mete
4
Was ist, wenn ich nicht zu viele Methoden habe? Ich habe nicht so viele Methoden in meiner App. Ich glaube, dass es das nicht einmal erreicht.
Neon Warge
6
Ich habe nur diese beiden Teile ausgeführt: "multiDexEnabled true" und 'com.android.support:multidex:1.0.0' in meiner Datei build.grandle kompiliert. Ich musste weder etwas in meiner Manifestdatei ändern noch die anderen Dinge tun, die Sie über das Überschreiben von attachBaseContext usw. erwähnt haben. Aber Ihre Lösung hat das Problem für mich behoben! Vielen Dank.
Jaime Montoya
2
@NeonWarge Wahrscheinlich wegen Ihrer Abhängigkeiten. Vielleicht haben Sie die gesamten Google Play-Dienste aufgenommen? Überprüfen Sie diese Antwort für Details
mr5
128

In android / app / build.gradle

android {

compileSdkVersion 23

 buildToolsVersion '23.0.0'

    defaultConfig {
        applicationId "com.dkm.example"
        minSdkVersion 15
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
        multiDexEnabled true
    }

Fügen Sie dies in Ihre defaultConfig ein:

multiDexEnabled true 

Für mich geht das

Dharmendra Mishra
quelle
3
Dies ist nur für Lollipop oder höher, nicht wahr?
Vic Torious
1
Es macht den Build erfolgreich, aber die App stürzt nach dem Start ab.
Vasanth
18

Ich habe diese Fehlermeldung erhalten, weil beim Codieren meines Projekts die automatische Update-Kompilierungsversion in meiner build.gradleDatei enthalten ist:

android {
    ...
    buildToolsVersion "23.0.2"
    ...
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.4.0'
    compile 'com.android.support:design:23.4.0' }

Lösen Sie es, indem Sie die Version korrigieren:

android {
        ...
        buildToolsVersion "23.0.2"
        ...
    }

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.0.1'
    compile 'com.android.support:design:23.0.1'
}
Quan Nguyen
quelle
2
Ich erstelle eine einfache App, die einwandfrei funktioniert hat, bis ich versucht habe, dem Tutorial zu Google Map Objects zu folgen. Plötzlich konnte ich nicht mehr kompilieren. Diese Lösung hat das für mich behoben. Wie um alles in der Welt hast du es herausgefunden?
Maccaroo
4
Diese Methode hat zum Glück funktioniert, da neue Kompilierungsbibliotheken zu viele Methoden haben (mehr als 65536) und alte Bibliotheken nicht. Es handelt sich also nur um eine schnelle Lösung. Früher oder später sollten Sie dies beheben, indem Sie Multidex-Unterstützung wie die akzeptierte Antwort hinzufügen.
Quan Nguyen
15

Das hat bei mir funktioniert:

Dies liegt daran, dass zu viele nicht verwendete Methoden vorhanden sind. Die meisten dieser Methoden stammen aus enthaltenen Bibliotheken in Ihrem build.gradle

Verwenden Sie Ressourcen zum Minimieren und Verkleinern, um dies mit gradle zu beheben und gleichzeitig Ihren Code zu bereinigen.

buildTypes {
        release {
            minifyEnabled true
            shrinkResources true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
        debug {
            minifyEnabled true
            shrinkResources true
        }
    }
Thunderstick
quelle
12

Ändern Sie die App-Ebene build.gradle:

android {

compileSdkVersion 23

 buildToolsVersion '23.0.0'

    defaultConfig {
        applicationId "com.dkm.example"
        minSdkVersion 15
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
        multiDexEnabled true
    }

es hat bei mir funktioniert.

Shivanand Naduvin
quelle
Ja, es ist ein altes Problem, aber für die letzten Versionen der API benötigen wir nur eine multiDexEnabledOption ohne Abhängigkeiten oder Änderungen der Manifestdatei
Hpsaturn
11

Dieser Fehler kann auch auftreten, wenn Sie alle Google Play Services-APIs laden, wenn Sie nur wenige verwenden.

Wie von Google angegeben: "In Versionen von Google Play-Diensten vor 6.5 mussten Sie das gesamte API-Paket in Ihre App kompilieren. In einigen Fällen war es dadurch schwieriger, die Anzahl der Methoden in Ihrer App beizubehalten (einschließlich Framework-APIs, Bibliotheksmethoden und Ihren eigenen Code) unter der Grenze von 65.536.

Ab Version 6.5 können Sie stattdessen selektiv Google Play-Dienst-APIs in Ihre App kompilieren. "

Zum Beispiel, wenn Ihre App Play-Services-Maps und Play-Services-Location benötigt. Sie müssen nur die beiden Apis in Ihrer build.gradle-Datei auf App-Ebene hinzufügen, wie unten gezeigt:

compile 'com.google.android.gms:play-services-maps:10.2.1'
compile 'com.google.android.gms:play-services-location:10.2.1'

Anstatt:

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

Für eine vollständige Dokumentation und eine Liste der Google Play-Dienste klicken Sie hier

James Kuta Simiyu
quelle
9

Wenn Ihre App-Referenzen 65.536 Methoden überschreiten , tritt ein Build-Fehler auf, der darauf hinweist, dass Ihre App das Limit der Android-Build-Architektur erreicht hat

Multidex-Unterstützung vor Android 5.0

Versionen der Plattform vor Android 5.0 (API-Level 21) verwenden die Dalvik-Laufzeit zum Ausführen von App-Code. Standardmäßig beschränkt Dalvik Apps auf eine einzelne Klassen.dex-Bytecode-Datei pro APK. Um diese Einschränkung zu umgehen, können Sie Ihrem Projekt die Multidex-Unterstützungsbibliothek hinzufügen:

dependencies {
  implementation 'com.android.support:multidex:1.0.3'
}

Multidex-Unterstützung für Android 5.0 und höher

Android 5.0 (API Level 21) und höher verwendet eine Laufzeit namens ART, die das Laden mehrerer DEX-Dateien aus APK-Dateien nativ unterstützt. Wenn Ihre minSdkVersion 21 oder höher ist, benötigen Sie daher keine Multidex- Unterstützungsbibliothek.

Vermeiden Sie das 64K-Limit

  • Entfernen Sie nicht verwendeten Code mit ProGuard - Aktivieren Sie das Verkleinern von Code

Konfigurieren Sie Multidex in der App für

Wenn Ihre minSdkVersion auf 21 oder höher festgelegt ist, müssen Sie multiDexEnabled in Ihrer build.gradle-Datei auf Modulebene nur auf true setzen

android {
defaultConfig {
    ...
    minSdkVersion 21 
    targetSdkVersion 28
    multiDexEnabled true
  }
 ...
}

Wenn Ihre minSdkVersion auf 20 oder niedriger eingestellt ist, müssen Sie die Multidex-Unterstützungsbibliothek verwenden

android {
defaultConfig {
    ...
    minSdkVersion 15 
    targetSdkVersion 28
    multiDexEnabled true
   }
   ...
}

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

Überschreiben Sie die Anwendungsklasse und ändern Sie sie, um MultiDexApplication (falls möglich) wie folgt zu erweitern:

public class MyApplication extends MultiDexApplication { ... }

zur Manifestdatei hinzufügen

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

Ich hatte das gleiche Problem und für die Multidex-Unterstützung müssen Sie die minSdkVersion Ihrer Anwendung berücksichtigen . Wenn Sie minSdkVersion 21 oder höher verwenden, schreiben Sie einfach multiDexEnabled true wie folgt

defaultConfig {
    applicationId *******************
    minSdkVersion 21
    targetSdkVersion 24
    versionCode 1
    versionName "1.0"
    multiDexEnabled true
}

Es funktioniert für mich und wenn Sie minSdkVersion unter 21 (unter lolipop ) verwenden, müssen Sie zwei besonders einfache Dinge tun

1. Fügen Sie zuerst diese Abhängigkeit hinzu

kompiliere 'com.android.support:multidex:1.0.1'

in Ihrem build.gradle.

2. Fügen Sie als letztes und zweites eine dieser folgenden Zeilen zu Ihrer Anwendung im Manifest hinzu

android: name = "android.support.multidex.MultiDexApplication"

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:name="android.support.multidex.MultiDexApplication"
    android:theme="@style/AppTheme" >
    <activity android:name=".MainActivity" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

Bingo dann wird es auch in der unteren Version funktionieren .. :) Viel Spaß beim Codieren

Sudhansu
quelle
1

Nur ein Nebenkommentar: Bevor Sie Unterstützung für Multidex hinzufügen, stellen Sie sicher, dass Sie keine unnötigen Abhängigkeiten hinzufügen.

Zum Beispiel im offiziellen Facebook Analytics Guide

Sie geben eindeutig an, dass Sie die folgende Abhängigkeit hinzufügen sollten:

implementation 'com.facebook.android:facebook-android-sdk:[4,5)'

Das ist eigentlich das gesamte FacebookSDK. Wenn Sie also zum Beispiel nur die Analytics benötigen, müssen Sie diese ersetzen durch:

implementation 'com.facebook.android:facebook-core:5.+'

Facebook teilweise SDK-Optionen

Gal Rom
quelle
Stimme voll und ganz zu. In meinem Fall brauchte ich zum Beispiel nur die Schaltfläche "Mit Facebook anmelden" und benutzte das gesamte Facebook SDK. Ich habe es durch facebook-coreund ersetzt facebook-loginund der Fehler ist verschwunden.
Cleybertandre
0

Für mich Upgrade von Gradle funktioniert. Suchen Sie nach Updates auf der Android-Website und fügen Sie sie dann wie folgt in Ihr build.gradle (Projekt) ein

 dependencies {
        classpath 'com.android.tools.build:gradle:2.2.0-alpha4'   
          ....
    }

Dann synchronisiere das Projekt mit der Gradle-Datei und es kann manchmal vorkommen, dass java.exe (in meinem Fall) einfach java.exe vom Task-Manager in Windows beendet und dann das Programm erneut ausführt

androidXP
quelle
0

Kann auch versuchen:

android{
    .
    .
    // to avoid DexIndexOverflowException
    dexOptions {
       jumboMode true
    }
}

Hoffe es hilft jemandem. Vielen Dank

Lazycoder_007
quelle
0

** **.

Für Unity-Spieleentwickler

** **.

Wenn jemand hierher kommt, weil dieser Fehler in seinem Unity-Projekt aufgetreten ist, gehen Sie zu Datei-> Build-Einstellungen -> Player-Einstellungen -> Player. Gehen Sie zu Veröffentlichungseinstellungen und aktivieren Sie auf der Registerkarte Erstellen die Option "Benutzerdefinierte Launcher-Gradle-Vorlage". Unter diesem Text wird ein Pfad angezeigt. Gehen Sie zum Pfad und fügen Sie multiDexEnabled true wie folgt hinzu:

defaultConfig {
    minSdkVersion **MINSDKVERSION**
    targetSdkVersion **TARGETSDKVERSION**
    applicationId '**APPLICATIONID**'
    ndk {
        abiFilters **ABIFILTERS**
    }
    versionCode **VERSIONCODE**
    versionName '**VERSIONNAME**'
    multiDexEnabled true
}
Vielleicht Herr
quelle
-1

Sie können "Instant Run" in Android Studio aktivieren, um Multidex-Unterstützung zu erhalten.

Quang Vĩnh Hà
quelle
-2

Tun Sie dies, es funktioniert:

defaultConfig {
    applicationId "com.example.maps"
    minSdkVersion 15
    targetSdkVersion 24
    versionCode 1
    versionName "1.0"
    multiDexEnabled true
}
tejasri
quelle
2
Bitte erläutern Sie Ihre Antwort. Von Nur-Code-Antworten wird bei SO abgeraten. Danke dir.
Gennadii Saprykin