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;
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.
File/New/New Flutter Project
dans la barre d'outilsAjoutez ce qui suit aux dépendances dans pubspec.yaml
:
dependencies:
flutter_google_place_picker: "^0.0.1"
location: "^1.2.0"
Packages Get
dans Android Studio ou exécutez flutter packages get
dans le répertoire du projetModifier 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
}
}
Run/Run
dans la barre d'outilsRemplacement 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'
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.
build.gradle
fichiers pour mon projet et ses dépendances, et activation de multidex pour eux.location: "^1.2.0"
avec geolocation: "^0.2.1"
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
$ 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!
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'
}
}
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"