用gradle签署产品口味

use*_*760 58 android build code-signing gradle

我想把我的项目迁移到gradle.我的一个项目有多种产品风格,每种产品都必须在其发布版本中使用不同的signingConfig进行签名.所以这就是我到目前为止所尝试的:

buildscript {
    ...
}

apply plugin: 'android'

android {
    compileSdkVersion 17
    buildToolsVersion '17'

    signingConfigs {
        flavor1 {
            storeFile file("keystore")
            storePassword "secret"
            keyAlias "aliasForFlavor1"
            keyPassword "secretFlavor1"
        }

        flavor2 {
            storeFile file("keystore")
            storePassword "secret"
            keyAlias "aliasForFlavor2"
            keyPassword "secretFlavor2"
        }
    }

    productFlavors {
        flavor1 {
            signingConfig signingConfigs.flavor1
        }

        flavor1 {
            signingConfig signingConfigs.flavor2
        }
    }
}

dependencies {
    ...
}
Run Code Online (Sandbox Code Playgroud)

当我运行时,signingConfig我得到一个gradle build和以下错误消息:

No such field: signingConfigs for class: com.android.build.gradle.internal.dsl.GroupableProductFlavorFactory
Run Code Online (Sandbox Code Playgroud)

所以我假设productFlavors.*gradle脚本的一部分不是放置代码签名配置的正确位置.

ash*_*rov 66

你可以声明signing config为每个flavorbuildType.这是我的gradle文件,用于发布使用不同密钥库的签名风格.

android {
  signingConfigs {
    configFirst {
        keyAlias 'alias'
        keyPassword 'password'
        storeFile file('first.keystore')
        storePassword 'password'
    }

    configSecond {
        keyAlias 'alias'
        keyPassword 'password'
        storeFile file('second.keystore')
        storePassword 'password'
    }
  }

  compileSdkVersion 23
  buildToolsVersion "23.0.2"
  defaultConfig {
        minSdkVersion 14
        targetSdkVersion 23
  }

  productFlavors{
    flavor1 {
        applicationId "com.test.firstapp"
    }

    flavor2 {
        applicationId "com.test.secondapp"
    }
  }

  buildTypes {
    release {
        productFlavors.flavor1.signingConfig signingConfigs.configFirst
        productFlavors.flavor2.signingConfig signingConfigs.configSecond           

        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android.txt'),
                'proguard-rules.pro'

    }
  }
}
Run Code Online (Sandbox Code Playgroud)

buildTypes块应该在productFlavors块之后放置,我的意思是顺序很重要.

  • Android为调试版本添加了默认的"signingConfig".通过传递`null`来删除它,如下所示:`buildTypes {debug {signingConfig null}}`.通过这样做,您将`signingConfig`委托给产品风格. (14认同)
  • 一个好的答案,值得注意的是,`buildTypes`必须在`productFlavors`之后。 (4认同)

c2k*_*aps 45

根据用户指南,支持visaConfigs for flavors.

这里的问题与signingConfigs对象的范围有关.我只是将它分配给productFlavors块内的变量,但在flavor1flavor块之外来解决问题:

productFlavors {
    def flavor1SigningVariable = signingConfigs.flavor1

    flavor1 {
        ...
        signingConfig flavor1SigningVariable
        ...
    }
Run Code Online (Sandbox Code Playgroud)

  • 这不应该是必需的.我提交了https://code.google.com/p/android/issues/detail?id=64701来跟踪此问题. (6认同)
  • Gradle v2.4中似乎打破了解决方案 (3认同)
  • 在我的情况下,它添加android.buildTypes.debug.signingConfig = null后工作; 和android.buildTypes.relese.signingConfig = null; 清除基地签名.这意味着buildTypes中的signingConfig会覆盖flavor中的signingConfig.甚至是Android自动创建的默认值.您可以通过打印android.buildTypes.debug.signingConfig来检查它 (2认同)

Mar*_*hre 7

android的gradle插件仅支持每个构建类型的签名,而不是每个版本.这样做的原因是任何给定的变体(构建类型+风格)只能由一个键签名,但可以是几个flavor组的组合.例如,您的风味组可以是cpu(x86/arm)和版本(免费/付费),这就是四种不同的变体.

您正在寻找的解决方案是为您的不同版本创建单独的构建类型.例如,您的构建类型可能是debug,release,release-beta,就像这样:

...

android {

    ...

    buildTypes {
        debug {
            signingConfig signingConfigs.debug
        }

        release {
            signingConfig signingConfigs.release
        }

        release-beta {
            initWith release
            signingConfig signingConfigs.release-beta
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

initWith上面只是告诉gradle这个是release-beta应该是一个拷贝release生成类型,只能用一个不同的密钥签名.

  • 你实际上可以在`productFlavors`中放置`buildTypes`(我不确定这是否是新东西) (3认同)

mik*_*kep 7

也许是另一个有趣的解决方案,具有动态风味签名配置和其他优点

  • 我可以在 gradle 中定义风味的应用程序 ID 和应用程序名称(很清楚,每种风味只需 2 行),但我不想定义单独的签名配置(添加风味时,gradle 文件会太长)
  • 我也不希望因为提交而将敏感的签名信息放置在 gradle 中
  • 额外的优势是调试版本有另一个应用程序 ID 和应用程序名称。

.gitignore

...
/keystore.properties
Run Code Online (Sandbox Code Playgroud)

.keystore.properties

storeFile=../mystore.jks
storePassword=...

keyAliasFlavor1=...
keyPasswordFlavor1=...

keyAliasFlavor2=...
keyPasswordFlavor2=...

Run Code Online (Sandbox Code Playgroud)

应用程序/build.gradle

def keystoreProperties = new Properties()
keystoreProperties.load(new FileInputStream(rootProject.file('keystore.properties')))

android {
    ...

    buildTypes {
        debug {
            ...
            manifestPlaceholders = [appNameSuffix: " Dev"]
            applicationIdSuffix ".dev"
        }
        release {
            ...
            manifestPlaceholders = [appNameSuffix: ""]
            productFlavors.all { flavor ->
                flavor.signingConfig = android.signingConfigs.create("${flavor.name}")
                flavor.signingConfig.storeFile = rootProject.file(keystoreProperties["storeFile"])
                flavor.signingConfig.storePassword = keystoreProperties["storePassword"]
                flavor.signingConfig.keyAlias = keystoreProperties["keyAlias${flavor.name}"]
                flavor.signingConfig.keyPassword = keystoreProperties["keyPassword${flavor.name}"]
            }
        }
    }

    productFlavors {
        Flavor1 {
            applicationId "..."
            manifestPlaceholders = [appNameBase: "MyApp 1"]
        }
        Flavor2 {
            applicationId "..."
            manifestPlaceholders = [appNameBase: "MyApp 2"]
        }
        // ... and many other flavors without taking care about signing configs
        // (just add two lines into keystore.properties for each new flavor)
    }
}
Run Code Online (Sandbox Code Playgroud)

应用程序/src/main/AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest ...>
    ...
    <application android:label="${appNameBase}${appNameSuffix}" ...>
        ...
    </application>
</manifest>
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

24571 次

最近记录:

6 年,5 月 前