为什么发布版本抛出错误,但在 buildType 相同时不调试?(安卓分级构建类型)



我试图弄清楚为什么我无法使用Android Studio正确安装发布版本。这是我的构建类型块:

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 显然我对谷歌 YT 服务的实现导致创建了一个内部库,所以依赖于导入的库是多余的?这仍然使我的问题有效。为什么调试有效,但在没有任何不同声明的情况下发布无效?

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

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

最新更新