D8:无法将所需的类放入单个dex文件中。

30

我正在尝试添加以下依赖项:

  firebase_auth: ^0.14.0+5
  google_sign_in: ^4.0.7
  cloud_firestore: ^0.12.9+5
  fluttertoast: ^3.1.3
  image_picker: ^0.6.1+8
  shared_preferences: ^0.5.3+4
  firebase_storage: ^3.0.6
  cached_network_image: 2.0.0-rc.1
  firebase_messaging: 6.0.13
  flutter_local_notifications: 1.4.0
  photo_view: ^0.5.0

我发现了这个错误:

D8: Cannot fit requested classes in a single dex file (# methods: 85948 > 65536)
com.android.builder.dexing.DexArchiveMergerException: Error while merging dex archives:      
The number of method references in a .dex file cannot exceed 64K.       
Learn how to resolve this issue at https://developer.android.com/tools/building/multidex.html
        at com.android.builder.dexing.D8DexArchiveMerger.getExceptionToRethrow(D8DexArchiveMerger.java:131)
        at com.android.builder.dexing.D8DexArchiveMerger.mergeDexArchives(D8DexArchiveMerger.java:118)
        at com.android.build.gradle.internal.transforms.DexMergerTransformCallable.call(DexMergerTransformCallable.java:102)
        at com.android.build.gradle.internal.tasks.DexMergingTaskRunnable.run(DexMergingTask.kt:444)
        at com.android.build.gradle.internal.tasks.Workers$ActionFacade.run(Workers.kt:335)
        at org.gradle.workers.internal.AdapterWorkAction.execute(AdapterWorkAction.java:50)
        at org.gradle.workers.internal.DefaultWorkerServer.execute(DefaultWorkerServer.java:47)
        at org.gradle.workers.internal.NoIsolationWorkerFactory$1$1$1.create(NoIsolationWorkerFactory.java:65)
        at org.gradle.workers.internal.NoIsolationWorkerFactory$1$1$1.create(NoIsolationWorkerFactory.java:61)
        at org.gradle.internal.classloader.ClassLoaderUtils.executeInClassloader(ClassLoaderUtils.java:98)
        at org.gradle.workers.internal.NoIsolationWorkerFactory$1$1.execute(NoIsolationWorkerFactory.java:61)
        at org.gradle.workers.internal.AbstractWorker$1.call(AbstractWorker.java:44)
        at org.gradle.workers.internal.AbstractWorker$1.call(AbstractWorker.java:41)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:416)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:406)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$1.execute(DefaultBuildOperationExecutor.java:165)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:250)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:158)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:102)
        at org.gradle.internal.operations.DelegatingBuildOperationExecutor.call(DelegatingBuildOperationExecutor.java:36)
        at org.gradle.workers.internal.AbstractWorker.executeWrappedInBuildOperation(AbstractWorker.java:41)
        at org.gradle.workers.internal.NoIsolationWorkerFactory$1.execute(NoIsolationWorkerFactory.java:56)
        at org.gradle.workers.internal.DefaultWorkerExecutor$3.call(DefaultWorkerExecutor.java:215)
        at org.gradle.workers.internal.DefaultWorkerExecutor$3.call(DefaultWorkerExecutor.java:210)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.runExecution(DefaultConditionalExecutionQueue.java:215)
        at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.runBatch(DefaultConditionalExecutionQueue.java:164)
        at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.run(DefaultConditionalExecutionQueue.java:131)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
        at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:56)
        at java.lang.Thread.run(Thread.java:748)
Caused by: com.android.tools.r8.CompilationFailedException: Compilation failed to complete
        at com.android.tools.r8.utils.t.a(:55)
        at com.android.tools.r8.D8.run(:11)
        at com.android.builder.dexing.D8DexArchiveMerger.mergeDexArchives(D8DexArchiveMerger.java:116)
        ... 34 more
Caused by: com.android.tools.r8.utils.AbortException: Error: null, Cannot fit requested classes in a single dex file (# methods: 85948 > 65536)
        at com.android.tools.r8.utils.Reporter.a(:21)
        at com.android.tools.r8.utils.Reporter.a(:7)
        at com.android.tools.r8.dex.VirtualFile.a(:33)
        at com.android.tools.r8.dex.VirtualFile$h.a(:5)
        at com.android.tools.r8.dex.ApplicationWriter.a(:13)
        at com.android.tools.r8.dex.ApplicationWriter.write(:35)        
        at com.android.tools.r8.D8.d(:44)
        at com.android.tools.r8.D8.b(:1)
        at com.android.tools.r8.utils.t.a(:23)
        ... 36 more


FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:mergeDexDebug'.
> A failure occurred while executing com.android.build.gradle.internal.tasks.Workers$ActionFacade
   > com.android.builder.dexing.DexArchiveMergerException: Error while merging dex archives: 
     The number of method references in a .dex file cannot exceed 64K.
     Learn how to resolve this issue at https://developer.android.com/tools/building/multidex.html

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Get more help at https://help.gradle.org

BUILD FAILED in 51s
Running Gradle task 'assembleDebug'...
Running Gradle task 'assembleDebug'... Done                        53.6s
[!] The shrinker may have failed to optimize the Java bytecode.
    To disable the shrinker, pass the `--no-shrink` flag to this command.
    To learn more, see: https://developer.android.com/studio/build/shrink-code
Exception: Gradle task assembleDebug failed with exit code 1

这是我的完整的pubspec.yaml文件。

name: aradi_online_vtwo
description: A new Flutter project.
https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
version: 1.0.0+1

environment:
  sdk: ">=2.7.0 <3.0.0"

dependencies:
  flutter:
    sdk: flutter
  provider: ^3.0.0
  intl: ^0.15.8
  flutter_speed_dial: ^1.2.1
  font_awesome_flutter: ^8.5.0
  smooth_star_rating: ^1.0.3
  firebase_auth: ^0.14.0+5
  google_sign_in: ^4.0.7
  cloud_firestore: ^0.12.9+5
  fluttertoast: ^3.1.3
  image_picker: ^0.6.1+8
  shared_preferences: ^0.5.3+4
  firebase_storage: ^3.0.6
  cached_network_image: 2.0.0-rc.1
  firebase_messaging: 6.0.13
  flutter_local_notifications: 1.4.0
  photo_view: ^0.5.0

  # The following adds the Cupertino Icons font to your application.
  # Use with the CupertinoIcons class for iOS style icons.
  cupertino_icons: ^0.1.2

dev_dependencies:
  flutter_test:
    sdk: flutter


# For information on the generic Dart part of this file, see the
# following page: https://www.dartlang.org/tools/pub/pubspec

# The following section is specific to Flutter.
flutter:

  # The following line ensures that the Material Icons font is
  # included with your application, so that you can use the icons in
  # the material Icons class.
  uses-material-design: true

  # To add assets to your application, add an assets section, like this:
  assets:
    - assets/images/
    - assets/design_course/
    - assets/fitness_app/
    - assets/hotel/

  # An image asset can refer to one or more resolution-specific "variants", see
  # https://flutter.dev/assets-and-images/#resolution-aware.

  # For details regarding adding assets from package dependencies, see
  # https://flutter.dev/assets-and-images/#from-packages

  # To add custom fonts to your application, add a fonts section here,
  # in this "flutter" section. Each entry in this list should have a
  # "family" key with the font family name, and a "fonts" key with a
  # list giving the asset and other descriptors for the font. For
  # example:
  fonts:
    - family: WorkSans
      fonts:
        - asset: assets/fonts/WorkSans-Regular.ttf
        - asset: assets/fonts/WorkSans-Medium.ttf
          weight: 500
        - asset: assets/fonts/WorkSans-SemiBold.ttf
          weight: 600
        - asset: assets/fonts/WorkSans-Bold.ttf
          weight: 700
    - family: Roboto
      fonts:
        - asset: assets/fonts/Roboto-Bold.ttf
        - asset: assets/fonts/Roboto-Regular.ttf
        - asset: assets/fonts/Roboto-Medium.ttf
          weight: 400
  # For details regarding fonts from package dependencies,
  # see https://flutter.dev/custom-fonts/#from-packages

那么我该如何解决这个问题呢?

7个回答

87
在您的应用级 build.gradle 文件中添加 multiDex。 在 defaultConfig 下面添加这一行。
multiDexEnabled true

然后在依赖项中添加multidex并检查版本号

implementation 'androidx.multidex:multidex: 2.0.1'

6
我尝试只使用'multiDexEnabled',这样做有效。但我认为它并不必要。只需将'minSdkVersion'设置为21,就可以完成工作。 - Anand
1
这可能是一个新的开发问题,但上面的答案允许您使用超过65,536个方法的引用库。可能是Android版本的问题。 - king mort

21

基本上,当您的应用程序和其引用的库超过65,536个方法时,就会出现此错误。构建错误只是意味着您的应用程序已达到Android构建架构的限制。因此,要修复此问题,请前往android/app/build.gradle目录并按如下方式添加multiDexEnabled trueimplementation 'com.android.support:multidex:2.0.1'

defaultConfig {
        // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
        ........
        multiDexEnabled true
    }


dependencies {
    ...........
    implementation 'com.android.support:multidex:2.0.1'
}

当然,你需要重新启动你的Android Studio或者你正在使用的平台。


18

将最小 SDK 版本升级至21

我遇到了同样的问题,使用 Multi dex 无法解决它。 将最小 SDK 版本升级至21 解决了我的问题。

 defaultConfig {
    ...
    minSdkVersion 21
    targetSdkVersion 30
    multiDexEnabled
}



 dependencies {
     ...
    implementation 'androidx.multidex:multidex:2.0.1'
}

7
你只需要按照Firebase官方团队在这个视频的04:45处所述,将minSdkVersion更新为21。你不需要使用implementation 'androidx.multidex:multidex:2.0.1' - Alexa289
multiDexEnabled true enough and change to minSdkVersion 21 - lava
通过将minSdkVersion更改为21,问题已经解决。不需要进行其他更改。 - byezy

2

启用multidex的更简单方法是运行-

flutter run --debug 

在命令行中。当提示时,只需输入y


不敢相信这个答案没有引起注意。这显然是一个更好、更强大的答案。 - beedrill

1
如果以上方法都不起作用,只需在应用 gradle(build gradle)中增加一个东西:将 minsdkversion 递增。例如,如果它是20,则改为21或增加1-2。这对我很有效。

0
在我的情况下,在添加了上述代码行之后,应用程序无法构建,因此我有
           shrinkResources true
           minifyEnabled true
           proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'

       }
       debug {
           proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'

           minifyEnabled true
           shrinkResources true
       }

proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'),'proguard-rules.pro' 这行代码丢失了,我添加上了


0
如果您使用版本为7.4.0的Android插件,则需要将minifyEnabled true添加到debug{}块中。

id 'com.android.application' version '7.4.0'

buildTypes {
        release { ... }
        debug {
            // 'com.android.application' version '7.4.0' 需要(奇葩)
            minifyEnabled true

            applicationIdSuffix ".debug"
            versionNameSuffix "-debug"
        }
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接