Gradle在Android上使用不同的密钥签名

Ric*_*ier 43 android code-signing gradle android-gradle-plugin

我的Android应用程序有很多种,我希望除了一个以外的所有应用程序都使用相同的密钥.有一个需要使用不同的密钥.

如何覆盖signingConfig应用程序的1种风格(但在相同的构建类型中,例如"发布")?

  • 我希望默认情况下所有构建都使用主要版本配置.
  • 我只想覆盖1种味道
  • 我希望能够使用单个gradlew assembleRelease命令运行所有发布版本

最后一点非常重要,因为我目前有超过120种不同的口味和成长.为了单独定制每一种风味,需要做很多额外的工作.


相关帖子我试过:

使用单个构建类型的不同键生成多个构建

  • 这需要配置每种口味
  • 它似乎并没有使用个性化的signingConfig反正

用gradle签署产品口味

  • 接受的解决方案不起作用(对我而言)
  • 根据评论,这可能是通过放入buildTypes内部,productFlavors但我不明白如何做到这一点.

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

总的来说,每个解决方案似乎仍然使用默认的发布配置,而不是我的自定义配置.


我的重要部分build.gradle看起来像这样:

signingConfigs {
    releaseConfig {
        storeFile file('key')
        storePassword "pass"
        keyAlias "alias"
        keyPassword "pass"
    }

    custom {
        storeFile file('custom_key')
        storePassword "pass"
        keyAlias "alias"
        keyPassword "pass"
    }
}

productFlavors {
    apple {
        applicationId "demo.apple"
    }
    banana {
        applicationId "demo.banana"
    }

    // def customConfig = signingConfigs.custom
    custom {
        applicationId "custom.signed.app"
        // signingConfig customConfig
    }
 }


buildTypes {
    debug {
        applicationIdSuffix ".debug"
    }
    release {
         signingConfig signingConfigs.releaseConfig
         // productFlavors.custom.signingConfig signingConfigs.custom
    }
}
Run Code Online (Sandbox Code Playgroud)

Ric*_*ier 20

摇篮Plugin用户指南说,你可以:

让每个发布包SigningConfig通过分别设置每个 android.productFlavors.*.signingConfig对象来使用它们自己.

这个答案(Gradle Product Flavors上的Debug Signing Config)和这篇博客文章(使用Gradle构建Android应用程序的多个版本)证明了这一点.

但是,signingConfig为每种风味指定单独的行不能很好地扩展,并且超出了问题的范围.不幸的是,没有提供的答案显示如何正确地正确覆盖signingConfig正确.


诀窍来自这个答案(如何在gradle中获取当前选择的构建变体?),它显示了如何循环构建变体(以及扩展,味道).

我的解决方案使用一个循环来设置signingConfig每个风味,而不是为它设置一个单独的行.这很好地扩展."覆盖"是通过一行指定循环后的自定义配置完成的.

将以下代码放在buildTypes.release块中:

// loop over all flavors to set default signing config
productFlavors.all { flavor ->
    flavor.signingConfig signingConfigs.releaseConfig
}
// override default for single custom flavor
productFlavors.custom.signingConfig signingConfigs.custom
Run Code Online (Sandbox Code Playgroud)

  • 请注意,顺序在build.gradle中很重要-必须在buildTypes {}之前声明productFlavors {}和signingConfigs {}。否则没有这样的订单要求。 (2认同)

Ash*_*win 11

如果未在产品flavor中指定了signingConfig,则下面给出的代码将使用release1作为默认的signedConfig.

应用程序/的build.gradle

signingConfigs {
    debug {
        storeFile file("/home/.../debugkeystore.jks")
        storePassword "..."
        keyAlias "..."
        keyPassword "..."
    }
    release1 {
        storeFile file("/home/.../testkeystore1.jks")
        storePassword "..."
        keyAlias "..."
        keyPassword "..."
    }
    release2 {
        storeFile file("/home/.../testkeystore2.jks")
        storePassword "..."
        keyAlias "..."
        keyPassword "..."
    }
    release3 {
        storeFile file("/home/.../testkeystore3.jks")
        storePassword "..."
        keyAlias "..."
        keyPassword "..."
    }
}

defaultConfig {
    applicationId "com.example.signingproductflavors"
    minSdkVersion 15
    targetSdkVersion 24
    versionCode 1
    versionName "1.0"
    testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    signingConfig signingConfigs.release1
}

buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
    debug { 
        signingConfig signingConfigs.debug
    }
}

productFlavors {
    blocks {
        applicationId "com.example.blocks"
        resValue 'string', 'APP_NAME', "Blocks"
    }
    cloud {
        applicationId "com.example.cloud"
        resValue 'string', 'APP_NAME', "Cloud"
        signingConfig signingConfigs.release2
    }
    deck {
        applicationId "com.example.deck"
        resValue 'string', 'APP_NAME', "Deck"
        signingConfig signingConfigs.release3
    }
}
Run Code Online (Sandbox Code Playgroud)