Flutter:shrinker 可能未能优化 Java 字节码

Posted

技术标签:

【中文标题】Flutter:shrinker 可能未能优化 Java 字节码【英文标题】:Flutter :The shrinker may have failed to optimize the Java bytecode 【发布时间】:2020-06-29 21:12:58 【问题描述】:

我正在尝试将 cloud firestore 集成到 android 应用程序,但我得到的只是每次都出现这个错误

在为 x86 构建的 Android SDK 上以调试模式启动 lib/main.dart... 注意:/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

FAILURE:构建失败并出现异常。

出了什么问题: 任务 ':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获得更多帮助

在 6m 10s 内构建失败 [!] 压缩器可能未能优化 Java 字节码。 要禁用收缩器,请将 --no-shrink 标志传递给此命令。 要了解更多信息,请参阅:https://developer.android.com/studio/build/shrink-code 异常:Gradle 任务 assembleDebug 失败,退出代码为 1 退出(sigterm)

【问题讨论】:

请提供更多详细信息,您要执行什么操作?您正在关注教程或文档吗?以前有效吗?在出现这些错误消息之前是否对您的代码进行了更改? 【参考方案1】:

在应用的 build.gradle

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

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

【讨论】:

【参考方案2】:

您只需将 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"
 

它起作用了,或者我。 ;)

【讨论】:

【参考方案3】:

我在使用颤振编码时遇到过类似的问题,但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 模拟器中运行

【讨论】:

【参考方案4】:

这个问题有两种不同的答案,但我认为最合适的是@Sarang Pal 给出的答案 这是谷歌官方的解释:

Android 构建失败疑难解答:

如果您计划使用 Android 设备或模拟器进行开发,则需要处理多 dex 支持 - 否则,您的构建将失败并显示“无法将请求的类放入单个 dex 文件中”。

默认情况下,Flutter 支持 Android SDK v16(Jelly Bean,2012 年发布),但 multidex 并不真正适用于 Jelly Bean(尽管有可能)。配置 Jelly Bean 使其工作超出了本 Codelab 的范围,因此我们将最低目标 SDK 版本从 v16 更改为 v21(Lollipop,2014 年发布)。

更改最低目标 SDK 版本:

    打开 android/app/build.gradle,然后找到显示 minSdkVersion 16 的行。 将该行更改为 minSdkVersion 21。 保存文件。

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

【讨论】:

【参考方案5】:

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

// 将 minSdkVersion 从 16 更改为 21

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


【讨论】:

【参考方案6】:

只需将 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
    

【讨论】:

【参考方案7】:

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

重要提示:只需转到 app:level 模块 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 个方法(引用)。

试试这个,它可能会工作并最终解决这个问题 [!] The shrinker may have failed to optimize the Java bytecode. To disable the shrinker, pass the --no-shrink flag to this command.

希望!!!它有帮助。

【讨论】:

【参考方案8】:

转到 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

【讨论】:

【参考方案9】:

在 android\app\build.gradle 文件中: 只需将 minSdkVersion 16 更改为 21

minSdkVersion 21

它会正常工作的。

【讨论】:

【参考方案10】:

这是解决此问题的过程。

1:将位于android/app/build.gradle的部分代码改成这个

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
    

2:更改minSdkVersion 16 to 21

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

【讨论】:

【参考方案11】:

更改最低目标 SDK 版本:

    打开 android/app/build.gradle,然后找到显示 minSdkVersion 16 的行。 将该行更改为 minSdkVersion 21。 保存文件。

【讨论】:

【参考方案12】:

这是我的修复方法:

android 
    defaultConfig 
        multiDexEnabled true
    

【讨论】:

【参考方案13】:

就我而言,我已将这些行添加到 Android 中的应用级 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
        shrinkResources false
        minifyEnabled false
    

【讨论】:

【参考方案14】:

我尝试了上面的每一步,但没有成功。

最后,我在终端内用这些命令解决了:

$: flutter clean

$: flutter pub get

一切都像魅力一样。

【讨论】:

【参考方案15】:

defaultConfig 
        // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
        applicationId "com.example.placementapp"
        minSdkVersion 23 //replace 23
        targetSdkVersion 28
        versionCode flutterVersionCode.toInteger()
        versionName flutterVersionName
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    

【讨论】:

虽然此代码可能会解决问题,including an explanation 关于如何以及为什么解决问题将真正有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人。请编辑您的答案以添加解释并说明适用的限制和假设。【参考方案16】:

我也遇到过这个错误,当我第一次使用“cloud firestore”时,你应该改变你的“Android Level build.gradle”

Android 级别'build.gradle'

确保:

defaultConfig 
   "androidx.test.runner.AndroidJUnitRunner"
    multiDexEnabled true



dependencies 
    implementation 'com.android.support:multidex:1.0.3'

【讨论】:

以上是关于Flutter:shrinker 可能未能优化 Java 字节码的主要内容,如果未能解决你的问题,请参考以下文章

如何使用最新的 R8 Shrinker 版本

如何使用新的 Android 2.0 Shrinker 并将 useProguard 设置为 false?

在 Android Studio 中启用 R8 Shrinker 时超出 GC 开销限制

Flutter Firebase - 未能正确删除经过 Google 身份验证的用户

Flutter 网络搜索引擎SEO优化友好

如何解决 Flutter 应用上的 Google Play 未优化 APK 问题?