繁体   English   中英

Flutter 的 Multidex 问题

[英]Multidex issue with Flutter

在 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 App的“为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"
  6. 在 Android Studio 中点击Packages Get或在项目目录中运行flutter packages get
  7. 修改android/app/build.gradle在适当的地方添加以下部分:

     dependencies { compile 'com.android.support:multidex:1.0.1' } android { defaultConfig { multiDexEnabled true } }
  8. 从工具栏中选择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'
  2. 遵循我的每个依赖项的 multidex 步骤; 即修改他们的build.gradle文件,启用 multidex 并添加 multidex 依赖项。

  3. 在我的项目及其依赖项的每个build.gradle文件中将 minSdkVersion 修改为 21 和 27 中的每一个,并为它们启用 multidex。
  4. 为我的项目启用缩小。
  5. location: "^1.2.0"替换为geolocation: "^0.2.1"
  6. 根本不启用 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!

如果您没有开发 android 应用程序的经验,此信息可能会有所帮助,否则您将找不到任何新内容。


在大多数情况下,第一步就够了

如何为 Flutter 项目启用multidex

  1. 启用多索引。

打开[project_folder]/app/build.gradle并添加以下行。

defaultConfig {
    ...

    multiDexEnabled true
}

dependencies {
    ...

    implementation 'com.android.support:multidex:1.0.3'
}
  1. 启用Jetifier

打开[project_folder]/android/gradle.properties并添加以下行。

android.useAndroidX=true
android.enableJetifier=true

2022 年及以后的初学者开发者更新:

如果您的项目的最低 Android API 级别为 21(它将在 98% 的 Android 设备上运行),您所要做的就是:

使用文本编辑器,打开位于 [您的项目]\android\app\build.gradle 的“应用程序级 build.gradle 文件”。

有一行以“minSdkVersion”开头。

将其更改为:

defaultConfig {
        // ...
        minSdkVersion [whatever it says here, even if it is not a number]
        // ...
        }

至:

defaultConfig {
            // ...
            minSdkVersion 21
            // ...
            }

显然,如果您愿意,21 可以更高,但不能更低。

你完成了。

无需进行任何其他修改即可使multidex 正常工作。

显然,新 Flutter 项目的默认 minSDK 设置为 STILL 16,因此在 pubspec.yaml 中添加足够的依赖项后,许多新开发人员会遇到 multidex 错误并在线搜索,可能会陷入旧的、令人困惑的信息中,这些信息仅适用对于最低级别设置为低于 21 的项目。

这是最简单的解决方案,但还有其他方法:

Jahidul Islam 的回答在这里,Francis Nduba Numbi 的回答在这里

他们有自己的优点和缺点,所以一定要阅读他们答案下的评论。

你的两个包似乎不同意它们的传递依赖关系。 一个想要 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'
    }
}

从 Flutter 2.10 开始

multidex支持是自动启用的。 如果您的应用支持低于 21 的 Android SDK 版本,并且超过了 64K 方法限制,只需将--multidex标志传递给flutter build appbundleflutter build apk ,您的应用就会支持 multidex。

在你的应用程序文件夹中的 android

defaultConfig {
    ...

    multiDexEnabled true
}

另请查看:为具有超过 64K 方法的应用程序启用 multidex

<projectName>\android\app\build.gradle确保将minSdkVersion设置为 21

 defaultConfig {
        ...
        minSdkVersion 21 // or 20 may be fine
        ...
    }

无需将multiDexEnabled设置为true ,就好像该应用程序仅针对 Android 21 或更高版本 (minSdkVersion),然后默认情况下已启用multidex

在您的应用级别 build.gradle 文件中

  1. 将 minSdkVersion 从 16 增加到 20。

  2. 启用 multiDex。

     defaultConfig { ... minSdkVersion 20 //Copy this multiDexEnabled true //Copy this }

只需更改 app\build.gradle 中的行

defaultConfig{
multiDexEnabled true
}

不要添加任何依赖项我首先添加了multidex依赖项但程序说找不到它然后我将maven添加到build.gradle但没有做任何更改

实际上,您需要将 false 更改为 true 其他 Android Studio 不会休息

在 build.gradle

defaultConfig 
{
minSdkVersion 21
multiDexEnabled true
}


dependencies {
implementation("androidx.multidex:multidex:2.0.1")
}

在 AndroidManifest.xml 中

<application
android:name="androidx.multidex.MultiDexApplication">

我通过更改最小 SDK 版本解决了这个错误。 以及如何在 Flutter 2.8 和 plus 版本上进行更改。 按照这个链接

如何在 Flutter 2.8 及以上版本上更改 Flutter 版本

如果您通过 USB 安装,请务必在设备请求许可时单击安装按钮,这就是我的解决方案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM