web-dev-qa-db-fra.com

Problème DexIndexOverflowException après la mise à jour vers la dernière bibliothèque appcompat et support

J'utilise les paramètres ci-dessous via 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

J'ai également les paramètres suivants dans mon fichier Gradle:

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'

J'ai toujours l'erreur UNEXPECTED TOP LEVEL EXCEPTION.
Mais quand je fais le 21.0.0 à 20.0.0 ça marche très bien ... mais je ne peux accéder à aucune des Android API 21. Y a-t-il un problème que je me trompe ici? Comment puis-je le compiler sans cette exception? Je n’ai les bocaux d’appui nulle part ailleurs en dehors des autres projets (facebook, etc.).

Voici la trace de pile complète:

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)
73
KVISH

Ce message semble indiquer que votre projet est trop volumineux.

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

Depuis le plugin Gradle 0.14.0 et Build Tools 21.1.0, vous pouvez utiliser le support multidex .

Ajoutez juste ces lignes dans le build.gradle:

Android {

    defaultConfig {
        ...

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

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

Également dans votre Manifest ajouter 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"> 
        ...
    </application>
</manifest>

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

148
Gabriele Mariotti

1) ajouter une dépendance au fichier build.gradle de l'application

compile 'com.Android.support:multidex:1.0.2'

2) Si vous ne remplacez pas la classe Application, modifiez votre fichier manifeste pour définir Android: name dans la balise comme suit:

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

Si vous remplacez la classe Application, changez-la pour étendre MultiDexApplication (si possible) comme suit:

public class MyApplication extends MultiDexApplication { ... }

Ou bien, si vous substituez la classe Application mais qu'il n'est pas possible de modifier la classe de base, vous pouvez alors remplacer la méthode attachBaseContext () et appeler MultiDex.install (this) pour activer multidex:

public class MyApplication extends SomeOtherApplication {
  @Override
  protected void attachBaseContext(Context base) {
     super.attachBaseContext(base);
     MultiDex.install(this);
  }
}

3) Ajoutez le support multidex à defaultConfig à build.gradle

defaultConfig {
        ...
        minSdkVersion 16
        targetSdkVersion 26
        ...
        // Enabling multidex support.
        multiDexEnabled true
    }
...
45
georgehardcore

Avant de jouer avec MultiDex

Soit la solution est trop grosse (utilisez MultiDex), soit vous compilez et incluez dans votre projet des choses inutiles. J'ai eu ce problème sur mon petit projet. Voici ce que j'ai fait pour le réparer:

J'ai enlevé ceci de build.gradle:

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
}

Et j'ai manuellement supprimé mon dossier de construction à la racine de l'application. Problème résolu.

3
Andrei

Suivez this guide pour contourner la limite de 65K.

J'ai résolu ce problème en réglant multiDexEnabled true et prolonger mon application avec class MyApp extends MultiDexApplication

2
Iñaqui

J'ai fait face à ce problème lorsque j'ai compilé l'intégralité du package des API de services Google Play dans mon application. J'ai résolu le problème en utilisant une API sélective.

Par exemple, pour inclure uniquement les API Google Fit et Android Wear, remplacez la ligne suivante dans votre fichier build.gradle:

compile 'com.google.Android.gms:play-services:11.0.2'

avec ces lignes:

compile 'com.google.Android.gms:play-services-fitness:11.0.2'
compile 'com.google.Android.gms:play-services-wearable:11.0.2'

Le problème est expliqué dans la suite lien .

0
Gaurav Gupta

D'abord, assurez-vous que la minification est activée dans app/build.cradle:

buildTypes {
    release {
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-Android.txt'), 'proguard-rules.pro'
        signingConfig signingConfigs.config
    }
    debug {
        signingConfig signingConfigs.config
    }
}

Si cela ne résout pas le problème, activez multidex build pour votre application.

0
atomsymbol

J'ai simplement commenté la compilation filetree(include: ['*.jar'], dir: 'libs') dans le build.gradle fichier (comme suggéré ci-dessus) et reconstruit le projet. Compilé sans aucune erreur. Je n'ai pas eu besoin de déplacer des dossiers.

0
Earl Allen