多个visaConfigs用于多种变体

Aeg*_*gis 9 android gradle android-keystore android-gradle-plugin

如何为不同的变体设置不同的签名配置?

例如,我们目前有两种版本的buildtypes Debug/Beta/Release,免费和付费,产生了6种变体.为了使它更容易一点,让我们忘记Debug变体,只关注freeBeta/paidBeta/freeRelease/paidRelease.

我想要的是,每个变体都使用单独的不同的signedConfig.

到目前为止,我能找到的唯一解决方案是将signingConfigs置于buildTypes中,以便所有Beta变体都具有相同的signingConfigs:

buildTypes {
    beta {
        signingConfigs.beta
    }
    release {
        signingConfigs.release
    }
}
Run Code Online (Sandbox Code Playgroud)

或者,使用flavor,在这种情况下,所有免费变体都具有相同的signingConfigs:

productFlavors {
    free {
        signingConfig signingConfigs.free
        applicationId 'com.example.free'
    }
    paid {
        signingConfig signingConfigs.paid
        applicationId 'com.example.paid'
    }
}
Run Code Online (Sandbox Code Playgroud)

有没有办法在当前的productFlavor闭包中执行此操作?只能通过覆盖android.applicationVariants.all { variant ->并根据某些命名方案或其他一些丑陋的黑客手动为每个应用程序变体应用signingConfig 来解决这个问题吗?

我也找到了这个答案,但它似乎不适用于最新的构建工具; 编译时我收到以下错误:

FAILURE:构建因异常而失败.

  • 其中:构建文件'/home/dev/projects/app/build.gradle'行:61

  • 出了什么问题:评估项目':app'时出现问题.

    在ProductFlavor容器上找不到属性'free'.

Eri*_*lle 7

答案链接实际上工作正常.我让它像这样编译(使用buildTools 1.3.1和gradle-wrapper 2.7).您遇到的错误(无法在ProductFlavor容器上找到属性"free")肯定是因为您的构建类型是在build.gradle中的productFlavor之前定义的

这不行

signingConfigs {
    freeBeta {}
    freeRelease {}
    paidBeta {}
    paidRelease {}
}    
buildTypes {
    debug {}
    beta {}
    release {}
}
productFlavors {
    free {}
    paid {}
}
Run Code Online (Sandbox Code Playgroud)

这将工作 (只需交换productFlavors和buildType的定义顺序)

signingConfigs {
    freeBeta {}
    freeRelease {}
    paidBeta {}
    paidRelease {}
}    
productFlavors {
    free {}
    paid {}
}    
buildTypes {
    debug {}
    beta {}
    release {}
}
Run Code Online (Sandbox Code Playgroud)

这是一个完整的工作示例:

signingConfigs {
        freeBeta {
            keyAlias 'freeBeta'
            keyPassword 'test'
            storeFile file('C:/keystore.jks')
            storePassword 'test'
        }
        freeRelease {
            keyAlias 'freeRelease'
            keyPassword 'test'
            storeFile file('C:/keystore.jks')
            storePassword 'test'
        }
        paidBeta {
            keyAlias 'paidBeta'
            keyPassword 'test'
            storeFile file('C:/keystore.jks')
            storePassword 'test'
        }
        paidRelease {
            keyAlias 'paidRelease'
            keyPassword 'test'
            storeFile file('C:/keystore.jks')
            storePassword 'test'
        }
    }

    productFlavors {
        free {

        }
        paid {

        }
    }

    buildTypes {
        debug {

        }
        beta {
            productFlavors.free.signingConfig signingConfigs.freeBeta
            productFlavors.paid.signingConfig signingConfigs.paidBeta
        }
        release {
            productFlavors.free.signingConfig signingConfigs.freeRelease
            productFlavors.paid.signingConfig signingConfigs.paidRelease                
        }
    }
Run Code Online (Sandbox Code Playgroud)

  • 不,代码行在这里按顺序执行,最后一个release{}块将覆盖beta{}块。因此,所有产品风格都将在此处使用发布签名密钥 (2认同)

Den*_*hov 5

/sf/answers/2296720331/答案将无法正常工作。

    beta {
        productFlavors.free.signingConfig signingConfigs.freeBeta
        productFlavors.paid.signingConfig signingConfigs.paidBeta
    }
    release {
        productFlavors.free.signingConfig signingConfigs.freeRelease
        productFlavors.paid.signingConfig signingConfigs.paidRelease                
    }
Run Code Online (Sandbox Code Playgroud)

在这种情况下,发布构建类型将覆盖所有风格。所以签名配置freeBeta将是freeRelease.

目前,我知道的唯一解决方案是在单独的任务中签署所有构建变体。

signingConfigs {

    bananaDebug {}
    bananaBeta {}
    bananaRelease {}

    orangeDebug {}
    orangeBeta {}
    orangeRelease {}

    lemonDebug {}
    lemonBeta {}
    lemonRelease {}
}

productFlavors {

    banana {}

    orange {}

    lemon {}
}

buildTypes {

    debug {}

    beta {}

    release {}
}

applicationVariants.all {
    def flavorName = it.getFlavorName()
    def buildTypeName = it.buildType.name
    def buildVariantName = flavorName + buildTypeName.capitalize()
    def currentSigningConfig = signingConfigs.getByName(buildVariantName)

    it.mergedFlavor.signingConfig = currentSigningConfig
    // If you want to sign debug build
    buildTypes.debug.signingConfig currentSigningConfig
}
Run Code Online (Sandbox Code Playgroud)

  • 感谢注意到许多其他关于堆栈溢出的答案提到的缺陷,但是,这也不能解决问题。在“mergedFlavor”上设置“signingConfig”实际上并不对组装的应用程序进行签名。 (3认同)