web-dev-qa-db-ja.com

Gradleで製品フレーバーに署名する

私は自分のプロジェクトをgradleに移行するようにしています。私のプロジェクトの1つには複数の製品フレーバーがあり、それぞれのリリースバージョンで異なる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 {
    ...
}

gradle buildを実行すると、groovy.lang.MissingFieldExceptionと次のエラーメッセージが表示されます。

No such field: signingConfigs for class: com.Android.build.gradle.internal.dsl.GroupableProductFlavorFactory

したがって、GradleスクリプトのproductFlavors。*部分は、コード署名構成を配置する適切な場所ではないと想定しています。

54
user2473760

ユーザーガイド ごとに、フレーバーのsigningConfigsがサポートされています。

ここでの問題は、signingConfigsオブジェクトのスコープに関係しています。 productFlavorsブロック内の変数に割り当てましたが、flavor1フレーバーブロックで問題を修正します。

productFlavors {
    def flavor1SigningVariable = signingConfigs.flavor1

    flavor1 {
        ...
        signingConfig flavor1SigningVariable
        ...
    }
44
c2knaps

flavorの各buildTypeに対してsigning configを宣言できます。ここに、異なるキーストアを使用したリリース署名フレーバー用の私の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'

    }
  }
}

buildTypesブロックはproductFlavorsブロックの後に配置する必要があります。順序が重要です。

64
ashakirov

Androidのgradleプラグインは、フレーバーごとではなく、ビルドタイプごとの署名のみをサポートします。この理由は、variant(ビルドタイプ+フレーバー)たとえば、フレーバーグループはcpu(x86/arm)とバージョン(free/paid)であり、4つの異なるバリエーションがあります。

探しているソリューションは、リリースバージョンごとに個別のビルドタイプを作成することです。たとえば、ビルドタイプはdebugreleaserelease-beta、 このような:

...

Android {

    ...

    buildTypes {
        debug {
            signingConfig signingConfigs.debug
        }

        release {
            signingConfig signingConfigs.release
        }

        release-beta {
            initWith release
            signingConfig signingConfigs.release-beta
        }
    }
}

上記のinitWithはgradleにrelease-betaは、releaseビルドタイプのコピーであり、異なるキーでのみ署名される必要があります。