web-dev-qa-db-fra.com

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

Je construis une application avec SugarORM Library, mais lorsque j'essaie de générer le projet pour l'API 17 (je n'ai pas vérifié les autres), cela indique une erreur de génération.

    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 une version ultérieure, cela fonctionne correctement. Si je supprime la dépendance de gradation SugarORM, cela fonctionne correctement pour les deux appareils v4.2.2 et v5.0.

115
Sandeep Singh Rana

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 build.gradle:

Android {

    defaultConfig {
        ...

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

dependencies {
  compile 'com.Android.support:multidex:1.0.0'
}

Également dans votre Manifest, ajoutez la classe 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="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>

redéfinit la méthode attachBaseContext

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

Si vous utilisez votre propre classe Application, changez la classe parente de Application à MultiDexApplication.

Une autre solution consiste à essayer de supprimer le code inutilisé avec ProGuard - Configurez les paramètres ProGuard de votre application pour exécuter ProGuard et vous assurer ont réduit activé pour les versions release.

232
Gabriele Mariotti

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

83
Dharmendra Mishra

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

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'
}
18
Quan Nguyen

C'est ce qui a fonctionné pour moi:

Cela se produit car 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 réduisez vos ressources pour résoudre ce problème avec gradle et nettoyez 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
        }
    }
13
Thunderstick

Cette erreur peut également se produire lorsque vous chargez tous les apis 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’ensemble des API dans votre application. Dans certains cas, il devenait plus difficile de conserver le nombre de méthodes dans votre application (y API de structure, méthodes de bibliothèque et votre propre code) dans la limite de 65 536.

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

Par exemple, lorsque votre application nécessite play-services-maps, play-services-location. Vous devez uniquement ajouter les 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 obtenir une documentation complète et une liste des services de Google Play, cliquez sur ici

11
James Kuta Simiyu

Je suis confronté au même problème et pour le support multidex, vous devez garder à l’esprit le 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 moins de 21 (ci-dessous lolipop), vous devez faire deux choses très simples

1. Ajoutons d'abord cette dépendance

compiler 'com.Android.support:multidex:1.0.1'

dans votre build.gradle.

2. Dernier et deuxième ajouter un cette ligne ci-dessous à votre demande dans 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 également dans la version inférieure .. :) Bonne codage

6
Sudhansu

Lorsque les références de votre application dépassent 65 536 méthodes, vous rencontrez une erreur de génération indiquant que votre application a atteint la limite de l'architecture de génération Android.

Prise en charge de Multidex avant Android 5.0

Les versions de la plate-forme antérieures à Android 5.0 (API de niveau 21) utilisent le runtime Dalvik pour exécuter le code d'application. Par défaut, Dalvik limite les applications à un seul fichier 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 de Multidex pour Android 5.0 et versions ultérieures

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

Évitez la limite de 64 Ko

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

Configurer multidex dans l'application pour

Si votre minSdkVersion est défini sur 21 ou supérieur, il vous suffit 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éfini sur 20 ou moins, vous devez utiliser la bibliothèque de prise en charge multidex.

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

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

Remplacez la classe Application, changez-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>
3
Basi

Prise en charge Multidex antérieure à Android 5.

Les versions de la plate-forme antérieures à Android 5.0 (API de niveau 21) utilisent le moteur d'exécution Dalvik pour exécuter le code d'application. Par défaut, Dalvik limite les applications à un seul fichier bytecode class.dex par APK. Afin de contourner cette limitation, veuillez lire configurez votre application pour multidex

Prise en charge de Multidex pour Android 5.0 et versions supérieures

Android 5.0 (API de niveau 21) et supérieur utilise un environnement d'exécution appelé ART qui prend en charge de manière native le chargement de plusieurs fichiers DEX à partir de fichiers APK. ART effectue une pré-compilation au moment de l'installation de l'application, qui analyse les fichiers classesN.dex et les compile en un seul fichier .oat à exécuter par le périphérique Android. Par conséquent, si votre minSdkVersion est égal ou supérieur à 21, vous n’avez pas besoin de la bibliothèque de prise en charge multidex. Tout ce que vous devez faire est de définir multiDexEnabled sur true dans votre build.gradle au niveau du module

Lisez la suite ici - https://developer.Android.com/studio/build/multidex

0
yoAlex5

Peut aussi essayer ceci:

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

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

0
Lazycoder_007

pour l'utilisateur flutter, cela peut être résolu en utilisant build.gradle du niveau de l'application

changer ci-dessous

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.

0
shivanand naduvin

Pour moi, mettre à niveau Gradle fonctionne. Recherchez la mise à jour sur 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 et cela peut arriver parfois à cause de Java.exe (dans mon cas) il suffit de forcer kill Java.exe à partir du gestionnaire de tâches de Windows, puis de relancer le programme

0
androidXP

Juste un commentaire d’avant, avant d’ajouter le support pour 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 réalité le entier FacebookSDK - donc si vous avez besoin, par exemple, uniquement de Google Analytics, vous devez le remplacer par:

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

options du SDK partiel de Facebook

0
Gal Rom