为什么在 Android Gradle 的构建类型相同的情况下,Release 版本会报错但 Debug 版本不会?

3

我正在试图弄清楚为什么使用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'

我的问题是:为什么只有在发布时才发生重复类异常,当我在release和debug buildTypes之间没有定义任何不同的内容?
编辑:我通过在gradle中删除YouTubePlayer库依赖项来解决了这个问题(因为显然我的google YT服务实现会导致内部库被创建,所以依赖导入的库是多余的?)。这仍然使我的问题成立。为什么调试可以工作,但发布时却不能,而且没有声明任何不同的东西?

我也遇到了同样的问题,有解决方案吗? - h_patel
我想这与gradle中的依赖项以及不同版本生成类文件的方式有关,可以参考@StenSoft的答案。很可能这是由于调试分配了不同的类名,但发布没有这样做。 - Mr.Drew
1个回答

1
当我在添加另一个(间接)依赖项的assemble时,与另一个模块链接时出现了同样的问题(它是Protobuf模块,需要从.proto文件生成Java文件,然后应用程序模块才能生成其JSON模型)。似乎assembleRelease会以某种方式优化代码,以使其根据调用它的位置和Dex合并器无法决定使用哪个class文件而生成稍有不同的class文件。assembleDebug始终生成相同的(未经优化的)代码,因此可以进行合并。

(对于遇到同样问题的Protobuf用户,解决方法是依赖于:protobuf:GenerateProto而不是:protobuf:assemble。)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接