Flutter专案超过.dex方法参考计数限制

时间:2018-07-24 00:59:51

标签: android flutter

为什么Flutter项目的.dex文件中的 <64> 方法引用超过了

我想知道是什么原因造成的:
较小的 Flutter项目中,我使用了13个 plugins 。如果没有Multidex,则Android构建会失败,因为它大大超出了方法引用限制。

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

7 个答案:

答案 0 :(得分:7)

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

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

您可以参考this以获得更多信息。

答案 1 :(得分:3)

Use ProGuard以在编译时消除未使用的类。这样可以大大减少方法数量。

您需要调整ProGuard规则以像Flutter documentation explains here这样与Flutter一起使用。

答案 2 :(得分:1)

在您的android/app/build文件中

defautConfig 下将minsdjversion从16增加到21。 有些人甚至将其增加到28,但对我来说21岁就起作用了。 这是指向issue on git

的链接

编辑:multiDexEnabled: true也可以在相同的 defautConfig 下使用。

答案 3 :(得分:1)

还有另一种解决方案,没有multidex或增加了最小SDK。但这需要R8,只需在应用程序级别build.gradle启用minify

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

来自github comment 或运行调试而不缩小github comment

 buildTypes {
            release {
                 minifyEnabled true
            }
            debug {
                defaultConfig.minSdkVersion 21
            }  
        } 

答案 4 :(得分:1)

在build.gradle的defaultConfig下添加multiDexEnabled true

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

答案 5 :(得分:0)

我已使用下面的链接和第二步成功地将应用迁移到了 androidx

1)Flutter Projects & Android X Migration Issues

2)在您的android / app / build文件中,将defaults下的minsdkversion从16增加到21。有些人甚至将其增加到28个,但它对我来说是21点。

答案 6 :(得分:0)

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

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"
    }