多指数问题与扑动

我在 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 依赖,但是不确定对于 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. Hit Packages Get in Android Studio or run flutter packages get in the project directory
  7. Modify android/app/build.gradle to add the following sections in the appropriate places:

    dependencies {
    compile 'com.android.support:multidex:1.0.1'
    }
    android {
    defaultConfig {
    multiDexEnabled true
    }
    }
    
  8. Select Run/Run from the toolbar

Other things I've tried

  1. Replacing the "compile" dependency in build.gradle with each of the following:

    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. Following the multidex steps for each of my dependencies; i.e. modifying their build.gradle files, enabling multidex and adding the multidex dependency.

  3. Modifying minSdkVersion to each of 21 and 27 in each of the build.gradle files for my project and its dependencies, and enabling multidex for them.
  4. Enabling minifying for my project.
  5. Replacing location: "^1.2.0" with geolocation: "^0.2.1"
  6. Not enabling multidex at all (i.e. skipping step 7 of recreating). This results in the following error:

    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 output

$ 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!
132857 次浏览

您的两个包似乎在传递依赖关系上存在分歧。一个要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'
}
}

如果您没有开发 Android 应用程序的经验,这些信息可能会有所帮助,否则您不会发现任何新的东西。


在大多数情况下,足够的资源可以完成第一步

如何为颤振项目启用 多指数

  1. 启用 multidex。

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

defaultConfig {
...


multiDexEnabled true
}

还有

dependencies {
...


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

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

android.useAndroidX=true
android.enableJetifier=true

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

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

使用文本编辑器,打开存在于[您的项目] android app build.gradle 中的“ app level build.gradle 文件”。

有一行以“ minSdkVersion”开头

改成:

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

致:

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

显然,21可以更高,如果你想,但不低。

你完了。

您的 不需要做任何其他的修改以便 multidex 正常工作。

显然,新的 Flutter 项目的缺省 minSDK 设置仍然是16,所以在 pubspec.yaml 中添加了足够的依赖项之后,许多新的开发人员会遇到 multidex 错误并在线搜索,可能会陷入旧的、令人困惑的信息中,这些信息只适用于最低级别设置为小于21的项目。

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

贾希杜尔 · 伊斯兰的回答, 以及弗朗西斯 · 恩杜巴 · 努比的答案。

他们有自己的优点和缺点,所以一定要看看他们回答下面的评论。

在你的应用程序文件夹内的安卓

defaultConfig {
...


multiDexEnabled true
}

还有 为具有超过64K 方法的应用程序启用 multidex

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

  1. 将 minSdkVersion 从16增加到20。

  2. 启用 multiDex。

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

只要更改 app build.gradle 中的行

defaultConfig{
multiDexEnabled true
}

不要添加任何依赖项 我首先添加了多索引依赖,但程序说找不到它 然后我将 Maven 添加到 build.gradle 中,但没有做任何更改

其实你需要改变虚假,真正的没有别的 Android 工作室会休息

如果你是通过 USB 安装,一定要点击安装按钮时,设备请求许可,这是我的情况下的解决方案。

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

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

没有必要将 multiDexEnabled设置为 true,因为如果应用程序只针对 Android 21或更高版本(minSdkVersion) ,那么 multidex在默认情况下已经启用。

建筑,梯度

defaultConfig
{
minSdkVersion 21
multiDexEnabled true
}




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

在 AndroidManifest.xml 中

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

从 Flutter 2.10开始

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

我通过更改 min SDK 版本来解决这个错误。以及如何在 Flutter 2.8和 Plus 版本中改变这一点。点击这个链接

如何更改 Flutter 2.8和 Plus 版本的 Flutter 版本

更新 build.gradle 到 minSdkVersion 21

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

支持旧版本的 Android

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

enter image description here

如果 minSdkVersion 设置为21或更高,则默认情况下启用 multidex,并且不需要 multidex 库。

但是,如果 minSdkVersion 设置为20或更低,那么必须使用 multidex 库并对应用程序项目进行以下修改:

修改模块级 build.gradle 文件以启用 multidex 并添加 multidex 库作为依赖项,如下所示:

android {
defaultConfig {
...
minSdk = 15
targetSdk = 28
multiDexEnabled = true
}
...
}


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

根据是否重写 Application 类,执行下列操作之一: 如果不覆盖 Application 类,请编辑清单文件以在标记中设置 android: name,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.myapp">
<application
android:name="androidx.multidex.MultiDexApplication" >
...
</application>
</manifest>

如果重写 Application 类,则将其更改为扩展 MultiDexApplication (如果可能) ,如下所示:

public class MyApplication extends MultiDexApplication { ... }

或者,如果您确实重写了 Application 类,但是不可能更改基类,那么您可以重写 attachBaseContext ()方法和 callMultiDex.install (this)来启用 multidex:

public class MyApplication extends SomeOtherApplication {
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
}
}

更多信息请查看 这个博客