在 Gradle 产品风味上调试签名配置

Posted

技术标签:

【中文标题】在 Gradle 产品风味上调试签名配置【英文标题】:Debug Signing Config on Gradle Product Flavors 【发布时间】:2013-12-11 21:36:16 【问题描述】:

我有一个项目,我有几个特定于设备的产品风格,每个风格都需要使用不同的配置进行签名:

productFlavors 
    nexus7 
        signingConfig signingConfigs.nexus7
    
    nexus4 
        signingConfig signingConfigs.nexus4
   

这在构建“发布”变体时非常有用。但是,当使用“调试”变体时(例如,当我构建 Nexus4Debug 时),Gradle 使用的是默认的 android 调试密钥。就我而言,我高度依赖以正确方式对这些构建进行签名,如果使用默认调试密钥进行签名,我的应用程序相对无用。任何人都知道是否有办法为每个变体指定签名配置?

我知道我可以根据构建类型做到这一点,例如:

buildTypes 
    debug 
        signingConfig signingConfigs.nexus4
    

但这限制了我总是使用相同的签名配置来调试两种风格的构建。

PS - 了解这只是一个边缘用例。这适用于一个企业项目,我们在多个不同的 Nexus 设备上测试自定义 ROM 和系统签名的应用程序。

【问题讨论】:

我很想知道是否有办法获得特定于变体的签名密钥。 【参考方案1】:

尝试将此添加到您的 build.gradle。在构建 debug 构建类型时,它将为每个 flavor 指定使用哪个 signingConfig

buildTypes 
    debug 
        productFlavors.nexus4.signingConfig signingConfigs.nexus4
        productFlavors.nexus7.signingConfig signingConfigs.nexus7
    

【讨论】:

@MJMWahoo06 如果它对您有用,您能否将其标记为已回答?谢谢:) 这个答案似乎不适用于最新的 android 插件版本。 1.1.3 似乎在 Gradle 2.4 中运行良好。我按照这个解决方案在我的构建文件中使用它:Gradle signing flavors with different keys on Android. 这对于将构建变体与风格结合起来非常有用。请注意,您需要确保在 build.gradle 中的 buildTypes 之前定义您的风格。 这基本上是说所有的nexus4 风格都应该用signingConfigs.nexus4 签名(不仅仅是调试,而是所有包括发布).. 比nexus7 做的一样..【参考方案2】:

在构建 android 插件后我得到了另一个解决方案。 1.1.3

productFlavors 
    nexus7 
        signingConfig signingConfigs.nexus7
    
    nexus4 
        signingConfig signingConfigs.nexus4
    

buildTypes 
    release 
        debuggable false
        zipAlignEnabled true
    
    debug 
        initWith release
        debuggable true
        zipAlignEnabled false
    

由于构建类型“发布”将使用风味签名配置(因为没有规范),在使用发布构建调试 init 后,它也将具有相同的签名配置。

构建类型“debug”需要初始化为“release”,如果没有提供签名配置,它将使用Android默认调试签名密钥。

更新

问题是 android.buildTypes.debug.signingConfig 有一个默认值,而 release 没有。

解决方案可能会在未来被破坏。

无论如何,仍然可以使用 android plugin build 2.3.2

【讨论】:

谢谢。这让我明白了这一点:signingConfig null。问题是 android.buildTypes.debug.signingConfig 有一个默认值,而 release 没有。如果设置,buildType 配置会覆盖您在风味中设置的任何内容。真正的技巧是在 buildTypes.debug 中取消设置属性,这样它就可以像 release 一样工作。 是的,没错!不好的是没有记录。经过一天的尝试和错误后发现了这一点。希望这个答案也能帮助其他人:D 您应该更新您的答案以显示这一点。您的解决方案很聪明,但将来容易损坏。 哈维,你应该发表你的评论作为答案,因为它仍然有效.., @Harvey 经过这么长时间寻找使用signingConfig null 的解决方案终于奏效了。我最近还发现调试模式是由 androiddebug 密钥库通过使用 jarsigner 查看调试 apk 的签名来签名的。【参考方案3】:

适用于 2.2.1

buildTypes 
    release 
    
    debug 
        signingConfig android.buildTypes.release.signingConfig
    

【讨论】:

查看我对@sheungon-tsai 答案的评论。这就是答案:signingConfig null【参考方案4】:

这可能有效:

buildTypes 
  release 
     productFlavors.nexus7.signingConfig signingConfigs.nexus7
     productFlavors.nexus4.signingConfig signingConfigs.nexus4
  
  debug 
     signingConfig android.buildTypes.release.signingConfig
  

【讨论】:

以上是关于在 Gradle 产品风味上调试签名配置的主要内容,如果未能解决你的问题,请参考以下文章

配置文件或调试 APK:生成签名的 Bundle 需要您将 Android Gradle 插件更新到版本 3.2.0

在 gradle 中设置 applicationId 以获得组合的产品风味

在android studio中build.gradle中使用flavor维度

使用flavor签名配置覆盖调试构建类型签名配置

Android多版本flavor配置之资源文件和清单文件合并介绍

Android多版本flavor配置之资源文件和清单文件合并介绍