Flutter: 缩小器可能未能优化 Java 字节码

23

我正在尝试将Cloud Firestore集成到Android应用程序中,但每次都会收到以下错误:

在调试模式下启动lib/main.dart在Android SDK built for x86上... 注意:/home/tr/DevTools/flutter/.pub-cache/hosted/pub.dartlang.org/cloud_firestore-0.13.4+2/android/src/main/java/io/flutter/plugins/firebase/cloudfirestore/CloudFirestorePlugin.java使用了未经检查或不安全的操作。 注意:重新编译使用-Xlint:unchecked获取详细信息。 D8:无法将所请求的类放入单个dex文件中(方法数:76095 > 65536) com.android.builder.dexing.DexArchiveMergerException:合并dex档案时出错: .dex文件中方法引用的数量不能超过64K

失败:构建失败。

  • 出了什么问题: 任务':app:mergeDexDebug'执行失败。

    在执行com.android.build.gradle.internal.tasks.Workers$ActionFacade时发生了故障 com.android.builder.dexing.DexArchiveMergerException:合并dex档案时出错: .dex文件中方法引用的数量不能超过64K。 了解如何解决此问题,请访问https://developer.android.com/tools/building/multidex.html

  • 尝试: 使用--stacktrace选项运行以获取堆栈跟踪。 使用--info或--debug选项运行以获取更多日志输出。 使用--scan运行以获取完整的洞察力。

  • 获取更多帮助请访问https://help.gradle.org

  • 构建失败,耗时6分钟10秒。 [!] 代码缩减可能未能优化Java字节码。 要禁用缩减器,请在此命令中添加--no-shrink标志。 欲了解更多信息,请参阅https://developer.android.com/studio/build/shrink-code 异常: Gradle任务assembleDebug以退出码1失败 已退出(sigterm)


    请提供更多细节,你试图执行什么操作?你是在遵循教程还是文档?之前它是否正常工作过?在这些错误信息出现之前,是否对你的代码进行了更改? - Kevin Quinzel
    16个回答

    86
    在应用的build.gradle文件中。

     defaultConfig {
            applicationId "com.company.test"
            minSdkVersion 16
            targetSdkVersion 28
            versionCode flutterVersionCode.toInteger()
            versionName flutterVersionName
            testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
     }
    

    将minSdkVersion从16更改为21,在我的情况下有效。


    28

    你只需要将 minsdkversion 改为 21,而不是 16

    android\app\build.gradle 文件中。

     defaultConfig {
            applicationId "com.company.example"
            minSdkVersion 21
            targetSdkVersion 28
            versionCode flutterVersionCode.toInteger()
            versionName flutterVersionName
            testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
     }
    

    对我有效。 ;)


    15

    我在使用Flutter编码时遇到了类似的问题,但出现了 BUILD FAILED in 9s Running Gradle task 'assembleDebug'...
    Running Gradle task 'assembleDebug'... Done 11.0s [!] The shrinker may have failed to optimize the Java bytecode. To disable the shrinker, pass the
    --no-shrinkflag to this command. To learn more, see: https://developer.android.com/studio/build/shrink-code Gradle task assembleDebug failed with exit code 1 的提示。

    不过我已经成功运行了我的应用程序,以下是我解决问题的步骤:

    1. 找到android/app/build.gradle文件 2. 在gradle文件中找到下面的代码

        buildTypes {
        release {
    
            // TODO: Add your own signing config for the release build.
            // Signing with the debug keys for now, so `flutter run --release` works.
            signingConfig signingConfigs.debug
        }
    }
    

    }

    并将其更改为

    buildTypes {
        debug {
            minifyEnabled true
    
            // TODO: Add your own signing config for the release build.
            // Signing with the debug keys for now, so `flutter run --release` works.
            signingConfig signingConfigs.debug
        }
    }
    

    该应用程序能够在Android模拟器中运行


    9
    这个问题有两种不同的答案,但我认为最合适的是由@Sarang Pal给出的答案。这是Google官方的解释:
    解决Android构建失败问题:
    如果您计划使用Android设备或模拟器进行开发,则需要处理multidex支持--否则,您的构建将因“无法将请求的类放入单个dex文件中”而失败。
    默认情况下,Flutter支持Android SDK v16(Jelly Bean,2012年发布),但multidex实际上不适用于Jelly Bean(尽管可能)。将Jelly Bean配置为工作超出了本codelab的范围,因此我们将最小目标SDK版本从v16更改为v21(Lollipop,2014年发布)。
    要更改最小目标SDK版本:
    1.打开android/app/build.gradle,然后找到说minSdkVersion 16的那一行。 2.将该行更改为minSdkVersion 21。 3.保存该文件。

    https://codelabs.developers.google.com/codelabs/flutter-firebase/index.html#3


    6

    导航到 {your-app-name}\android\app\build.gradle

    // 将 minSdkVersion 从 16 改为 21

    defaultConfig {
        applicationId "com.example.testapp"
        minSdkVersion 21 
        targetSdkVersion 29
        versionCode flutterVersionCode.toInteger()
        versionName flutterVersionName
    
    }
    

    5

    我尝试了上述所有步骤,但都没有成功。

    最终,我在终端中使用以下命令解决了问题:

    $: flutter clean
    
    $: flutter pub get
    

    一切都像魔法般顺利运行。


    5

    只需将 minSdkVersion 更改为 21,然后它就可以工作了。

    defaultConfig {
            // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
            applicationId "com.example.flutter_app"
            minSdkVersion 21
            targetSdkVersion 28
            versionCode flutterVersionCode.toInteger()
            versionName flutterVersionName
        }
    

    3

    最终,我以最简单的方式解决了这个问题!

    重要提示:只需进入 应用程序级别模块android/app/build.gradle 文件,并加上 multiDexEnabled true

    android {
    .
    .
    .
     defaultConfig {
            multiDexEnabled true
            // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
            applicationId "com.example.you_app_name"
            minSdkVersion 16
            targetSdkVersion 29
            versionCode flutterVersionCode.toInteger()
            versionName flutterVersionName
        }
    }
    

    Android应用默认支持SingleDex,这意味着您的应用程序最多只能有65536个方法(引用)。因此,multidexEnabled = true简单地意味着现在您可以在应用程序中编写超过65536个方法(引用)。

    可以尝试以下操作,它可能有效,并最终解决此问题:[!] 收缩程序可能未能优化Java字节码。要禁用收缩程序,请将--no-shrink标志传递给此命令。

    希望对您有所帮助。


    2
    在我的情况下,我已经在安卓应用级别的gradle文件中添加了这些行来禁用代码缩小(即minify)。
    buildTypes {
        release {
            // TODO: Add your own signing config for the release build.
            // Signing with the debug keys for now, so `flutter run --release` works.
            signingConfig signingConfigs.debug
            shrinkResources false
            minifyEnabled false
        }
    }
    

    2

    前往 android/app/build.gradle,然后复制并粘贴此内容,并更改应用程序 ID。

    defaultConfig {
        // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
        applicationId "your application id"
        minSdkVersion 21
        targetSdkVersion 29
        versionCode flutterVersionCode.toInteger()
        versionName flutterVersionName
    }
    

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