android - 为什么发布构建抛出错误,但当 buildTypes 相同时不调试?(Android gradle 构建类型)
问题描述
我试图弄清楚为什么我无法使用 Android Studio 正确安装发布版本。这是我的 buildTypes 块:
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'
我的问题是:为什么重复类异常仅在发布期间发生,而我在发布和调试 buildTypes 之间没有定义任何不同?
编辑我已经通过删除 gradle 中的 YouTubePlayer 库依赖项解决了这个问题(b/c 显然我对 google YT 服务的实现导致了一个内部库的创建,所以依赖于导入的库是多余的吗?)。这仍然使我的问题有效。为什么调试工作正常,但没有任何声明不同时的发布?
解决方案
当我添加另一个(间接)依赖assemble
项(它是 Protobuf 模块,需要.proto
在应用程序模块生成其 JSON 模型之前从文件生成 Java 文件)时,与另一个模块链接时我遇到了同样的问题。似乎assembleRelease
以某种方式优化代码,它可能会class
根据调用它的位置生成略有不同的文件,然后 Dex 合并无法决定class
使用哪个文件。assembleDebug
始终生成可以合并的相同(未优化)代码。
(对于任何与 Protobuf 有相同问题的人,解决方案是依赖:protobuf:GenerateProto
而不是:protobuf:assemble
.)
推荐阅读
- docker - 在 kubernetes 集群中运行的 elasticsearch pod 的基本身份验证
- .net - Visual Studio 将 VB.net 应用程序编译为 NATIVE Executable
- amazon-web-services - 从 ElasticBeanstalk EC2 连接到 Redis (ElastiCache) 失败
- azure - 删除 Azure 目录失败。我应该删除 App-Registrations,但还有更多剩余
- python-3.x - 过去 15 天内连续 4 天的熊猫
- heroku - 是否可以通过 Heroku API 在免费计划中找到当前使用的小时数?
- javascript - 如何从承诺中获取变量?
- angular - 即使引用绑定到 null 也会发生内存泄漏
- ruby-on-rails - 使用 Savon 和 Nokogiri 在 Rails 中解析 XML SOAP 响应时内存不足
- javascript - 如何使用jQuery获取url中的值