[英]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步,或者甚至是该步骤的遗漏是否是问题所在。
File/New/New Flutter Project
将以下内容添加到pubspec.yaml
的依赖项中:
dependencies: flutter_google_place_picker: "^0.0.1" location: "^1.2.0"
Packages Get
或在项目目录中运行flutter packages get
修改android/app/build.gradle
在适当的地方添加以下部分:
dependencies { compile 'com.android.support:multidex:1.0.1' } android { defaultConfig { multiDexEnabled true } }
Run/Run
将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'
遵循我的每个依赖项的 multidex 步骤; 即修改他们的build.gradle
文件,启用 multidex 并添加 multidex 依赖项。
build.gradle
文件中将 minSdkVersion 修改为 21 和 27 中的每一个,并为它们启用 multidex。location: "^1.2.0"
替换为geolocation: "^0.2.1"
根本不启用 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!
如何为 Flutter 项目启用multidex 。
打开[project_folder]/app/build.gradle
并添加以下行。
defaultConfig {
...
multiDexEnabled true
}
和
dependencies {
...
implementation 'com.android.support:multidex:1.0.3'
}
打开[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'
}
}
multidex支持是自动启用的。 如果您的应用支持低于 21 的 Android SDK 版本,并且超过了 64K 方法限制,只需将--multidex
标志传递给flutter build appbundle
或flutter build apk
,您的应用就会支持 multidex。
在<projectName>\android\app\build.gradle
确保将minSdkVersion
设置为 21
defaultConfig {
...
minSdkVersion 21 // or 20 may be fine
...
}
无需将multiDexEnabled
设置为true
,就好像该应用程序仅针对 Android 21 或更高版本 (minSdkVersion),然后默认情况下已启用multidex
。
在您的应用级别 build.gradle 文件中
将 minSdkVersion 从 16 增加到 20。
启用 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 版本上进行更改。 按照这个链接
如果您通过 USB 安装,请务必在设备请求许可时单击安装按钮,这就是我的解决方案。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.