Le nombre de références de méthode dans un fichier .dex ne peut pas dépasser 64 Ko API 17

154

Je construis une application avec SugarORM Library, mais lorsque j'essaie de créer le projet pour l'API 17 (je n'ai pas vérifié les autres), une erreur de construction s'affiche.

    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

Mais lorsque je construis ce projet pour Android v5.0 ou supérieur, cela fonctionne bien. Si je supprime la dépendance de gradle SugarORM, cela fonctionne bien pour les deux appareils v4.2.2 et v5.0.

Sandeep Singh Rana
la source
essayez d'utiliser proguard ce lien android-arsenal.com/details/1/337 spécifie l'utilisation de SugarORM avec proguard
Shaan_B
19
Je viens de l'obtenir après la mise à niveau vers l'API 23. Il est tout simplement impossible d'être productif avec Android. Chaque sdk casse des trucs. Chaque mise à jour de AS casse des choses. Messages d'erreur inutilisables. COMME cassé. Ordures, ordures, ordures.
RunLoop
1
@RunLoop ne perdez pas espoir .... J'ai trouvé qu'Android est la meilleure plate-forme jamais développée .... Moch Flexible et puissant .... Comme vous allez vous salir la main dans le codage .... Ce sera bien .... Chaque message d'erreur est utile. Mais besoin de comprendre les messages
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.Je suggère la réponse la plus élevée (et acceptée)!.
Jon Goodwin

Réponses:

332

Vous avez trop de méthodes. Il ne peut y avoir que 65536 méthodes pour dex .

Comme suggéré, vous pouvez utiliser le support multidex .

Ajoutez simplement ces lignes dans le 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
}

Également dans votre Manifestajoutez la MultiDexApplicationclasse de la bibliothèque de support multidex à l'élément d'application

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

Si vous utilisez votre propre Applicationclasse, changer la classe parente de Applicationla MultiDexApplication.
Si vous ne pouvez pas le faire, dans votre classe Application, remplacez la attachBaseContextméthode par:

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

Une autre solution consiste à essayer de supprimer le code inutilisé avec ProGuard - Configurez les paramètres ProGuard pour que votre application exécute ProGuard et assurez-vous que la réduction est activée pour les versions de version.

Gabriele Mariotti
la source
1
@Override protected void attachBaseContext (Contexte newBase) {super.attachBaseContext (newBase); MultiDex.install (ceci); } aussi outrepasser
Sandeep Singh Rana
1
Cmd-cliquant sur MultiDexApplication, je vois que le fichier .class décompilé exécute déjà exactement le remplacement attachBaseContext () que vous décrivez. Donc, il ne sera pas nécessaire de remplacer cela à nouveau, je suppose ..
Mete
4
Et si je n'ai pas trop de méthodes. Je n'ai pas beaucoup de méthodes sur mon application. Je crois que cela n'atteint même pas cela.
Neon Warge du
6
Je n'ai fait que ces deux parties: "multiDexEnabled true" et compilez 'com.android.support:multidex:1.0.0', dans mon fichier build.grandle. Je n'ai rien eu à changer dans mon fichier manifeste, ni les autres choses que vous avez mentionnées concernant le remplacement de attachBaseContext, etc. Mais votre solution a résolu le problème pour moi! Merci.
Jaime Montoya
2
@NeonWarge Probablement à cause de vos dépendances. Peut-être avez-vous inclus l'intégralité des services Google Play? Vérifiez cette réponse pour plus de détails
mr5
132

Dans 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
    }

Mettez ceci dans votre defaultConfig:

multiDexEnabled true 

ça marche pour moi

Dharmendra Mishra
la source
3
C'est pour Lollipop ou plus, n'est-ce pas?
Vic Torious
1
Cela rend la construction réussie, mais l'application se bloque après le lancement.
Vasanth
18

J'ai reçu ce message d'erreur car lors du codage de la version de compilation de la mise à jour automatique de mon projet dans mon build.gradlefichier:

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' }

Résolvez-le en corrigeant la version:

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
la source
2
Je crée une application simple, qui a bien fonctionné jusqu'à ce que j'essaye de suivre le didacticiel Google Map Objects. Du coup, je n'ai plus pu compiler. Cette solution a résolu cela pour moi. Comment diable avez-vous trouvé cela?
maccaroo le
4
Cette méthode a heureusement fonctionné car les nouvelles bibliothèques de compilation ont trop de méthodes (dépasse 65536), et les anciennes bibliothèques non. C'est donc juste une solution rapide, tôt ou tard, vous devriez corriger en ajoutant le support multidex comme la réponse acceptée.
Quan Nguyen
15

C'est ce qui a fonctionné pour moi:

Cela se produit parce qu'il y a trop de méthodes inutilisées. La plupart de ces méthodes proviennent des bibliothèques incluses dans votre build.gradle

Utilisez la réduction et la réduction des ressources pour résoudre ce problème avec gradle et nettoyer votre code en même temps.

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

Modifiez le build.gradle au niveau de l'application:

android {

compileSdkVersion 23

 buildToolsVersion '23.0.0'

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

cela a fonctionné pour moi.

Shivanand Naduvin
la source
oui, c'est un vieux problème, mais pour les dernières versions de l'API, nous n'avons besoin que d'une multiDexEnabledoption, sans dépendances ni changements de fichier manifeste
Hpsaturn
11

Cette erreur peut également se produire lorsque vous chargez tous les API des services Google Play lorsque vous n'en utilisez que quelques-uns.

Comme indiqué par google: "Dans les versions des services Google Play antérieures à la version 6.5, vous deviez compiler l'intégralité du package d'API dans votre application. Dans certains cas, cela rendait plus difficile la conservation du nombre de méthodes dans votre application (y compris Framework API, méthodes de bibliothèque et votre propre code) sous la limite de 65 536.

À partir de la version 6.5, vous pouvez à la place compiler de manière sélective les API du service Google Play dans votre application. "

Par exemple, lorsque votre application a besoin de play-services-maps, play-services-location. Vous devez ajouter uniquement les deux API dans votre fichier build.gradle au niveau de l'application, comme indiqué ci-dessous:

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

Au lieu de:

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

Pour obtenir la documentation complète et la liste des API des services Google Play, cliquez ici

James Kuta Simiyu
la source
9

Lorsque les références de votre application dépassent 65536 méthodes, vous rencontrez une erreur de build qui indique que votre application a atteint la limite de l'architecture de build Android

Prise en charge Multidex avant Android 5.0

Les versions de la plate-forme antérieures à Android 5.0 (niveau d'API 21) utilisent le runtime Dalvik pour exécuter le code d'application. Par défaut, Dalvik limite les applications à un seul fichier de bytecode classes.dex par APK. Afin de contourner cette limitation, vous pouvez ajouter la bibliothèque de support multidex à votre projet:

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

Prise en charge Multidex pour Android 5.0 et supérieur

Android 5.0 (niveau d'API 21) et supérieur utilise un environnement d'exécution appelé ART qui prend en charge nativement le chargement de plusieurs fichiers DEX à partir de fichiers APK. Par conséquent, si votre minSdkVersion est 21 ou plus, vous n'avez pas besoin du multidex bibliothèque de charge .

Évitez la limite de 64K

  • Supprimer le code inutilisé avec ProGuard - Activer la réduction du code

Configurer le multidex dans l'application pour

Si votre minSdkVersion est défini sur 21 ou plus, tout ce que vous avez à faire est de définir multiDexEnabled sur true dans votre fichier build.gradle au niveau du module

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

si votre minSdkVersion est définie sur 20 ou moins, vous devez utiliser la bibliothèque de support multidex

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

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

Remplacez la classe Application, modifiez-la pour étendre MultiDexApplication (si possible) comme suit:

public class MyApplication extends MultiDexApplication { ... }

ajouter au fichier manifeste

<?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
la source
8

J'ai été confronté au même problème et pour le support multidex, vous devez garder à l'esprit la minSdkVersion de votre application. Si vous utilisez minSdkVersion 21 ou supérieur, écrivez simplement multiDexEnabled true comme ceci

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

Cela fonctionne pour moi et si vous utilisez minSdkVersion inférieure à 21 (ci-dessous lolipop ), vous devez faire deux choses très simples

1. Ajoutez d'abord cette dépendance

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

dans votre build.gradle.

2. Dernière et seconde ajoutez-en une ci-dessous à votre application dans le manifeste

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 alors cela fonctionnera aussi dans la version inférieure .. :) Bon codage

Sudhansu
la source
1

Juste un commentaire secondaire, avant d'ajouter la prise en charge du multidex - assurez-vous de ne pas ajouter de dépendances inutiles.

Par exemple dans le guide d'analyse officiel de Facebook

Ils indiquent clairement que vous devez ajouter la dépendance suivante:

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

qui est en fait l' intégralité de FacebookSDK - donc si vous avez besoin, par exemple, de l'analyse, vous devez le remplacer par:

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

Options du SDK partiel de Facebook

Gal Rom
la source
Entièrement d'accord. Dans mon cas par exemple, j'avais juste besoin du bouton "Se connecter avec Facebook" et j'utilisais tout le sdk facebook. Je l'ai remplacé par facebook-coreet facebook-loginet l'erreur a disparu.
cleybertandre le
0

Pour moi, la mise à niveau de Gradle fonctionne.Recherchez la mise à jour sur le site Web Android, puis ajoutez-la dans votre build.gradle (projet) comme ceci

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

puis synchronisez le projet avec le fichier gradle plus cela peut arriver parfois à cause de java.exe (dans mon cas), forcez simplement tuer java.exe à partir du gestionnaire de tâches dans Windows, puis réexécutez le programme

androidXP
la source
0

Peut également essayer ceci:

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

J'espère que ça aide quelqu'un. Merci

Lazycoder_007
la source
0

**

Pour les développeurs de jeux Unity

**

Si quelqu'un vient ici parce que cette erreur est apparue dans son projet Unity, accédez à Fichier-> Paramètres de construction -> Paramètres du lecteur -> Lecteur. allez dans Paramètres de publication et sous l'onglet Construire, activez "Modèle de Gradle du lanceur personnalisé". un chemin sera affiché sous ce texte. allez sur le chemin et ajoutez multiDexEnabled true comme ceci:

defaultConfig {
    minSdkVersion **MINSDKVERSION**
    targetSdkVersion **TARGETSDKVERSION**
    applicationId '**APPLICATIONID**'
    ndk {
        abiFilters **ABIFILTERS**
    }
    versionCode **VERSIONCODE**
    versionName '**VERSIONNAME**'
    multiDexEnabled true
}
Peut-être Monsieur
la source
-1

vous pouvez activer "Instant Run" sur Android Studio pour obtenir une prise en charge multidex.

Quang Vĩnh Hà
la source
-2

Faites ceci, cela fonctionne:

defaultConfig {
    applicationId "com.example.maps"
    minSdkVersion 15
    targetSdkVersion 24
    versionCode 1
    versionName "1.0"
    multiDexEnabled true
}
tejasri
la source
2
Veuillez expliquer votre réponse. Les réponses de code uniquement sont déconseillées sur SO. Je vous remercie.
Gennadii Saprykin