Flutter 的 Multidex 问题

新手上路,请多包涵

在 Android Studio 中使用 Flutter 编译 gradle 时出现以下错误:

 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;

短版

仅当我添加足够的依赖项时才会发生这种情况,正如预期的那样。我已启用 multidex 并在 Android 项目 build.gradle 文件中添加了 multidex 依赖项( https://developer.android.com/studio/build/multidex.html ),但不确定对于 Flutter 应用程序的“为 multidex 配置您的应用程序”中的第 2 步该怎么做,甚至该步骤的遗漏是否是问题所在。

重建步骤:

  1. 从工具栏中选择 File/New/New Flutter Project
  2. 选择“颤振应用程序”
  3. 包括 Kotlin 和 Swift 支持
  4. 检查应用程序编译和运行
  5. 将以下内容添加到 pubspec.yaml 的依赖项中:
    dependencies:
     flutter_google_place_picker: "^0.0.1"
     location: "^1.2.0"

  1. 在 Android Studio 中点击 Packages Get 或在项目目录中运行 flutter packages get
  2. 修改 android/app/build.gradle 在合适的地方添加以下部分:
    dependencies {
     compile 'com.android.support:multidex:1.0.1'
   }
   android {
       defaultConfig {
           multiDexEnabled true
       }
   }

  1. 从工具栏中选择 Run/Run

我尝试过的其他事情

  1. build.gradle 中的“编译”依赖项替换为以下各项:
    compile 'com.android.support:multidex:1.0.3'
   implementation 'com.android.support:multidex:1.0.1'
   implementation 'com.android.support:multidex:1.0.3'

  1. 遵循我的每个依赖项的 multidex 步骤;即修改他们的 build.gradle 文件,启用multidex并添加multidex依赖。

  2. 在我的项目及其依赖项的每个 build.gradle 文件中将 minSdkVersion 修改为 21 和 27 中的每一个,并为它们启用 multidex。

  3. 为我的项目启用缩小。

  4. location: "^1.2.0" 替换为 geolocation: "^0.2.1"

  5. 根本不启用 multidex(即跳过重新创建的第 7 步)。这会导致以下错误:

    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!

原文由 SpoonerNZ 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.3k
2 个回答

你的两个包似乎不同意它们的传递依赖关系。一个想要 11.6.+,另一个想要 11.+ 的一些播放服务依赖项。由于 11.6.2 和 11.8.0 都在那里,这将导致冲突。

如果您在 android/ 文件夹中运行 ./gradlew androidDependencies ,您将获得依赖解析结果的列表,其中包含以下内容:

 +--- :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

这些 11.6.2 和 11.8.0 包不能一起工作。要解决此问题,您需要修补您的依赖项以相互保持一致,或者将依赖项覆盖添加到您的 android/app/build.gradle 文件的顶层并希望最好:

 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'
    }
}

原文由 Mikkel Ravn 发布,翻译遵循 CC BY-SA 3.0 许可协议

TL;博士

将您的 build.gradle 更新为 minSdkVersion 21

Android 5.0 及更高版本使用名为 ART 的运行时,它本机支持从 APK 文件加载多个 DEX 文件。

支持旧版本的安卓

如果您想在 Android 5.0(API 级别 21)之前支持 Multidex,请查看上述 文档

在此处输入图像描述

原文由 genericUser 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题