在Android

时间:2015-06-17 17:39:31

标签: android gradle android-gradle code-signing

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

如何仅针对应用的1种风格覆盖signingConfig(但在相同的构建类型中,例如“发布”)?

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

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

我试过的相关帖子:

Producing multiple builds signed with different keys from single build type

  • 这需要为每种风味配置
  • 似乎无论如何都不会使用我的自定义signingConfig

Signing product flavors with gradle

  • 接受的解决方案不起作用(对我而言)
  • 根据a comment这可以将buildTypes放在productFlavors内,但我不明白该怎么做。

Debug Signing Config on Gradle Product Flavors

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

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

5 个答案:

答案 0 :(得分:9)

如果未在产品风格中指定了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
    }
}

答案 1 :(得分:1)

我不是100%确定这会起作用,但我不认为你想创建一个新的构建类型。这将为每种风格创建一个新的构建变体。当你真的只想要一种风格来覆盖"默认配置" :)

此代码未经过测试,但您应该可以按照以下方式执行操作:

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

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

    /**
     *  defaultConfig is of type 'ProductFlavor'.
     *
     *  If we need to use a different signing key than the default,
     *  override it in the specific product flavor.
     */

    defaultConfig {
        versionCode 123
        versionName '1.2.3'
        minSdkVersion 15

        def standardSigningConfig = signingConfigs.normal

        buildTypes{
            release {
               signingConfig standardSigningConfig 
               zipAlign true
               // ...
            }
            debug { 
               //not sure you need this node
            }  
        }
    }


productFlavors {

    def customConfig = signingConfigs.custom
    def standardSigningConfig = signingConfigs.normal

    apple {
        applicationId "demo.apple"
    }
    banana {
        applicationId "demo.banana"
    }
    custom {
        applicationId "custom.signed.app"
        signingConfig customConfig
    }
}

参考:
http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Product-Flavor-Configuration

答案 2 :(得分:0)

您必须在buildTypes中定义signingconfigs。将自定义签名配置添加到调试构建类型或创建自定义构建类型

    buildTypes {
        debug {
            applicationIdSuffix ".debug"
             signingConfig signingConfigs.custom
        }
        custom {
            applicationIdSuffix ".custom"
             signingConfig signingConfigs.custom
        }
        release {
             signingConfig signingConfigs.releaseConfig
        }
}

Gradle将为每种构建类型创建flavor,并且根据buildType,flavor会使用相应的signinconfig。使用上面的构建类型配置,让我们考虑“苹果”的味道。 Gradle将为apple

创建以下构建变体
  • appledebug - >自定义签名配置
  • applecustom - >自定义签名配置
  • applerelease - >发布签名配置

    您可以选择相应的构建变体并运行您的应用程序

将签名配置添加到flavor

productFlavors {
    def customSigningConfig = signingConfigs.custom

    custom {
        ...
        signingConfig customSigningConfig
        ...
    }

在声明你的口味之前,你需要声明你的签名配置。

https://code.google.com/p/android/issues/detail?id=64701

答案 3 :(得分:0)

一个想法可能是使用项目属性来确定您是否应该使用自定义signinconfig。

if (project.hasProperty('custom')) {
    android.signingConfigs.release = customSigningConfig
} else {
    //should use the default
}

然后构建您运行的自定义风格:

gradle assembleCustomRelease -Pcustom=true

答案 4 :(得分:0)

tl; dr浏览" gradle.startParameter.taskNames"寻找味道并修改变量。

我为Vine应用程序的测试变体执行此操作,它非常好用。您还可以使用它来编译不同的依赖项,而无需添加更多的flavor大小。

在你的情况下看起来像这样。

            //root of buil.gradle OR probably inside buildTypes.release
            def signType = signingConfigs.normal;
            //You can put this inside builTypes.release or any task that executes becore
            def taskNames = gradle.startParameter.taskNames;
                taskNames.each { String name ->
                    if (name.contains("customFlavor")) {
                        signType = signingConfigs.custom
                    }
                }
            buildTypes{
                release {                   
                    signingConfig signType
                }
            }