当构建类型相同时,为什么发布构建抛出错误而不是调试?(Android gradle构建类型)

当构建类型相同时,为什么发布构建抛出错误而不是调试?(Android gradle构建类型),android,android-gradle-plugin,build.gradle,android-build-flavors,android-build-type,Android,Android Gradle Plugin,Build.gradle,Android Build Flavors,Android Build Type,我试图弄明白为什么我不能使用Android Studio正确安装发布版本。这是我的buildTypes块: buildTypes { debug { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } release { shrinkRe

我试图弄明白为什么我不能使用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'
我的问题是:为什么重复类异常只发生在发行版期间,而发行版和调试构建类型之间的定义没有什么不同


编辑我通过删除gradle中的YouTubeplyer库依赖项解决了这个问题(b/c显然我的google YT服务实现导致创建了一个内部库,因此依赖导入的库是多余的?)。这仍然使我的问题有效。为什么调试工作正常,但发布时没有任何不同的声明?

我在与另一个模块链接时遇到了同样的问题,因为我在其
汇编上添加了另一个(间接)依赖项(Protobuf模块需要从
.proto
文件生成Java文件,然后应用模块才能生成其JSON模型)。似乎
assembleerelease
优化了代码,根据调用位置,它可能会生成稍有不同的
文件,而Dex合并则无法决定使用哪个
文件。
assembleedebug
生成的总是相同的(未优化)它可以合并的代码


(对于任何与Protobuf有相同问题的人,解决方法是依赖于
:Protobuf:GenerateProto
,而不是
:Protobuf:assembly

我也面临着同样的问题——是否有幸找到解决方案?我想这与gradle中的依赖关系以及不同版本生成类文件的方式有关,请参见@StenSoft的回答。这很可能是调试分配了不同的类名,但发行版不是。