222 votes

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

Je suis en train de construire une application avec la bibliothèque SugarORM mais lorsque j'essaie de construire le projet pour l'API 17 (je n'ai pas vérifié pour les autres), il affiche une erreur de construction.

    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, il fonctionne bien. Si je supprime la dépendance SugarORM gradle, il fonctionne bien pour les deux appareils v4.2.2 et v5.0.

1 votes

0 votes

Essayez d'utiliser proguard ce lien Android-arsenal.com/détails/1/337

31 votes

Je viens de recevoir ce message 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 trucs. Messages d'erreur inutilisables. AS cassé. Poubelle, poubelle, poubelle.

492voto

Gabriele Mariotti Points 7243

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 .

Il suffit d'ajouter ces lignes dans le fichier module/build.gradle :

android {

    defaultConfig {
        ...

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

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

}

Également dans votre Manifest ajouter le MultiDexApplication 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="androidx.multidex.MultiDexApplication">

            <!-- If you are using support libraries use android:name="android.support.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 Application changez la classe parent de Application à MultiDexApplication .
Si vous ne pouvez pas le faire, dans votre classe d'application, remplacez l'attribut attachBaseContext méthode avec :

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

Une autre solution est d'essayer de supprimer le code inutilisé avec ProGuard - Configurer le ProGuard pour votre application afin d'exécuter ProGuard et assurez-vous que vous avez activé le rétrécissement pour les constructions de version.

1 votes

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

1 votes

En cliquant sur MultiDexApplication, je constate que le fichier .class décompilé exécute déjà exactement la surcharge attachBaseContext() que vous décrivez. Il ne sera donc pas nécessaire de la remplacer à nouveau.

4 votes

Et si je n'ai pas trop de méthodes. Je n'ai pas tant de méthodes que ça dans mon application. Je crois qu'elle n'atteint même pas ça.

195voto

Dharmendra Mishra Points 769

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 

cela fonctionne pour moi

3 votes

C'est pour Lollipop ou une version supérieure seulement, n'est-ce pas ?

1 votes

La construction est réussie, mais l'application se bloque après le lancement.

0 votes

Vous avez sauvé ma journée !

19voto

Quan Nguyen Points 129

J'ai reçu ce message d'erreur parce que pendant le codage de mon projet, la mise à jour automatique de la version de compilation dans ma base de données a été effectuée. build.gradle fichier :

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 problème 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'
}

2 votes

Je suis en train de créer une application simple, qui fonctionnait bien jusqu'à ce que j'essaie de suivre le tutoriel Google Map Objects. Soudain, je n'étais plus capable de compiler. Cette solution a réglé le problème pour moi. Comment avez-vous fait ?

5 votes

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 n'en ont pas. Il s'agit donc d'une solution rapide, mais tôt ou tard, il faudra ajouter le support multidex, comme le prévoit la réponse acceptée.

16voto

Thunderstick Points 448

C'est ce qui a marché pour moi :

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

Utilisez minify et shrink resources pour résoudre ce problème avec gradle et nettoyer votre code par la même occasion.

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

13voto

simiyukuta Points 21

Cette erreur peut également se produire lorsque vous chargez toutes les apis de google play services alors que vous n'en utilisez que quelques-unes.

Comme l'indique Google : "Dans les versions des services Google Play antérieures à la version 6.5, vous deviez compiler l'ensemble des API dans votre application. Dans certains cas, il était plus difficile de maintenir le nombre de méthodes de votre application (y compris les API du framework, les méthodes de la bibliothèque et votre propre code) sous la limite des 65 536.

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

Par exemple, si votre application a besoin de play-services-maps et play-services-location, vous devez ajouter uniquement ces deux apis 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 la documentation complète et la liste des apis de google play services, cliquez sur ici

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X