我在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;
只有在我添加足够的依赖项时才会出现这种情况,如预期的那样。我已根据说明(https://developer.android.com/studio/build/multidex.html)启用了multidex并在Android项目build.gradle
文件中添加了multidex依赖项,但不确定如何处理&#34中的第2步;为multidex"配置您的应用程序对于Flutter应用程序,甚至是否遗漏该步骤都是问题。
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'
遵循每个依赖项的多索引步骤;即修改他们的build.gradle
文件,启用multidex并添加multidex依赖。
build.gradle
文件中的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!
答案 0 :(得分:21)
2020年面向初学者的更新:
如果您可以将最低必需的Android API级别设置为21(在撰写本文时,您的应用仍可在94.1%的设备上运行)可以,那么您要做的就是:
打开您的“应用程序级别build.gradle文件”,该文件位于[您的项目] \ android \ app \ build.gradle
将16(或任何适合您的数字)更改为至少21:
defaultConfig {
// ...
minSdkVersion 16
// ...
}
...到:
defaultConfig {
// ...
minSdkVersion 21
// ...
}
您 不必进行任何其他修改 即可使multidex正常工作。
显然,新Flutter项目的默认minSDK设置为16,因此在pubspec.yaml中添加足够的依赖关系后,许多新开发人员将遇到multidex错误并开始在线搜索,可能陷入困惑,仅适用于最低级别设置为小于21的项目。
答案 1 :(得分:9)
你的两个包似乎在他们的传递依赖关系上存在分歧。一个想要11.6。+,另一个想要11. +一些播放服务依赖。由于11.6.2和11.8.0都在那里,所以最终会发生冲突。
如果您在./gradlew androidDependencies
文件夹中运行android/
,则会获得依赖项解析结果的列表,其中包含以下内容:
+--- :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'
}
}
答案 2 :(得分:9)
如何为抖动项目启用multidex。
1)启用多dex。
打开project/app/build.gradle
并添加以下行。
defaultConfig {
...
multiDexEnabled true
}
和
dependencies {
...
implementation 'com.android.support:multidex:1.0.3'
}
2)启用Jetifier。
打开project/android/app/gradle.properties
并添加以下行。
android.useAndroidX=true
android.enableJetifier=true
3)创建自定义应用程序类。
如果您不知道在哪里创建文件,请在MainActivity
附近进行创建,例如project/android/app/src/main/kotlin(or java if you didn't enable kotlin)/your/great/pakage/appname/
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)
}
}
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)将默认应用程序文件更改为新建。
打开project/android/app/src/main/AndroidManifest.xml
将android:name="io.flutter.app.FlutterApplication"
更改为android:name=".App"
答案 3 :(得分:0)
在android中的应用文件夹中
defaultConfig {
...
multiDexEnabled true
}
答案 4 :(得分:0)
在您的应用级别的build.gradle文件中
将minSdkVersion从16增加到20。
启用multiDex。
defaultConfig {
...
minSdkVersion 20 //Copy this
multiDexEnabled true //Copy this
}
答案 5 :(得分:0)
只需更改app \ build.gradle中的行
rollDie()
不添加任何依赖项 我首先添加了multidex依赖项,但是程序说找不到它 然后,我将maven添加到build.gradle中,但未做任何更改
实际上您需要将false更改为true Android Studio会休息
答案 6 :(得分:-1)
如果您通过USB安装,请确保在设备要求许可时单击安装按钮,这是我的解决方案。