Gradleを使用してリリース署名されたapkファイルを作成する方法


514

Gradleビルドを使用して、Gradleを使用してリリース署名済みのapkファイルを作成したいと思います。

コードが正しいかどうか、または実行時にパラメーターが不足しているかどうかはわかりませgradle buildん。

これは私のgradleファイルのコードの一部です:

android {
    ...
    signingConfigs {
          release {
              storeFile file("release.keystore")
              storePassword "******"
              keyAlias "******"
              keyPassword "******"
         }
     }
}

Gradleビルドは正常に終了し、私のbuild/apkフォルダーには...-release-unsigned.apk...-debug-unaligned.apkファイルのみが表示されます。

これを解決する方法について何か提案はありますか?



Gradleファイルからv1(jar署名)またはv2(フルAPK署名)バージョンで署名しますか?ここでのソリューション:stackoverflow.com/questions/57943259/…–
user1506104

回答:


430

以前の答えよりも簡単な方法:

これを入れて ~/.gradle/gradle.properties

RELEASE_STORE_FILE={path to your keystore}
RELEASE_STORE_PASSWORD=*****
RELEASE_KEY_ALIAS=*****
RELEASE_KEY_PASSWORD=*****

を変更し、app/build.gradleこれをandroid {コードブロック内に追加します。

...    
signingConfigs {

   release {
       storeFile file(RELEASE_STORE_FILE)
       storePassword RELEASE_STORE_PASSWORD
       keyAlias RELEASE_KEY_ALIAS
       keyPassword RELEASE_KEY_PASSWORD

       // Optional, specify signing versions used
       v1SigningEnabled true
       v2SigningEnabled true
   }
}

buildTypes {
        release {
            signingConfig signingConfigs.release
        }
}
....

その後、実行できます gradle assembleRelease


signingConfigsGradle DSLのリファレンスもご覧ください。


12
あなたが私に尋ねるなら、最善の方法です。プロジェクトフォルダー/ SVNには何も保存されず、キーを気にすることなくプロジェクトの10バージョンをチェックアウトできます。
Frank

8
Windowsでgradlewを使用している場合、GRADLE_USER_HOMEが環境変数として定義されていることを確認して、これを機能させる必要があります。プロジェクトディレクトリの1つ上のディレクトリに設定し、そこにキーストアを配置しました。gradle.properties内のキーストアへのパスでは、Windowsの単一のバックスラッシュではなく、スラッシュ(/)または二重のバックスラッシュ(\\)を使用する必要があります。Windowsコマンドプロンプトからキーストアを作成するには、stackoverflow.com
questions /

3
パスは、build.gradleファイルが配置されている場所からの相対ですか、それともマシンのルートディレクトリからの相対ですか?
2014年

1
@Prem、file()常に相対パスを想定します。new File(path)絶対的なものとして扱いたい場合に使用します。
ars-longa-vita-brevis 2014

4
これは私にとって最も簡単な方法で機能しました。gradle.propertiesで、RELEASE_STORE_FILE = .. / mykeystoreのように、モジュールbuild.gradleに関連するstoreFileを指定します。引用符を追加しないでください。そうでなければ、gradleがパスを壊します
Lakshman Chilukuri

263

私はこのコードを追加してそれを解決することに成功しましたgradle build

android {
    ...
    signingConfigs {
        release {
            storeFile file("release.keystore")
            storePassword "******"
            keyAlias "******"
            keyPassword "******"
        }
    }
    buildTypes {
        release {
            signingConfig signingConfigs.release
        }
    }
}

これにより、署名付きリリースapkファイルが生成されます。


33
パスワードを要求する方法はありますか?または私のgitリポジトリにパスワードを入れないようにする他の提案?
user672009

3
私は自分のbuild.gradleをあなたのように見えるように編集しますが、「ビルド>署名済みAPKを生成...」を実行しても、まだダイアログが表示されます(「詳細についてはGradleユーザーガイドを参照してください」など)。APKは表示されません。
Semanticer

3
@Semanticer実行gradle buildまたはgradlew buildターミナル/プロンプトコマンド
Phillip Kamikaze

12
@ user672009では、プロパティファイルにパスワードを入力し、.gitignoreを使用してそれをリポジトリから除外できます。あなたはこのリンクを見ることができます。gist.github.com/gabrielemariotti/6856974
Gabriele Mariotti

1
@GabrieleMariottiそれでも、不完全なリポジトリが残っています。より良い方法は、スケルトンのsigning.propertiesを作成し、「git update-index --assume-unchanged signing.properties」を発行してコミットすることです。ただし、これにより、フューチュラの編集がコミットされなくなります。sdqaliが示唆する最初のオプションのようなものはさらに良いようです。
user672009 2013年

67

@sdqaliのスクリプトは(少なくともGradle 1.6を使用している場合) gradleタスクを呼び出すたびにパスワードを要求することに注意してください。gradle assembleRelease(または同様の)実行時にのみ必要なため、次のトリックを使用できます。

android {
    ...
    signingConfigs {
        release {
            // We can leave these in environment variables
            storeFile file(System.getenv("KEYSTORE"))
            keyAlias System.getenv("KEY_ALIAS")

            // These two lines make gradle believe that the signingConfigs
            // section is complete. Without them, tasks like installRelease
            // will not be available!
            storePassword "notYourRealPassword"
            keyPassword "notYourRealPassword"
        }
    }
    ...
}

task askForPasswords << {
    // Must create String because System.readPassword() returns char[]
    // (and assigning that below fails silently)
    def storePw = new String(System.console().readPassword("Keystore password: "))
    def keyPw  = new String(System.console().readPassword("Key password: "))

    android.signingConfigs.release.storePassword = storePw
    android.signingConfigs.release.keyPassword = keyPw
}

tasks.whenTaskAdded { theTask -> 
    if (theTask.name.equals("packageRelease")) {
        theTask.dependsOn "askForPasswords"
    }
}

それを機能させるために、私は以下を追加する必要があったことにも注意してください(アンドロイドの下で):

buildTypes {
    release {
        signingConfig signingConfigs.release
    }
}

これを実装した後installRelease、タスクのリストから姿を消しました...なぜですか?
Kaarel 2013年

1
@caspaseあの偽の「storePassword」と「keyPassword」についてのコメントをもっと真剣に受けてほしい。これらのプロパティ( ""など)を初期化しないと、署名付きの* -release.apkは作成されず、エラーは表示されず、PROJECT_NAME / build / apk /ディレクトリの* -release-unsigned.apkだけで完全に困惑します。 。Man ...:/
vizZ

buildTypes-> ReleaseにsigningConfigを追加することについてのメモをありがとう。これで自動署名が解決しました!
mm2001

1
私はリリースAPKをビルドするときにパスワードを要求するシンプルなGradleプラグインを作成しました(この投稿で説明されているmathodを使用しますが、偽のstorePasswordとkeyPasswordを定義する必要はありません)。Maven Centralでも利用できます。github.com/alexvasilkov/AndroidGradleSignPlugin
Alex Vasilkov 14

これは素晴らしい。KEYSTOREデバッグビルドやAndroid Studio内の "gradle sync"の場合でも環境変数を定義する必要があることに注意してください。そうしないと、パスがnullであることに関するエラーが発生します。
Jerry101 14年

63

あなたはあなたのキーストアとパスワードをハードコーディング避けたい場合はbuild.gradleここで説明したように、あなたは、プロパティファイルを使用することができます。取扱いの署名CONFIGS WITHのGradleを

基本的に:

1)/home/[username]/.signingに myproject.propertiesファイルを次の内容で作成します。

keystore=[path to]\release.keystore
keystore.password=*********
keyAlias=***********
keyPassword=********

2)内容を含むgradle.propertiesファイルを作成します(おそらくプロジェクトディレクトリのルートにあります)。

MyProject.properties=/home/[username]/.signing/myproject.properties

3)build.gradleで次のように参照します。

    if(project.hasProperty("MyProject.properties")
        && new File(project.property("MyProject.properties")).exists()) {

    Properties props = new Properties()
    props.load(new FileInputStream(file(project.property("MyProject.properties"))))

    signingConfigs {
        release {
            storeFile file(props['keystore'])
            storePassword props['keystore.password']
            keyAlias props['keyAlias']
            keyPassword props['keyPassword']
        }
    }
}

1
よく働く!ありがとうございました。このコードはbuildTypes {}セクションの前に追加する必要があり、セクションは通常どおりsigningConfig signingConfigs.releaseを宣言する必要があります。
theczechsensation 2014年

最後に、この問題の解決策を見つけました。私を本当に助けてくれた唯一のもの!これは受け入れられる答えになるはずです...
devnull69

39

git使用時のGradleによる自動アプリ署名

これを行うための複雑な方法がいくつあるかは驚くべきことです。ここに私自身の方法があります、そこで私はグーグルの自身の推薦に固執しようとします。ただし、それらの説明は完全に明確ではないため、Linuxの手順について詳しく説明します。


説明:

パスワードと署名ファイルをアプリ開発(GIT)パスに保持せずに、ビルド中にアプリに自動的に署名するデフォルトのGoogleの指示は、かなりあいまいです。明確にするための手順を以下に示します。

最初の想定:

次のパスで指定されたディレクトリに「MyApp」というアプリがあります $HOME/projects/mydev/MyApp。ただし、MyAppディレクトリはGITで使用および制御されます。

ここに画像の説明を入力してください

問題

GITが管理するディレクトリのどこにも署名ファイルやパスワードファイルを配置したくないのは明らかです。たとえ非常に使用できたとして.gitignoreも、リスクが高く、間違いを犯しやすいです。したがって、鍵ストアと署名ファイルを外部に置きます。

解決

3つのことを行う必要があります。

  1. Android Studioで使用するパスワードファイルを作成する
  2. 署名鍵ファイルを作成する
  3. build.gradle(1)と(2)を使用するようにモジュールファイルを編集します。

この例では、2つのファイルに名前を付けます。

  1. keystore.properties
  2. MyApp-release-key.jks

これらのファイルの両方をここに配置できます。

cd $HOME/projects/mydev/

(1)キーストアパスワードファイルを作成する

最初のファイルには、使用されるクリアテキストのパスワードが含まれています。(2)のリリースキーファイルへのパス。コピーペースト操作が次のステップで簡単になるので、これを記入することから始めます。

cd $HOME/projects/mydev/

keystore.propertiesコンテンツが次のようになるように編集します。

storePassword=myStorePassword
keyPassword=mykeyPassword
keyAlias=myKeyAlias
storeFile=myStoreFileLocation

ここで唯一トリッキーな部分はmyStoreFileLocationです。これは、ビルド中にモジュールファイルから見たパスbuild.gradleです。これは通常、以下に類似した相対パスを意味します$HOME/projects/mydev/MyApp/app/build.gradle。したがって、MyApp-release-key.jks ファイルを指すために、ここに置く必要があるのは次のとおりです。

../../../MyApp-release-key.jks

ここでは、キーの「myapp」エイリアスも選択しました。その後、最終的なファイルは次のようになります。

storePassword=myStorePassword
keyPassword=mykeyPassword
keyAlias=myapp
storeFile=../../../MyApp-release-key.jks

(2)署名ファイルを作成する

署名キーを作成すると、2番目のファイルが自動的に生成されます。他にアプリがなく、これが唯一のキーストアである場合は、次のコマンドでファイルを作成します。

cd $HOME/projects/mydev/
keytool -genkeypair -v -keystore MyApp-release-key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias myapp

これにより、2つのパスワードと一連の情報が要求されます。(Android Studioと同じです。)次に、以前に選択したパスワードをコピーして貼り付けます。

(3)gradle.build上記を使用するようにモジュールファイルを編集します

次のパーツがアプリ/モジュールのGradleビルドファイルに存在する必要があります。まず、次の行を追加しますする前に、あなたのandroid {}ブロック。

//def keystorePropertiesFile = rootProject.file("$HOME/.android/keystore.properties")
def keystorePropertiesFile = rootProject.file("../../keystore.properties")
def keystoreProperties = new Properties()
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))

その後、内部のandroid {}ブロック、追加します。

android {
    ...
    defaultConfig { ... }
    signingConfigs {
            release {
                keyAlias keystoreProperties['keyAlias']
                keyPassword keystoreProperties['keyPassword']
                storeFile file(keystoreProperties['storeFile'])
                storePassword keystoreProperties['storePassword']
            }
        }
    // Tell Gradle to sign your APK
    buildTypes {
        release {
            signingConfig signingConfigs.release
            ...
        }
    }
}

これでシェルから、次の方法でアプリを再構築できます。

cd $HOME/projects/mydev/MyApp/app/
./gradlew clean build

これにより、Google Playで使用できる適切に署名されたアプリが生成されます。


更新: 2019-04-02

もっと最近のバージョンkeytool何かがあなたが使用する必要があることを語っているPKCS12私は上記の使用としての代わりに元/デフォルトのキーファイルベースを。彼らあなたが新しいオープンPKCS12形式に変換する必要がありますを伝えるに行きます。ただし、Android開発ツールはまだこれに対応していないようです。そうすると、次の奇妙なエラーが発生します。

com.android.ide.common.signing.KeytoolException:ストア "F:\ XXX \ XXX.jks"からキーXXXを読み取れませんでした:キーの取得に失敗しました:最終ブロックが適切に埋め込まれていません。このような問題は、解読中に不正なキーが使用された場合に発生する可能性があります。

変換されたキーを使用しないでください!


signingConfigsはapk内に保存されており、どのユーザーでも逆コンパイルしてパスワードを取得できますか、それともapkに表示されませんか?
JavierSegoviaCordoba 2017

2
魅力のように機能します。これは受け入れられるべき回答であることに感謝します
プラタムケサルカール

ビルドサーバー上のキーストアとパスワードのみが必要な場合はどうなりますか?上記のソリューションでは、チームのすべての開発者がローカルマシンにキーストアを配置する必要があります。そうでない場合、Gradleプロジェクトの同期は失敗します:keystore.properties(そのようなファイルやディレクトリはありません)。
ダイアナファリン2017

1
ダミーkeystore.propertiesファイルをソース管理にコミットできるため、開発マシンでビルドが機能します。ここでは、ビルドサーバーのセットアップについて説明しまし
dskrvk 2017年

1
あなたの最後の更新に関する注意keytoolPKCS12キーストアを生成する:あなたが渡すことができます-storetype JKSkeytoolAndroidのツールが必要とするJKSにキーストアのタイプを設定するためのコマンド。
Trevor Halvorson

35

@Destilが言ったように、しかしキーを持たない他の人にビルドすることを許可します:以前の答えよりも簡単な方法:

これを入れて ~/.gradle/gradle.properties

RELEASE_STORE_FILE={path to your keystore}
RELEASE_STORE_PASSWORD=*****
RELEASE_KEY_ALIAS=*****
RELEASE_KEY_PASSWORD=*****

build.gradleこのようにあなたを修正してください:

...    
if(project.hasProperty("RELEASE_STORE_FILE")) {
    signingConfigs {    
       release {
           storeFile file(RELEASE_STORE_FILE)
           storePassword RELEASE_STORE_PASSWORD
           keyAlias RELEASE_KEY_ALIAS
           keyPassword RELEASE_KEY_PASSWORD
       }
    }
}

buildTypes {
    if(project.hasProperty("RELEASE_STORE_FILE")) {
        release {
            signingConfig signingConfigs.release
        }
    }
}
....

次に、実行することができますgradle assembleRelease OR gradle build


Windowsでパスを設定する方法:キーストアへのパス
reza_khalafi

storeFile file( "C:\\ Users \\ xxxx \\ Documents \\ yyyy \\ mykey.jks")は正しいですか?
reza_khalafi

28

user672009への返信上記の。)

gitリポジトリにパスワードを入れたくない場合は、さらに簡単なソリューションです。しかし、build.gradleをその中に含めたい場合は、製品のフレーバーでもうまく機能するため、個別のGradleファイルを作成します。それを「signing.gradle」と呼びましょう(.gitignoreに含めます)。build.gradleファイルのように、サインインに関連しないすべてのものを差し引いたように。

android {
    signingConfigs { 
        flavor1 {
            storeFile file("..")
            storePassword ".."
            keyAlias ".."
            keyPassword ".."
        }
        flavor2 {
            storeFile file("..")
            storePassword ".."
            keyAlias ".."
            keyPassword ".."
        }
    }
}

次に、build.gradleファイルの「apply plugin: 'android'」のすぐ下にこの行を含めます

 apply from: 'signing.gradle'

複数のフレーバーがない、または使用していない場合は、上記の「flavor1」の名前を「release」に変更すれば完了です。フレーバーを使用している場合は続行します。

最後に、フレーバーをbuild.gradleファイルの正しいsigningConfigにリンクすると、完了です。

  ...

  productFlavors {

      flavor1 {
          ...
          signingConfig signingConfigs.flavor1
      }

      flavor2 {
          ...
          signingConfig signingConfigs.flavor2
      }
  }

  ...

あなたはもう少し具体的にすることができます。実行できません:「シンボルsigningConfigを解決できません」。
Amio.io 2014

build.gradleに「signing.gradle」を含めた場合-gitリポジトリに強制的に作成する必要があります(そうしないと、「signing.gradleが存在しません」というエラーが発生します)。そして、 'signing.gradle'をgitに配置すると、目的が無効になります。signing.gradleの組み込みをオプションにするにはどうすればよいですか?
ジャガー

21

すでにキーストアファイルがある場合は、ビルドコマンドにいくつかのパラメーターを追加するだけの簡単な方法です。

./gradlew assembleRelease \
 -Pandroid.injected.signing.store.file=$KEYFILE \
 -Pandroid.injected.signing.store.password=$STORE_PASSWORD \
 -Pandroid.injected.signing.key.alias=$KEY_ALIAS \
 -Pandroid.injected.signing.key.password=$KEY_PASSWORD

Androidプロジェクトに永続的な変更を加える必要はありません。

出典:http : //www.tinmith.net/wayne/blog/2014/08/gradle-sign-command-line.htm


18

これはuser672009への返信であり、sdqaliの投稿に追加されています(このコードは、IDEの[実行]ボタンでデバッグバージョンをビルドするとクラッシュします):

次のコードを使用できます。

final Console console = System.console();
if (console != null) {

    // Building from console 
    signingConfigs {
        release {
            storeFile file(console.readLine("Enter keystore path: "))
            storePassword console.readLine("Enter keystore password: ")
            keyAlias console.readLine("Enter alias key: ")
            keyPassword console.readLine("Enter key password: ")
        }
    }

} else {

    // Building from IDE's "Run" button
    signingConfigs {
        release {

        }
    }

}

デフォルト値を設定する方法はありますか?私のキーストアは通常同じです。通常、storePasswordはkeyPasswordと同じで、keyAliasは通常小文字のプロジェクト名です。
user672009 2013年

@ user672009では、スクリプト内でいつでもJavaコードを使用できます。
AChep 2013年

1
:あなたはこのようなものを使用したい場合がありますkeyPassword new String(console.readPassword("Enter key password: "))ことを確認、パスワードを入力中に表示されていないことを確認するために
アレックスSemeniuk

これはもう機能しません。github.com
gradle /

16

新しいAndroid Studioには、非常に簡単なGUIの方法があり、Gradleファイルにもデータが入力されます。

  1. File -> Project Structure

  2. Module -> メインモジュール(「アプリ」またはその他のカスタム名)を選択します

  3. Signing タブ->プラス画像で新しい構成を追加

  4. 右側にデータを入力

  5. OK、Gradleファイルが自動的に作成されます

  6. 手動で行を追加する必要がありますsigningConfig signingConfigs.NameOfYourConfig内部をbuiltTypes{release{}}

画像:

ここに画像の説明を入力してください

ここに画像の説明を入力してください

2つの重要な(!)ノート:

(編集12/15)

  1. 署名済みAPKを作成するには、Android Studioのターミナルタブ(メインインターフェイスの下部)を開き、コマンドを発行する必要があります ./gradlew assembleRelease

  2. keyAlias(私によく起こることですが)忘れた場合はBuild -> Generate Signed APK、プロセスを開始してエイリアスキーの名前を確認する必要があります。


2
build.gradleただし、これによりパスワードがファイルにハードコード化されます。
Joshua Pinter 2017

16

私のようにコマンドラインでapkをビルドする場合は、引数として署名構成を指定できます。

これをあなたに追加 build.gradle

def getStore = { ->
    def result = project.hasProperty('storeFile') ? storeFile : "null"
    return result
}

def getStorePassword = { ->
    def result = project.hasProperty('storePassword') ? storePassword : ""
    return result
}

def getKeyAlias = { ->
    def result = project.hasProperty('keyAlias') ? keyAlias : ""
    return result
}

def getKeyPassword = { ->
    def result = project.hasProperty('keyPassword') ? keyPassword : ""
    return result
}

signingConfigsこのようにしてください

signingConfigs {
    release {
        storeFile file(getStore())
        storePassword getStorePassword()
        keyAlias getKeyAlias()
        keyPassword getKeyPassword()
    }
}

次にgradlew、このように実行します

./gradlew assembleRelease -PstoreFile="keystore.jks" -PstorePassword="password" -PkeyAlias="alias" -PkeyPassword="password"

どっちbuild.gradle?トップレベル?さらにコードを追加してください
Vlad

明確にするために、これはapp/build.gradle私が話しているファイルです。
Egis、

11
android {
    compileSdkVersion 17
    buildToolsVersion "19.0.3"

    defaultConfig {
        minSdkVersion 9
        targetSdkVersion 18
    }

    File signFile = rootProject.file('sign/keystore.properties')
    if (signFile.exists()) {
        Properties properties = new Properties()
        properties.load(new FileInputStream(signFile))
        signingConfigs {
            release {
                storeFile rootProject.file(properties['keystore'])
                storePassword properties['storePassword']
                keyAlias properties['keyAlias']
                keyPassword properties['keyPassword']
            }
        }
    }

    buildTypes {
        release {
            runProguard true
            zipAlign true
            proguardFile rootProject.file('proguard-rules.cfg')
            signingConfig signingConfigs.release
        }
        debug {
            runProguard false
            zipAlign true
        }
    }
}

Android Studio 0.5.1、Gradle 1.11、およびGradleプラグイン0.9を使用します。
JPベンチュラ

1
オンデマンドでのプロパティの作成(動的プロパティ)は非推奨になり、Gradle 2.0で削除される予定です
JP Ventura '25

10

gradleの-Pコマンドラインオプションを使用して、署名を支援することもできます。build.gradleで、次のようにsingingConfigsを追加します。

signingConfigs {
   release {
       storeFile file("path/to/your/keystore")
       storePassword RELEASE_STORE_PASSWORD
       keyAlias "your.key.alias"
       keyPassword RELEASE_KEY_PASSWORD
   }
}

次に、gradle buildを次のように呼び出します。

gradle -PRELEASE_KEYSTORE_PASSWORD=******* -PRELEASE_KEY_PASSWORD=****** build

必要に応じて、-Pを使用してstoreFileとkeyAliasを設定できます。

これは基本的にはDestilのソリューションですが、コマンドラインオプションがあります。

Gradleプロパティの詳細については、Gradleユーザーガイドを確認してください


7

@Destilの答えは、すべてのプロジェクトで同じ構成を再利用できる場合に適しています。または、Android Studioにはlocal.properties代わりに使用できるファイルがますが、それはIDEで生成されたものであり、Android Studio内からそれを拡張する方法を見つけることができません。

これは@jonboの回答のバリエーションです。その答えはプロジェクト固有の設定を許可しますが、開発者のオーバーヘッドが少し発生します。特に、signingConfigs定義を別のファイルに移動するには、かなりのボイラープレートが必要です。特に、複数のプロジェクトでそうする必要がある場合、これがDestilのソリューションよりもこのソリューションを選択する主な理由です。これは多少によって軽減することができるにもラインを含みます

apply plugin: 'com.android.application'

これは、IDEの完了を可能にするため、資格情報ファイル内。

最後に、ここでのほとんどのソリューションでは、意味的に有効ではないにしても構文的に提供することなく、デバッグ署名で自動的に処理するデバッグモードでプロジェクトをビルドできません。signingConfigs定義で。特定のマシンからリリースビルドを作成する必要がない場合、この余分な手順は不要な障害と見なすことができます。一方、本番環境でデバッグビルドを実行している無知または怠惰な同僚に対する支援となる可能性があります。

このソリューションでは、認証情報をまったく気にすることなくデバッグビルドが可能ですが、リリースビルドを作成するには有効な認証情報が必要であり、ボイラープレートはほとんど必要ありません。ただし、不利なとして、ダミー値を実際の資格情報に置き換えることを他のユーザーに促す可能性があり、それを防ぐ方法はありません。

// app/build.gradle
// Define this structure in signing.gradle to enable release builds.
ext.signing = [
        storeFilePath : 'path/to/keystore',
        storePassword : 'keystore password',
        keyAlias      : 'key alias',
        keyPassword   : 'key password',
]

if (file('signing.gradle').exists()) {
    apply from: 'signing.gradle'
}

android {
    ...
    signingConfigs {
        release {
            storeFile file(project.signing.storeFilePath)
            storePassword project.signing.storePassword
            keyAlias project.signing.keyAlias
            keyPassword project.signing.keyPassword
        }
    }
    buildTypes {
        debug { ... }
        release {
            signingConfig signingConfigs.release
            ...
        }
    }
}

これにより、純粋に構文的に有効なビルドファイルを生成するためのダミープロパティが作成されます。ext.signingのプロパティに割り当てられた値は、デバッグビルドに関する限り、無関係です。リリースビルドを有効にするには、ダミーの値をコピーext.signingsigning.gradleて有効な資格情報に置き換えます。

// signing.gradle
ext.signing = [
        storeFilePath : 'real/keystore',
        storePassword : 'real keystore password',
        keyAlias : 'real key alias',
        keyPassword : 'real key password',
]

もちろん、signing.gradleVCSによって無視されるべきです。


6

現在、ほとんどすべてのプラットフォームで何らかのキーリングが提供されているため、クリアテキストのパスワードを残しておく理由はありません。

私は、Pythonキーリングモジュール(主にコンパニオンコンソールスクリプトkeyring)とGroovy ['do', 'something'].execute() 機能の最小限のラッパーを使用する簡単なソリューションを提案します

def execOutput= { args ->
    def proc = args.execute()
    proc.waitFor()
    def stdout = proc.in.text
    return stdout.trim()
}

この関数を使用すると、signingConfigsセクションは次のようになります。

signingConfigs {
    release {
        storeFile file("android.keystore")
        storePassword execOutput(["keyring", "get", "google-play", storeFile.name])
        keyAlias "com.example.app"
        keyPassword execOutput(["keyring", "get", "google-play", keyAlias])
    }
}

実行gradle assembleReleaseする前に、キーリングにパスワードを1回だけ設定する必要があります。

$ keyring set google-play android.keystore # will be prompted for the passwords
$ keyring set google-play com.example.app

幸せなリリース!


5

David Vavraによる回答を拡張して、ファイル〜/ .gradle / gradle.propertiesを作成し、追加します

RELEASE_STORE_FILE=/path/to/.keystore
RELEASE_KEY_ALIAS=XXXXX
RELEASE_STORE_PASSWORD=XXXXXXXXX
RELEASE_KEY_PASSWORD=XXXXXXXXX

次にbuild.gradleで

  signingConfigs {
    release {
    }
  }

  buildTypes {
    release {
      minifyEnabled true
      shrinkResources true

    }
  }

  // make this optional
  if ( project.hasProperty("RELEASE_KEY_ALIAS") ) {
    signingConfigs {
      release {
        storeFile file(RELEASE_STORE_FILE)
        storePassword RELEASE_STORE_PASSWORD
        keyAlias RELEASE_KEY_ALIAS
        keyPassword RELEASE_KEY_PASSWORD
      }
    }
    buildTypes {
      release {
        signingConfig signingConfigs.release
      }
    }
  }

5

これを理解するのはとても楽しかったです。これが私のウォークスルーです。

IntelliJ(v.13.1.4)でGradleビルドファイルを作成する方法に関するAからZのウォークスルーこのウォークスルーは、キーストアファイルの作成方法を理解していることを前提としています。このチュートリアルを機能させるには、キーストアファイルをappフォルダーに配置し、zipalign.exeファイルを 'SDK-ROOT \ tools'に配置する必要があります。このファイルは通常「SDK-ROOT \ build-tools」にあり、このフォルダーの下で最上位のapiフォルダーになります(アルファ版またはベータ版アルファ版をお勧めします)。

ここですぐにジャンプしたい人のために、gradleビルドファイルがあります。

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:0.9.+'
    }
}
apply plugin: 'android'

repositories {
    mavenCentral()
}
android {
    compileSdkVersion 19
    buildToolsVersion '20.0.0'
    defaultConfig {
        minSdkVersion 8
        targetSdkVersion 19
        versionCode 1
        versionName "1.0"
    }
    signingConfigs {
        playstore {
            keyAlias 'developers4u'
            keyPassword 'thisIsNotMyRealPassword'
            storeFile file('developers4u.keystore')
            storePassword 'realyItIsNot'
        }
    }
    buildTypes {
        assembleRelease {
            debuggable false
            jniDebugBuild false
            runProguard true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
            zipAlign true
            signingConfig signingConfigs.playstore
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:support-v4:20.0.0'
    implementation 'com.android.support:appcompat-v7:20.0.0'
}

このビルドファイル(上記)の一部をメニューオプションからビルドできます。ファイル/プロジェクト構造ここからファセットを選択し、[Android-Gradle(App)]をクリックします。ここから、「プロパティ」、「署名」、「フレーバー」、「ビルドタイプ」、「依存関係」のタブが表示されます。このウォークスルーでは、「署名」と「ビルドタイプ」を使用します。「ビルドタイプ」(名前セクション)に、ビルドタイプ構成を識別する任意の名前を入力し、他の4つのフィールドにキーストア情報を入力します(アプリストアの下のキーストアパスを設定します)。

「ビルドタイプ」の下の名前フィールドに「assembleRelease」という値を入力します。「デバッグ可能」はfalseに設定し、「Jniデバッグビルド」はfalseに設定し、「Run Proguard」をtrueに、「Zip Align」をtrueに設定します。これによりビルドファイルが生成されますが、上記の図とは異なり、後でビルドファイルにいくつかの項目を追加する必要があります。ここでのProGuardファイルの場所は、gradleビルドファイルで手動で設定されます。(上記のように)

後で追加する必要があるDSLコンテナは次のとおりです。

android {
    ....
    compileSdkVersion 19
    buildToolsVersion '20.0.0'
    defaultConfig {
        minSdkVersion 8
        targetSdkVersion 19
        versionCode 1
        versionName "1.0"
    }
    ....
}

以下も追加する必要があります。

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:support-v4:20.0.0'
    implementation 'com.android.support:appcompat-v7:20.0.0'
}

上記のDSLコンテナ(「依存関係」)は設定ファイルの一番下にある必要がありますが、Android DSLコンテナ内にはありません。IntelliJメニューから依存関係コンテナを構築するには、[ファイル/プロジェクト構造]を選択します。そこからファセットを再度選択し、次にAndroid-Gradle(app)を選択します。上記と同じ5つのタブが表示されます。「依存関係」タブを選択し、必要な依存関係を追加します。

これがすべて完了すると、このウォークスルーの上部にあるファイルと同様のGradleビルドファイルが表示されます。署名付きのzip調整リリースをビルドするには、Gradleタスクを開く必要があります。このウィンドウを表示するには、[表示]、[ツールウィンドウ]、[Gradle]の順に選択します。ここから「assembleAssembleRelease」をダブルクリックできます。これにより、デプロイ可能なAPKが生成されます。

リリースのコンパイル時に発生する可能性がある潜在的な問題は次のとおりです(これらに限定されません)。Gradleビルドファイルが間違った場所にある。Gradleビルドファイルは2つあります。1つはアプリケーションルートフォルダーにあり、もう1つはアプリケーションルートの下のappフォルダーにあります。後者を使用する必要があります。

また、糸くずの問題がある場合もあります。(注:Android Developer Studioは、IntelliJよりもLintの問題の発見に優れています。メニューオプションから署名済みAPKを生成しようとすると、このことに気付くでしょう)

lintの問題を回避するには、次のDSLコンテナをandroidコンテナ(上部)内に配置する必要があります。

android {
        ....
    lintOptions {
        abortOnError false
    }
    ....
}

これをandroid DSLコンテナー内に置くと、ビルドフォルダー(アプリフォルダーの直下)にエラーファイルが生成されます。ファイル名は 'lint-results-release-fatal.html'のようにする必要があります。このファイルは、エラーが発生したクラス。生成される別のファイルは、lintエラーに関連付けられた「問題ID」を含むXMLファイルです。ファイル名は、 'lint-results-release-fatal.xml'のようにする必要があります。ファイルの上部近くのどこかに、「id = "IDOfYourLintProblem"」のようなノードが表示される「問題」ノードが表示されます。

この問題を修正するには、 'lint-results-assembleRelease-fatal.html'ファイルにリストされているプロジェクトのファイルを開き、Javaクラスファイルのクラス名のすぐ上に次のコード行を入力します。@SuppressLint( "IDOfYourLintProblem ")。「android.annotation.SuppressLint;」のインポートが必要になる場合があります。

したがって、Javaクラスファイルは次のようになります。

package com.WarwickWestonWright.developers4u.app.CandidateArea;

import android.annotation.SuppressLint;
... other imports

@SuppressLint("IDOfYourLintProblem")
public class SearchForJobsFragment extends Fragment {... rest of your class definition}

lintエラーの抑制が常に最良のアイデアであるとは限らないことに注意してください。lintエラーの原因となったコードを変更した方がよい場合があります。

発生する可能性のある別の問題は、Gradle HOME環境変数に環境変数を設定していない場合です。この変数の名前は「GRADLE_HOME」で、gradleホームディレクトリのパスを設定する必要があります。たとえば、「C:\ gradle-1.12」のようにします。「ANDROID_HOME」の環境変数を設定して、「YOUR- SDK-Root \ sdk '

これが完了したら、Gradleタスクウィンドウに戻り、assembleAssembleReleaseをダブルクリックします。

すべて成功した場合は、app \ build \ apkフォルダーに移動して、デプロイ可能なAPKファイルを見つけることができます。


努力の+1および 'lintOptions {abortOnError false}'
Raz Tourgman

4

同じ問題に対するさらに別のアプローチ。ソースコード内にいかなる種類の資格も保存することは推奨されていないため、次のように、キーストアとキーエイリアスのパスワードを別のプロパティファイルに設定することにしました。

key.store.password=[STORE PASSWORD]
key.alias.password=[KEY PASSWORD]

gitを使用する場合、secure.propertiesなどのテキストファイルを作成できます。リポジトリから確実に除外する必要があります(gitを使用している場合は、.gitignoreファイルに追加します)。次に、他のいくつかの回答が示すように、署名構成を作成する必要があります。唯一の違いは、資格情報をロードする方法です。

android {
    ...
    signingConfigs {
        ...
        release {
            storeFile file('[PATH TO]/your_keystore_file.jks')
            keyAlias "your_key_alias"

            File propsFile = file("[PATH TO]/secure.properties");
            if (propsFile.exists()) {
                Properties props = new Properties();
                props.load(new FileInputStream(propsFile))
                storePassword props.getProperty('key.store.password')
                keyPassword props.getProperty('key.alias.password')
            }
        }
        ...
    }

    buildTypes {
        ...
        release {
            signingConfig signingConfigs.release
            runProguard true
            proguardFile file('proguard-rules.txt')
        }
        ...
    }
}

signingConfigをリリースビルドタイプに手動で割り当てることを忘れないでください(何らかの理由で、それが自動的に使用されると想定することがあります)。また、プロガードを有効にすることは必須ではありませんが、推奨されます。

環境変数を使用したり、ユーザー入力を要求したりするよりも、このアプローチの方が好きです。これは、コマンドラインを使用する必要がなく、IDEから、リアルビルドビルドタイプに切り替えてアプリを実行することによって実行できるためです。


1
Gradleはこれを使用してコンパイルしません。props= new Properties(); 「小道具」読み取り専用プロパティの値を設定することはできません
cesardsは

あなたは正しい@ m3n0Rです。アプリに導入しなければならない修正を反映するように応答の行を編集して、最新バージョンのGradleを使用してコンパイルできるようにしました。基本的に、propsはローカル変数として宣言する必要があります。
argenkiwi 2014年

クラウドCI / CDツールを使用してこれをどのように採用できるでしょうか。
sirvon 2014年

4

Android Studio [ファイル]-> [プロジェクト構造 ]に移動するか、Ctrl + Alt + Shift + Sを押します

画像を見る

ここに画像の説明を入力してください

OKをクリック

次に、signingConfigsがbuild.gradleファイルに生成されます。

ここに画像の説明を入力してください


そして、これはまさにあなたがしたくないことです。このようにして、すべてのパスワードがクリアテキストでプロジェクトの一部になり、分散ビルドであっても、誤って簡単に含めることができます。
not2qubit 2018

2

次の行を間違った場所に置くという問題がいくつかありました。

signingConfigs {
    release {
        // We can leave these in environment variables
        storeFile file("d:\\Fejlesztés\\******.keystore")
        keyAlias "mykey"

        // These two lines make gradle believe that the signingConfigs
        // section is complete. Without them, tasks like installRelease
        // will not be available!
        storePassword "*****"
        keyPassword "******"
    }
}

signingConfigsパーツをandroidセクション内に配置してください:

android
{
    ....
    signingConfigs {
        release {
          ...
        }
    }
}

の代わりに

android
{
    ....
}

signingConfigs {
   release {
        ...
   }
}

この間違いは簡単です。


2

それは2019年であり、V1(jar署名)またはV2(フルAPK署名)でAPKに署名する必要があります。「signed apk gradle」をグーグルで検索すると、ここに移動しました。そこで、ここに元のソリューションを追加します。

signingConfigs {
    release {
        ...
        v1SigningEnabled true
        v2SigningEnabled true
    }
}

私の元の質問:build.gradleファイルからV1(Jar署名)またはV2(フルAPK署名)を使用する方法


セミコロンは不要です。エラーが発生します。
加賀健志

そうです。ありがとう。回答を編集しました。
user1506104

1

他の回答を補完するために、キーストアが1つのプロジェクトに固有である場合に備えて、gradle.propertiesファイルをbuild.gradleとともに独自のモジュールフォルダーに配置することもできます。


1

私はUbuntu14.04で働いています。vim〜/ .bashrcおよびexport ANDROID_KEYSTORE = export ANDROID_KEYALIAS =を追加します

そして、build.gradleセットで。

    final Console console = System.console();
if (console != null) {

    // Building from console
    signingConfigs {
        release {
            storeFile file(System.getenv("KEYSTORE"))
            storePassword new String(System.console().readPassword("\n\$ Enter keystore password: "))
            keyAlias System.getenv("KEY_ALIAS")
            keyPassword new String(System.console().readPassword("\n\$ Enter key password: "))
        }
    }

} else {

    // Building from IDE's "Run" button
    signingConfigs {
        release {

        }
    }

}

私見はそれが最良の解決策のようですが、残念ながらそれは新しいバージョンのGradleで動作しなくなりました:をSystem.console()返しますnull
Antonio Vinicius Menezes Medei

1

別の方法は、リリースビルドでのみ実行されるタスクを定義することです。

android {
  ...
  signingConfigs {
     release {
        // We can leave these in environment variables
        storeFile file('nameOfKeystore.keystore')
        keyAlias 'nameOfKeyAlias'

        // These two lines make gradle believe that the signingConfigs
        // section is complete. Without them, tasks like installRelease
        // will not be available!
        storePassword "notYourRealPassword"
        keyPassword "notYourRealPassword"

     }
  }
  buildTypes {
     ...
     release {
        signingConfig signingConfigs.release
        ...
     }
  }
  ...
}

task setupKeystore << {
final Console console = System.console();
if (console != null) {
    //def keyFile = console.readLine(“\nProject: “ + project.name + “Enter keystore path: "))
    //def keyAlias = console.readLine(“Project: “ + project.name + “Enter key alias: ")
        def storePw = new String(console.readPassword(“Project:  + project.name + “. Enter keystore password: "))
        def keyPw  = new String(console.readPassword(“Project: “ + project.name + “.Enter keystore password: "))

    //android.signingConfigs.release.storeFile = file(keyFile);
    //android.signingConfigs.release.keyAlias = keyAlias
        android.signingConfigs.release.storePassword = storePw
        android.signingConfigs.release.keyPassword = keyPw
}
}

//Validate t
def isReleaseConfig = gradle.startParameter.taskNames.any {it.contains('Release') }
if (isReleaseConfig) {
    setupKeystore.execute();
}

以下は私にとって好ましいように思われます:stackoverflow.com/a/19130098/3664487 2つのアプローチの違い
user2768 2015年

1

コマンドラインからパスワードを要求できます。

...

signingConfigs {
  if (gradle.startParameter.taskNames.any {it.contains('Release') }) {
    release {
      storeFile file("your.keystore")
      storePassword new String(System.console().readPassword("\n\$ Enter keystore password: "))
      keyAlias "key-alias"
      keyPassword new String(System.console().readPassword("\n\$ Enter keys password: "))
    } 
  } else {
    //Here be dragons: unreachable else-branch forces Gradle to create
    //install...Release tasks.
    release {
      keyAlias 'dummy'
      keyPassword 'dummy'
      storeFile file('dummy')
      storePassword 'dummy'
    } 
  }
}

...

buildTypes {
  release {

    ...

    signingConfig signingConfigs.release
  }

  ...
}

...

if-then-elseリリースを構築しているときのブロックは、パスワードの要求を防ぎます。elseブランチに到達できませんが、Gradleをだましてinstall...Releaseタスクます。

バックストーリーhttps://stackoverflow.com/a/19130098/3664487で述べられているように、「GradleスクリプトはSystem.console()。readLineメソッドを使用してユーザー入力を要求することができます。」残念ながら、デバッグリリースをビルドしている場合でも、Gradleは常にパスワードを要求します(Gradleを使用してリリース署名されたapkファイルを作成する方法を参照してください)。幸い、上で示したように、これは克服できます。


以前の回答で、stackoverflow.com / questions / 33897802 /…が原因で問題が発生しました。この問題を解消するために、回答を修正しました。
user2768 2015年

@ Haroon、2015年11月24日時点で機能していました。コミュニティが問題の解決に役立つ可能性がありますが、詳細を提供する必要があります。
user2768

この解決策は、テキストファイルにパスワードをクリアテキストで入力することを回避しますが、この厄介な問題のため、gradleではSystem.console()。readLineが機能しないためです。
モーフィウス2017年

@morpheus、問題は一度もありません。上記は私のために働いています。
user2768 2017年

IDE内からスクリプトを実行すると思います。スクリプトをターミナルから実行すると、エラーが表示されます。しかし、この答えをありがとう。これは私が探していたものです。
モーフィアス

0

react-native-configパッケージを使用して、React-Nativeでそれを行う私の方法を追加します。
.envファイルを作成します。

RELEASE_STORE_PASSWORD=[YOUR_PASSWORD]
RELEASE_KEY_PASSWORD=[YOUR_PASSWORD]

これはバージョン管理の一部ではないことに注意してください。

あなたのbuild.gradle

signingConfigs {
        debug {
            ...
        }
        release {
            storeFile file(RELEASE_STORE_FILE)
            storePassword project.env.get('RELEASE_STORE_PASSWORD')
            keyAlias RELEASE_KEY_ALIAS
            keyPassword project.env.get('RELEASE_KEY_PASSWORD')
        }
    }


0

Groovy(build.gradle)の場合

署名資格情報を直接build.gradleファイルに配置しないでください。代わりに、資格情報はバージョン管理されていないファイルから取得する必要があります。

モジュール固有のbuild.gradleが見つかる場所にsigning.propertiesファイルを置きます。それを.gitignoreファイルに追加することを忘れないでください!

signing.properties

storeFilePath=/home/willi/example.keystore
storePassword=secret
keyPassword=secret
keyAlias=myReleaseSigningKey

build.gradle

android {
    // ...
    signingConfigs{
        release {
            def props = new Properties()

            def fileInputStream = new FileInputStream(file('../signing.properties'))
            props.load(fileInputStream)
            fileInputStream.close()

            storeFile = file(props['storeFilePath'])
            storePassword = props['storePassword']
            keyAlias = props['keyAlias']
            keyPassword = props['keyPassword']
        }
    }

    buildTypes {
        release {
            signingConfig signingConfigs.release
            // ...
        }
    }
}

0

Kotlinスクリプト(build.gradle.kts)

署名資格情報をbuild.gradle.ktsに直接配置しないでください。ファイルに。代わりに、資格情報はバージョン管理されていないファイルから取得する必要があります。

モジュール固有のbuild.gradle.ktsが見つかる場所にsigning.propertiesファイルを置きます。それを.gitignoreファイルに追加することを忘れないでください!

signing.properties

storeFilePath=/home/willi/example.keystore
storePassword=secret
keyPassword=secret
keyAlias=myReleaseSigningKey

build.gradle.kts

android {
    // ...
    signingConfigs {
        create("release") {
            val properties = Properties().apply {
                load(File("signing.properties").reader())
            }
            storeFile = File(properties.getProperty("storeFilePath"))
            storePassword = properties.getProperty("storePassword")
            keyPassword = properties.getProperty("keyPassword")
            keyAlias = "release"
        }
    }

    buildTypes {
        getByName("release") {
            signingConfig = signingConfigs.getByName("release")
            // ...
        }
    }
}

-1

表示したくない場合はnullオブジェクトでメソッドreadLine()を呼び出せません。最初にgradle.propertiesに書き込む必要があります。

KEYSTORE_PASS=*****
ALIAS_NAME=*****
ALIAS_PASS=*****
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.