Gradleを使用して、リリース署名されたapkファイルを作成するためにGradleをビルドしたいと思います。
gradle build
を実行するときにコードが正しいかどうか、またはパラメーターが欠落しているかどうかわかりませんか。
これは私のgradleファイルのコードの一部です:
Android {
...
signingConfigs {
release {
storeFile file("release.keystore")
storePassword "******"
keyAlias "******"
keyPassword "******"
}
}
}
グラドルビルドは成功し、私のbuild/apk
フォルダーには...-release-unsigned.apk
と...-debug-unaligned.apk
ファイルしかありません。
これを解決する方法について何か提案はありますか?
私はこのコードを追加してgradle build
でビルドして解決しました。
Android {
...
signingConfigs {
release {
storeFile file("release.keystore")
storePassword "******"
keyAlias "******"
keyPassword "******"
}
}
buildTypes {
release {
signingConfig signingConfigs.release
}
}
}
これは署名されたリリースのapkファイルを生成します。
以前の答えよりも簡単な方法:
これを~/.gradle/gradle.properties
に入れてください
RELEASE_STORE_FILE={path to your keystore}
RELEASE_STORE_PASSWORD=*****
RELEASE_KEY_ALIAS=*****
RELEASE_KEY_PASSWORD=*****
build.gradle
を以下のように修正してください。
...
signingConfigs {
release {
storeFile file(RELEASE_STORE_FILE)
storePassword RELEASE_STORE_PASSWORD
keyAlias RELEASE_KEY_ALIAS
keyPassword RELEASE_KEY_PASSWORD
}
}
buildTypes {
release {
signingConfig signingConfigs.release
}
}
....
それならgradle assembleRelease
を実行できます。
@ sdqaliのスクリプトは(少なくともGradle 1.6を使用しているときは) any 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"
}
}
私はそれを機能させるために(Androidの下で)次のものも追加しなければならなかったことに注意してください。
buildTypes {
release {
signingConfig signingConfigs.release
}
}
build.gradleでキーストアとパスワードをハードコーディングしたくない場合は、ここで説明するようにプロパティファイルを使用できます: HANDLING SIGNING CONFIGSクレードル付き
基本的に:
1)myproject.propertiesファイルを/ home/[username] /。signingに次の内容で作成します:
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']
}
}
}
@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
を実行できます。
これを行うための複雑な方法がいくつあるかは驚くべきことです。ここに私自身の方法があります、私はグーグル自身に固執しようとします 推奨 。ただし、それらの説明は完全には明確ではないため、Linuxの手順について詳しく説明します。
パスワードと署名ファイルをアプリ開発(GIT)パスに保持せずに、ビルド中にアプリに自動的に署名するためのデフォルトの Googleの指示 は、あいまいです。これを行うための明確なステップバイステップの手順は次のとおりです。
次のパスで指定されたディレクトリに「MyApp」というアプリがあります:$HOME/projects/mydev/MyApp
。ただし、MyAppディレクトリはGITで使用および制御されます。
.gitignore
などを非常に使用できる場合でも、GITが管理するディレクトリ内のどこにも署名またはパスワードファイルを置きたくないのは明らかです。そのため、外部にキーストアと署名ファイルが必要です。
次の3つのことを行う必要があります。
build.gradle
ファイルを編集して、(1)および(2)を使用します。この例では、2つのファイルに名前を付けます。
keystore.properties
MyApp-release-key.jks
これらのファイルの両方をここに配置できます。
cd $HOME/projects/mydev/
最初のファイルには、で使用されるクリアテキストパスワードが含まれています。 (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番目のファイルが自動的に生成されます。他にアプリがなく、これが唯一のキーストアである場合は、次を使用してファイルを作成します。
cd $HOME/projects/mydev/
keytool -genkeypair -v -keystore MyApp-release-key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias myapp
これにより、2つのパスワードと一連の情報が要求されます。 (Android Studioと同じもの。)以前に選択したパスワードをコピー/貼り付けます。
gradle.build
ファイルを編集します次の部分は、アプリ/モジュールのGradleビルドファイルに存在する必要があります。最初に、次の行を追加しますoutsideおよびbefore your Android {}
ブロック。
//def keystorePropertiesFile = rootProject.file("$HOME/.Android/keystore.properties")
def keystorePropertiesFile = rootProject.file("../../keystore.properties")
def keystoreProperties = new Properties()
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
次に、inside the 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で使用できる適切に署名されたアプリが生成されます。
PDATE: 2019-04-02
keytool
およびsomethingの最新バージョンでは、使用するオリジナル/デフォルトの代わりにPKCS12ベースのキーファイルを使用する必要があることが示されています。上記。 それらは新しいオープンPKCS12形式に変換する必要があることを伝え続けます。ただし、Android開発ツールはまだ準備が整っていないようです。これを行うと、次の奇妙なエラーが発生するためです。
com.Android.ide.common.signing.KeytoolException:
ストア "F:\ XXX\XXX.jks"からのキーXXXの読み取りに失敗しました:キーの取得に失敗しました:最後のブロックが適切にパディングされていません。復号化中に不正なキーが使用されると、このような問題が発生する可能性があります。
変換されたキーを使用しないでください!
( 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
}
}
...
これは user672009 への返信であり、 sdqaliの投稿への追加です (彼のコードはIDEの "Run"ボタンでデバッグ版をビルドするとクラッシュします)
次のコードを使うことができます。
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 {
}
}
}
私のようにコマンドラインから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"
新しいAndroid Studioには、とても簡単なGUIの方法があり、Gradleファイルにも入力されています。
File -> Project Structure
Module ->
メインモジュールを選択します( 'app'または他のカスタム名)
Signing
タブ - >新しい画像を追加するためのプラス画像
右側の塗りつぶしデータ
OKとGradleファイルが自動的に作成されます
手動でsigningConfig signingConfigs.NameOfYourConfig
の内側にbuiltTypes{release{}}
という行を追加する必要があります。
画像:
2つの重要な(!)メモ:
(編集12/15)
署名付きAPKを作成するには、Android Studioの[ターミナル]タブ(メインインターフェイスの下部)を開き、コマンド./gradlew assembleRelease
を発行する必要があります。
keyAlias
を忘れた場合(よくあることですが)、プロセスを開始してAliasキーの名前を確認するにはBuild -> Generate Signed APK
を開始する必要があります。
キーストアファイルがすでにある場合は、ビルドコマンドにいくつかのパラメータを追加するのと同じくらい簡単です。
./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
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
}
}
}
署名を助けるために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
お望みなら、storeFileとkeyAliasを設定するために-Pを使うことができます。
これは基本的にDestilのソリューションですが、コマンドラインオプションがあります。
Gradleプロパティの詳細については、 gradleユーザーガイド を確認してください。
@Destilの答えは、すべてのプロジェクトで同じ構成を再利用できる場合に適しています。または、Android Studioにはlocal.properties
ファイルが付属しており、代わりに使用できますが、IDEで生成されたと思われるため、Android Studio内から拡張する方法が見つかりません。
これは @ jonbo's answer のバリエーションです。その答えは、プロジェクト固有の設定を可能にしますが、開発者のオーバーヘッドが少しかかります。特に、signingConfigs
の定義を別のファイルに移動するには、特に複数のプロジェクトでそうする必要がある場合、重要な定型文が必要です。これがDestilのソリューションを選ぶ主な理由です。これは、次の行を含むalsoによって多少軽減できます。
apply plugin: 'com.Android.application'
IDEの完了を許可するため、資格情報ファイルで。
最後に、ここでのほとんどのソリューションは、notで、デバッグモードでのプロジェクトのビルドを許可します-デバッグ署名を自動的に処理します-意味的に有効でない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.signing
をsigning.gradle
にコピーし、ダミー値を有効な資格情報で置き換えます。
// signing.gradle
ext.signing = [
storeFilePath : 'real/keystore',
storePassword : 'real keystore password',
keyAlias : 'real key alias',
keyPassword : 'real key password',
]
もちろん、signing.gradle
はVCSによって無視されるべきです。
ほとんどすべてのプラットフォームがある種のキーリングを提供するようになったため、クリアテキストのパスワードを残す理由はありません。
私は Python Keyringモジュール (主にコンパニオンコンソールスクリプトkeyring
)とGroovy ['do', 'something'].execute()
feature についての最小限のラッパーを使った簡単な解決法を提案します。
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
を実行する前に、鍵リングにパスワードを設定する必要があります。一度だけです。
$ keyring set google-play Android.keystore # will be prompted for the passwords
$ keyring set google-play com.example.app
ハッピーリリース!
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
}
}
}
私はこの1つを考え出すの楽しみのかなり多くを持っていました。これが私のウォークスルーです。
IntelliJでグラドルビルドファイルを作成する方法のAからZへのウォークスルー(v.13.1.4)このウォークスルーは、キーストアファイルの作成方法を知っていることを前提としています。このチュートリアルを実行するには、キーストアファイルをアプリフォルダーに配置する必要があり、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 {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.Android.support:support-v4:20.0.0'
compile 'com.Android.support:appcompat-v7:20.0.0'
}
ここで選択したファセットからファイル/プロジェクト構造と「アンドロイド-のGradle(APP)をクリックしてください:あなたは、メニューオプションからこのビルドファイル(上記)の一部を構築することができます。このチュートリアルでは、[プロパティ]、[署名]、[フレーバー]、[ビルドタイプ]、および[依存関係]のタブが表示されます。ここでは、[署名]と[ビルドタイプ]を使用します。 ([名前]セクションの)[ビルドタイプ]の下に、ビルドタイプ設定を識別したい名前を入力し、他の4つのフィールドにキーストア情報を入力します(キーストアパスをアプリケーションフォルダの下に設定します)。
「Build Types」の下で、名前フィールドに値「assembleRelease」を入力し、「Debuggable」をfalseに、「Jni Debug Build」をfalseに、「Run Proguard」をtrueに、「Zip Align」をtrueに設定します。これでビルドファイルが生成されますが、上に示したものではありませんが、後でビルドファイルにいくつか追加する必要があります。ここでのProGuardファイルの場所は、グラドルビルドファイルで手動で設定されます。 (上記のとおり)
次のように後で追加する必要がありますDSLコンテナは、次のとおりです。
Android {
....
compileSdkVersion 19
buildToolsVersion '20.0.0'
defaultConfig {
minSdkVersion 8
targetSdkVersion 19
versionCode 1
versionName "1.0"
}
....
}
また追加する必要があります。
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.Android.support:support-v4:20.0.0'
compile 'com.Android.support:appcompat-v7:20.0.0'
}
設定ファイルの一番下にはなく、AndroidのDSLコンテナ内にある必要があります(「依存関係」)上記のこのDSLのコンテナに注意してください。 IntelliJメニューから依存関係コンテナを構築するには、[ファイル/プロジェクト構造]を選択します。そこからもう一度Facetsを選択し、次にAndroid-Gradle(app)を選択します。前述したようにあなたは、同じ5つのタブが表示されます。 [依存関係]タブを選択して、必要な依存関係を追加します。
これがすべて完了したら、このチュートリアルの先頭にあるファイルに似たGradleビルドファイルが表示されるはずです。署名付きZip形式のリリースをビルドするには、Gradleタスクを開く必要があります。このウィンドウに行くにはView/Tool Windows/Gradleを選択します。ここからは、「assembleAssembleReleaseをダブルクリックすることができます。これにより展開可能なAPKが生成されます。
あなたのリリースをコンパイルするときに発生する可能性が潜在的な問題です(これらに限定されない):あなたのGradleは間違った場所にいるファイルをビルドします。 Gradleのビルドファイルは2つあります。 1つはアプリケーションルートフォルダにあり、もう1つはアプリケーションルートの下のappフォルダにあります。あなたは後者を使わなければなりません。
糸くずの問題もあるかもしれません。 (注:Android Developer StudioはIntelliJよりもLintの問題を発見するのに優れています。メニューオプションから署名付きAPKを生成しようとするとこれに気付くでしょう)
糸くずの問題を回避するには、(一番上の)Androidコンテナの内側に次のDSLコンテナを配置する必要があります。
Android {
....
lintOptions {
abortOnError false
}
....
}
これをあなたのAndroid DSLコンテナの中に入れるとエラーファイルがbuildフォルダ(あなたのappフォルダの直下)に生成されるでしょう。ファイル名は 'lint-results-release-fatal.html'のようなものになるでしょう。エラーが発生したクラス生成されるもう1つのファイルは、lintエラーに関連付けられている「issue ID」を含むXMLファイルです。ファイル名は「lint-results-release-fatal.xml」のようになります。ファイルの一番上のどこかに、ノード「issue」があり、その中に「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エラーを抑制することが必ずしも最良のIDEAとは限らないことに注意してください。lintエラーの原因となったコードを変更することをお勧めします。
発生する可能性があるもう1つの問題は、Gradle HOME環境変数に環境変数を設定していない場合です。この変数は 'GRADLE_HOME'という名前で、 'C:\ gradle-1.12'のように、gradleホームディレクトリのパスを設定する必要があります。 'Android_HOME'の環境変数を 'YOUR-'に設定したい場合もあります。 SDK-ルートの\ SDK」
これが終わったら、Gradleタスクウィンドウに戻って、assembleAssembleReleaseをダブルクリックします。
すべてが成功した場合は、フォルダアプリ\ビルド\のAPKに移動して、あなたの展開可能なAPKファイルを見つけることができるはずです。
同じ問題に対するさらに別のアプローチ。ソースコード内にいかなる種類の資格情報も格納することはお勧めできないため、キーストアとキーエイリアスのパスワードを次のように別のプロパティファイルに設定することにしました。
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をリリースビルドタイプに手動で割り当てることを忘れないでください(何らかの理由で、私は時々それが自動的に使用されると思います)。また、proguardを有効にすることは必須ではありませんが、お勧めです。
このアプローチは、環境変数を使用したりユーザー入力を要求したりするよりも、コマンドラインを使用しなくても、再リリースビルドタイプに切り替えてアプリケーションを実行することで実行できるため、より適しています。
私は間違った場所に次の行を置くこといくつかの問題がありました:
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 {
...
}
}
この間違いを犯すのは簡単です。
私はUbuntu 14.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 {
}
}
}
代替案は、リリースビルドでのみ実行されるタスクを定義することです。
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();
}
コマンドラインからパスワードを要求できます。
...
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は常にパスワードを要求します(crad. Gradleを使用してリリース署名されたapkファイルを作成する方法? を参照)。幸い、これは私が上に示したように克服することができます。
他の答えを補足するために、キーストアが1つのプロジェクトに固有の場合に備えて、build.gradleと共にgradle.propertiesファイルを独自のモジュールフォルダーに配置することもできます。