Android 构建变体签名配置

标签 android gradle signing build-variant

我的 android 应用程序模块 build.gradle 文件中有以下内容。

android {

    defaultConfig {
        ...
    }

    signingConfigs {
        if (System.getEnv()['CIRCLE-CI']) { /* CI System */
            localMachine { /* CI System KeyStore file and properties. */
                ...
                keyAlias = "ABC"
            }
            playStore { /* CI System KeyStore file and properties. */
                ...
                keyAlias = "ABC"
            }
        } else { /* Local machine, not CI System. */
            localMachine { /* debug.keystore local file and properties. */
                ...
                keyAlias = "androiddebugkey"
            }
            playStore { /* debug.keystore local file and properties. */
                ...
                keyAlias = "androiddebugkey"
            }
        }
    }

    productFlavors {
        productOne {
            ...
        }
        productTwo {
            ...
        }
    }

    buildTypes {
        debug {
            ...
        }
        release {
            ...
        }
    }
}

/** This is where the problem is **/
android.applicationVariants.all { variant -> 
        if (variant.mergedFlavor.name == "productOne") {
            if (variant.buildType.name == "debug") {
                variant.signingConfig android.signingConfigs.localMachine
            } else if (variant.buildType.name == "release") {
                variant.signingConfig android.signingConfigs.playStore
            }
        } else if (variant.mergedFlavor.name == "productTwo") {
            if (variant.buildType.name == "debug") {
                variant.signingConfig android.signingConfigs.localMachine
            } else if (variant.buildType.name == "release") {
                variant.signingConfig null
            }
        }
    }
}

预期输出如下。
productOneDebug -> Sign with signingConfigs.localMachine
productTwoDebug -> Sign with signingConfigs.localMachine
productOneRelease -> Sign with signingConfigs.playStore
productTwoRelease -> Unsigned.

实际输出如下。
productOneDebug -> Signed with signingConfigs.localMachine
productTwoDebug -> Signed with signingConfigs.localMachine
productOneRelease -> Unsigned.
productTwoRelease -> Unsigned.

为什么发布 apk 总是未签名?
目的是仅使 ProductTwo Release apk 未签名,但 ProductOne Release apk 应根据给定的配置进行签名。

最佳答案

显然,这就是 Gradle Sync 期间发生的事情。
Variant.signingConfig是 Flavor 和 Build-type 的 Overwritten 机制,以相同的顺序,基于值是否存在。

productOne.signingConfig = playStore
productTwo.signingConfig = null
debug.signingConfig = localMachine
release.signingConfig = null

由此产生的变体将是 -
productOneDebug.signingConfig = productOne.signingConfig 

debug.signingConfig 覆盖
productTwoDebug.signingConfig = productTwo.signingConfig

debug.signingConfig 覆盖
productOneRelease.signingConfig = productOne.signingConfig 

release.signingConfig 覆盖如果存在。
productTwoRelease.signingConfig = productTwo.signingConfig 

release.signingConfig 覆盖如果存在。

关于Android 构建变体签名配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51849900/

相关文章:

certificate - 使用 ECDSA key 时获取已签名的 x509

Android CheckBox -- 屏幕旋转后恢复状态

java - 如何在 Android 上将 xml 转换为 html?

android - fragment 中的 setContentView

ios - 我如何处理我已经接管的项目的分配?

android - 有没有办法确定 Android 应用程序是在运行时签署生产还是调试?

android - 重启安卓工作室

java - IntelliJ - 创建适用于 Android Wear 的应用程序

java - 如何配置 IntelliJ/gradle 以使用 dagger 2.0

java - 为什么 Intellij 代码覆盖率和 jacoco 代码覆盖率显示不同的百分比?