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

23

我有一个项目,其中有多个特定设备的产品口味,每个口味都需要用不同的配置进行签名:

productFlavors {
    nexus7 {
        signingConfig signingConfigs.nexus7
    }
    nexus4 {
        signingConfig signingConfigs.nexus4
   }
}

当构建“发布”变体时,这很好用。然而,当使用“调试”变体(例如,我构建Nexus4Debug时)时,Gradle将使用默认的Android调试密钥。在我的情况下,我高度依赖于这些构建以正确的方式签名,如果使用默认的调试密钥对应用程序进行签名,则我的应用程序相对无用。任何人知道是否有一种方法可以为每个变体指定签名配置吗?

我知道我可以按构建类型执行此操作,例如:

buildTypes {
    debug {
        signingConfig signingConfigs.nexus4
    }
}

但这将限制我在两种不同风味的调试版本中始终使用相同的签名配置。

PS - 请注意,这是一个较为特殊的用例。我们正在企业项目中测试许多不同 Nexus 设备上的自定义 ROM 和系统签名应用。


2
我很想知道是否有一种方法可以拥有一个特定于变体的签名密钥。 - dcow
5个回答

13

尝试将以下内容添加到您的 build.gradle 中。它将指定在构建 debug 构建类型时,每个 flavor 使用哪个 signingConfig:

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

5
这个答案似乎不能在最新的Android插件版本1.1.3上使用。 - spierce7
2
这对于将构建变体与口味结合使用非常有用。请注意,在build.gradle中定义您的口味之前,您需要确保定义了您的构建类型。 - Matthew Trout
正如@MatthewTrout所强调的那样,如果在构建类型之前未定义口味,则无法构建。 - Ewoks
3
这基本上意味着所有的Nexus 4版本都应该使用signingConfigs.nexus4进行签名(不仅仅是调试,而是包括发布版)...然后对于Nexus 7也是如此。 - Ewoks
在Android 13中,这个不起作用,而且这些是重新分配。答案是由@pingan-yi在下面写的:signingConfig android.buildTypes.release.signingConfig - undefined
显示剩余2条评论

8
我在安卓插件构建后得到了另一个解决方案,版本号为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
    }
}

作为构建类型“release”将使用风味签名配置(因为没有规定),所以在使用发布版初始化后,调试也将具有相同的签名配置。
如果未提供签名配置,则构建类型“debug”需要使用“release”进行初始化,否则将使用Android默认的调试签名密钥。
更新:
问题在于android.buildTypes.debug.signingConfig具有默认值,而release没有。
这个解决方案未来可能会出现问题。
无论如何,仍然可以与android插件构建2.3.2一起使用。

9
谢谢您。这让我想明白了问题所在:signingConfig null。问题在于,android.buildTypes.debug.signingConfig有一个默认值,而release没有。如果设置了buildType配置,则会覆盖您在flavor中设置的任何内容。真正的诀窍是在buildTypes.debug中取消设置该属性,这样它就会像release一样操作。 - Harvey
是的,完全正确!可惜它没有文档记录。我在试错了一天后才弄清楚这个问题。希望这个答案也能帮助其他人 :D - OnJohn
你应该更新你的答案来展示这个。你的解决方案很聪明,但未来容易出现故障。 - Harvey
1
Harvey,你应该将你的评论发布为答案,因为它仍然有效。 - Tony BenBrahim
1
@Harvey 经过长时间的寻找,使用 signingConfig null 最终解决了问题。我最近还发现,通过使用 jarsigner 查看 debug apk 的签名,可以知道 debug 模式是由 androiddebug keystore 签名的。 - Sabin Bajracharya

5

适用于2.2.1版本

buildTypes {
    release {
    }
    debug {
        signingConfig android.buildTypes.release.signingConfig
    }
}

1
请看我的评论,针对@sheungon-tsai的回答。这是答案:signingConfig null - Harvey

1

答案是:

buildTypes {
    debug {
        signingConfig null
    }
}

它被隐藏在@Harvey的评论中,我花了太多时间才找到它。我认为最好将其作为答案留下。

如果这个方法对你也有用,你可以找到这个评论并点赞。

谢谢你。这让我想到了这个问题:签名配置为空。问题在于android.buildTypes.debug.signingConfig有一个默认值,而release没有。如果设置了buildType配置,则会覆盖你在flavor中设置的任何内容。真正的诀窍是在buildTypes.debug中取消设置该属性,这样它就会像release一样运行。- Harvey


0

这可能有效:

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

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