web-dev-qa-db-fra.com

Problème Multidex avec Flutter

Je reçois l'erreur suivante lors de la compilation avec gradle à l'aide de Flutter dans Android Studio:

Dex: Error converting bytecode to dex:
Cause: com.Android.dex.DexException: Multiple dex files define Lcom/google/Android/gms/internal/zzcew;
UNEXPECTED TOP-LEVEL EXCEPTION:
com.Android.dex.DexException: Multiple dex files define Lcom/google/Android/gms/internal/zzcew;

[... stacktrace omitted for brevity ...]

* What went wrong:
Execution failed for task ':app:transformDexArchiveWithDexMergerForDebug'.
> com.Android.build.api.transform.TransformException: com.Android.dex.DexException: Multiple dex files define Lcom/google/Android/gms/internal/zzcew;

La version courte

Cela ne se produit que si j'ajoute suffisamment de dépendances, comme on pourrait s'y attendre. J'ai activé le multidex et ajouté la dépendance multidex dans le projet Android _ build.gradle fichier selon les instructions ( https://developer.Android.com/studio/build/multidex.html ), mais je ne savais pas quoi faire à propos de l'étape 2 de "Configurer votre application pour multidex "pour une application Flutter, ou même si l'omission de cette étape était le problème.

Étapes pour recréer:

  1. Sélectionnez File/New/New Flutter Project dans la barre d'outils
  2. Sélectionnez "Application Flutter"
  3. Inclure Kotlin & Swift
  4. Vérifiez que l'application se compile et s'exécute
  5. Ajoutez ce qui suit aux dépendances dans pubspec.yaml:

    dependencies:
      flutter_google_place_picker: "^0.0.1"
      location: "^1.2.0"
    
  6. Frappé Packages Get dans Android Studio ou exécutez flutter packages get dans le répertoire du projet
  7. Modifier Android/app/build.gradle pour ajouter les sections suivantes aux endroits appropriés:

    dependencies {
      compile 'com.Android.support:multidex:1.0.1'
    }
    Android {
        defaultConfig {
            multiDexEnabled true
        }
    }
    
  8. Sélectionnez Run/Run dans la barre d'outils

D'autres choses que j'ai essayées

  1. Remplacement de la dépendance "compiler" dans build.gradle avec chacun des éléments suivants:

    compile 'com.Android.support:multidex:1.0.3'
    implementation 'com.Android.support:multidex:1.0.1'
    implementation 'com.Android.support:multidex:1.0.3'
    
  2. Suivre les étapes multidex pour chacune de mes dépendances; c'est-à-dire en modifiant leur build.gradle fichiers, activant le multidex et ajoutant la dépendance multidex.

  3. Modification de minSdkVersion en chacun de 21 et 27 dans chacun des build.gradle fichiers pour mon projet et ses dépendances, et activation de multidex pour eux.
  4. Activation de la minification pour mon projet.
  5. Remplacement de location: "^1.2.0" avec geolocation: "^0.2.1"
  6. Ne pas activer le multidex du tout (c.-à-d. Sauter l'étape 7 de la recréation). Il en résulte l'erreur suivante:

    FAILURE: Build failed with an exception.
    
    * What went wrong:
    Execution failed for task ':app:transformDexArchiveWithExternalLibsDexMergerForDebug'.
    > Java.lang.RuntimeException: Java.lang.RuntimeException: com.Android.builder.dexing.DexArchiveMergerException: Unable to merge dex
    

Sortie Flutter Doctor

$ flutter doctor -v
[√] Flutter (Channel beta, v0.2.8, on Microsoft Windows [Version 10.0.16299.371], locale en-GB)
    • Flutter version 0.2.8 at D:\flutter
    • Framework revision b397406561 (2 weeks ago), 2018-04-02 13:53:20 -0700
    • Engine revision c903c217a1
    • Dart version 2.0.0-dev.43.0.flutter-52afcba357

[√] Android toolchain - develop for Android devices (Android SDK 27.0.3)
    • Android SDK at C:\Users\Dave\AppData\Local\Android\sdk
    • Android NDK location not configured (optional; useful for native profiling support)
    • Platform Android-27, build-tools 27.0.3
    • Java binary at: D:\AndroidDev\jre\bin\Java
    • Java version OpenJDK Runtime Environment (build 1.8.0_152-release-1024-b02)
    • All Android licenses accepted.

[√] Android Studio (version 3.1)
    • Android Studio at D:\AndroidDev
    • Java version OpenJDK Runtime Environment (build 1.8.0_152-release-1024-b02)

[√] Connected devices (1 available)
    • Android SDK built for x86 64 • emulator-5554 • Android-x64 • Android 5.1.1 (API 22) (emulator)

• No issues found!
13
SpoonerNZ

Vos deux packages semblent en désaccord sur leurs dépendances transitives. L'un veut 11.6. +, L'autre veut 11. + de certaines dépendances des services de jeu. Étant donné que 11.6.2 et 11.8.0 sont disponibles, cela va se terminer par un conflit.

Si vous exécutez ./gradlew androidDependencies dans votre Android/, vous obtenez une liste du résultat de la résolution des dépendances, contenant, entre autres, les éléments suivants:

+--- :flutter_google_place_picker (variant: release)
+--- com.google.Android.gms:play-services-location:11.8.0@aar
+--- com.google.Android.gms:play-services-places:11.6.2@aar
+--- com.google.Android.gms:play-services-maps:11.6.2@aar
+--- com.google.Android.gms:play-services-base:11.8.0@aar
+--- com.google.Android.gms:play-services-tasks:11.8.0@aar
+--- com.google.Android.gms:play-services-basement:11.8.0@aar

Ces packages 11.6.2 et 11.8.0 ne fonctionneront pas ensemble. Pour résoudre ce problème, vous devez corriger vos dépendances pour qu'elles soient cohérentes, ou ajouter un remplacement de dépendance au niveau supérieur de votre Android/app/build.gradle fichier et espérons le meilleur:

configurations.all {
    resolutionStrategy {
        force 'com.google.Android.gms:play-services-places:11.8.0'
        force 'com.google.Android.gms:play-services-location:11.8.0'
    }
}
9
Mikkel Ravn

Si vous n'avez pas d'expérience dans le développement de l'application Android application, ces informations peuvent être utiles, sinon vous ne trouverez rien de nouveau.


Comment activer multidex pour le projet Flutter.

1) Activer le multidex.

Ouvrez project/app/build.gradle Et ajoutez les lignes suivantes.

defaultConfig {
    ...

    multiDexEnabled true
}

et

dependencies {
    ...

    implementation 'com.Android.support:multidex:1.0.3'
}

2) Activer Jetifier .

Ouvrez project/Android/app/gradle.properties Et ajoutez les lignes suivantes.

Android.useAndroidX=true
Android.enableJetifier=true

3) Créez une classe d'application personnalisée.

Si vous ne savez pas où créer le fichier, faites-le près de MainActivity par exemple project/Android/app/src/main/kotlin(or Java if you didn't enable kotlin)/your/great/pakage/appname/

exemple de kotlin: App.kt

package your.great.pakage.appname

import io.flutter.app.FlutterApplication
import Android.content.Context
import androidx.multidex.MultiDex

class App : FlutterApplication() {

    override fun attachBaseContext(base: Context) {
        super.attachBaseContext(base)
        MultiDex.install(this)
    }

}

Exemple Java: App.Java

package your.great.pakage.appname;

import io.flutter.app.FlutterApplication;
import Android.content.Context;
import androidx.multidex.MultiDex;

public class App extends FlutterApplication {

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

}

4) Remplacez le fichier d'application par défaut par nouveau.

Ouvrez project/Android/app/src/main/AndroidManifest.xml

Remplacez Android:name="io.flutter.app.FlutterApplication" Par Android:name=".App"

19
Yuri Misyac