android - 为什么发布构建抛出错误,但在 buildTypes 相同时不进行调试? (Android gradle 构建类型)

标签 android android-gradle-plugin build.gradle android-build-flavors android-build-type

我想弄清楚为什么我无法使用 Android Studio 正确安装发布版本。这是我的 buildTypes block :

buildTypes {
    debug {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'),
                'proguard-rules.pro'
    }
    release {
        shrinkResources false
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'),
                'proguard-rules.pro'
    }
}

这些是我的产品口味:

flavorDimensions "version"
productFlavors {
    free {
        applicationId "com.example.app.free"
        dimension "version"
        signingConfig signingConfigs.config
    }
    paid {
        applicationId "com.example.app.paid"
        dimension "version"
        signingConfig signingConfigs.config
    }
}

当我安装调试付费或免费版本时,一切都很好。完全没有错。当我尝试安装发行版本(付费或免费)时,我得到:

'Execution failed for task ':app:transformDexArchiveWithDexMergerForFreeRelease'. com.android.build.api.transform.TransformException: java.lang.RuntimeException: java.lang.RuntimeException: com.android.builder.dexing.DexArchiveMergerException: Error while merging dex archives: ... Learn how to resolve the issue at https://developer.android.com/studio/build/dependencies#duplicate_classes. Program type already present: com.google.android.youtube.player.YouTubeApiServiceUtil'

我的问题是:为什么重复类异常只发生在发布期间,而我在发布和调试 buildType 之间没有定义任何不同的东西?

编辑 我已经通过删除 gradle 中的 YouTubePlayer 库依赖项解决了这个问题(b/c 显然我对 google YT 服务的实现导致创建了一个内部库,因此取决于进口的是多余的?)。这仍然使我的问题有效。为什么在没有任何不同声明的情况下调试有效,但发布却无效?

最佳答案

当我在其 assemble 上添加另一个(间接)依赖项时,我在链接另一个模块时遇到了同样的问题。 (Protobuf 模块需要从 .proto 文件生成 Java 文件,然后应用程序模块才能生成其 JSON 模型)。似乎assembleRelease以可能生成略有不同的方式优化代码 class文件取决于调用它的位置,Dex 合并无法决定 class 中的哪一个要使用的文件。 assembleDebug始终生成可以合并的相同(未优化)代码。

(对于任何与 Protobuf 有相同问题的人,解决方案是依赖于 :protobuf:GenerateProto 而不是 :protobuf:assemble 。)

关于android - 为什么发布构建抛出错误,但在 buildTypes 相同时不进行调试? (Android gradle 构建类型),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52829776/

相关文章:

gradle - 在gradle的buildscript中访问属性

gradle - 在项目 : 上找不到属性 'plugin'

android - Android Jetpack Compose 中数据类的更新策略

android - 在 Android Emulator API 24 Nougat 中更改 SimCountryIso

c# - 暂停不起作用(Unity c#)

安卓数据绑定(bind) : View flickering

android - 非 gradle 项目 Android Studio 0.4.5 中的 Gradle 警告

android - 为什么我无法正确导入facebook SDK?

android - com.squareup.okhttp3 库的 Gradle 依赖问题

android - Gradle构建永远不会在Android Studio中停止