【问题标题】:Flutter project exceeds .dex Method Reference Count limitFlutter 项目超过 .dex 方法引用计数限制
【发布时间】:2018-12-31 12:15:58
【问题描述】:

为什么 Flutter 项目在其 .dex 文件中超过 64K 方法引用?

我想知道这可能是什么原因:
在一个相当小的 Flutter 项目中,我使用了 13 个插件。如果没有Multidex,Android 构建会失败,因为它大大超出了方法引用限制。

是否有任何技巧(例如与 Gradle 相关)可以减少方法引用计数,因为我认为这样的项目不应超过限制?
如果您想进一步了解我认为这很奇怪的原因,请查看此问题的旧版本

【问题讨论】:

    标签: android flutter


    【解决方案1】:

    我遇到了同样的问题,我的解决方法是像这样在app/build.bradle 中增加minSdkVersion

    defaultConfig {
            // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
            minSdkVersion 21 // change this to 21
            targetSdkVersion 28
            versionCode flutterVersionCode.toInteger()
            versionName flutterVersionName
            testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        }
    

    【讨论】:

      【解决方案2】:

      如果您使用的minSdkVersion 小于21,您可以执行以下操作来启用multidex。 在您的应用级别 build.gradle 更改如下:

      1. multiDexEnabled true 添加到defaultConfig
      defaultConfig {
          minSdkVersion 15 
          targetSdkVersion 28
          ...
          multiDexEnabled true
      }
      
      1. 添加多索引依赖
      dependencies {
          ...
          implementation 'androidx.multidex:multidex:2.0.1'
      }
      

      您可以参考this了解更多信息。

      【讨论】:

        【解决方案3】:

        在您的 android/app/build 文件中,将 defautConfig 下的 minsdkversion 从 16 增加到 21。 有些人甚至将它增加到 28,但它在 21 岁时对我有用。 这是issue on git的链接

        编辑:multiDexEnabled: true 也适用于相同 defautConfig 下的某些人。

        【讨论】:

          【解决方案4】:

          在build.gradle的defaultConfig下添加multiDexEnabled true

              minSdkVersion 16
              targetSdkVersion 30
              versionCode flutterVersionCode.toInteger()
              versionName flutterVersionName
              multiDexEnabled true
          }
          

          【讨论】:

            【解决方案5】:

            Use ProGuard 在编译时消除未使用的类。这将大大减少您的方法数。

            您需要调整 ProGuard 规则以使用 Flutter,例如 Flutter documentation explains here

            【讨论】:

              【解决方案6】:

              还有另一种解决方案,不使用 multidex 或增加 min SDK。但它需要 R8,只需在 App 级别 build.gradle 上启用 minify

              buildTypes {
                      release {
                           minifyEnabled true
                      }
                      debug {
                          minifyEnabled true
                      }  
                  }
              

              来自github comment 或在不缩小 github comment

              的情况下运行调试
               buildTypes {
                          release {
                               minifyEnabled true
                          }
                          debug {
                              defaultConfig.minSdkVersion 21
                          }  
                      } 
              

              【讨论】:

                【解决方案7】:

                我使用以下链接和第二步成功将应用迁移到 androidx

                1) Flutter Projects & Android X Migration Issues

                2) 在您的 android/app/build 文件中,在 defaultConfig 下将 minsdkversion 从 16 增加到 21。有些人甚至将其增加到 28,但它在 21 岁时对我有用。

                【讨论】:

                • 关于第一步,最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生变化,该链接可能会失效,从而导致答案失效。
                猜你喜欢
                • 2016-09-22
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2016-08-15
                • 2013-07-17
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多