针对多种变体的多个签名配置

时间:2015-09-23 14:21:41

标签: android gradle android-gradle android-keystore

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

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

我想要的是,每个变体都使用单独的不同签名配置。

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

buildTypes {
    beta {
        signingConfigs.beta
    }
    release {
        signingConfigs.release
    }
}

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

productFlavors {
    free {
        signingConfig signingConfigs.free
        applicationId 'com.example.free'
    }
    paid {
        signingConfig signingConfigs.paid
        applicationId 'com.example.paid'
    }
}

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

我还找到this answer,但它似乎不适用于最新的构建工具;编译时我收到以下错误:

  

失败:构建因异常而失败。

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

  •   
  • 出了什么问题:评估项目时遇到了问题':app'。

         
        

    找不到属性'免费'在ProductFlavor容器上。

      
  •   

2 个答案:

答案 0 :(得分:5)

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

这项工作

signingConfigs {
    freeBeta {}
    freeRelease {}
    paidBeta {}
    paidRelease {}
}    
buildTypes {
    debug {}
    beta {}
    release {}
}
productFlavors {
    free {}
    paid {}
}

这样可以 (只需交换productFlavors和buildType的定义顺序)

signingConfigs {
    freeBeta {}
    freeRelease {}
    paidBeta {}
    paidRelease {}
}    
productFlavors {
    free {}
    paid {}
}    
buildTypes {
    debug {}
    beta {}
    release {}
}

以下是一个完整的工作示例:

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                
        }
    }

答案 1 :(得分:4)

https://stackoverflow.com/a/32810290/3961802的答案无效。

    beta {
        productFlavors.free.signingConfig signingConfigs.freeBeta
        productFlavors.paid.signingConfig signingConfigs.paidBeta
    }
    release {
        productFlavors.free.signingConfig signingConfigs.freeRelease
        productFlavors.paid.signingConfig signingConfigs.paidRelease                
    }

在这种情况下,发行版本类型将覆盖所有类型。因此,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
}