web-dev-qa-db-ja.com

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

Gradleを使用して、リリース署名されたapkファイルを作成するためにGradleをビルドしたいと思います。

gradle buildを実行するときにコードが正しいかどうか、またはパラメーターが欠落しているかどうかわかりませんか。

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

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

グラドルビルドは成功し、私のbuild/apkフォルダーには...-release-unsigned.apk...-debug-unaligned.apkファイルしかありません。

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

472

私はこのコードを追加してgradle buildでビルドして解決しました。

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

これは署名されたリリースのapkファイルを生成します。

248

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

これを~/.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を実行できます。

363
David Vávra

@ 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
    }
}
64
jclehner

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']
        }
    }
}
57
IgorGanapolsky

@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を実行できます。

34
Gal Bracha

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

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


説明:

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

最初の仮定:

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

enter image description here

問題

.gitignoreなどを非常に使用できる場合でも、GITが管理するディレクトリ内のどこにも署名またはパスワードファイルを置きたくないのは明らかです。そのため、外部にキーストアと署名ファイルが必要です。

溶液

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

  1. Android St​​udioで使用されるパスワードファイルを作成します
  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 St​​udioと同じもの。)以前に選択したパスワードをコピー/貼り付けます。

(3)上記を使用するようにモジュール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の読み取りに失敗しました:キーの取得に失敗しました:最後のブロックが適切にパディングされていません。復号化中に不正なキーが使用されると、このような問題が発生する可能性があります。

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

32
not2qubit

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

  ...
27
jonbo

これは 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 {

        }
    }

}
17
AChep

私のようにコマンドラインから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"
15
Egis

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

  1. File -> Project Structure

  2. Module ->メインモジュールを選択します( 'app'または他のカスタム名)

  3. Signingタブ - >新しい画像を追加するためのプラス画像

  4. 右側の塗りつぶしデータ

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

  6. 手動でsigningConfig signingConfigs.NameOfYourConfigの内側にbuiltTypes{release{}}という行を追加する必要があります。

画像:

enter image description here

enter image description here

2つの重要な(!)メモ:

(編集12/15)

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

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

14
sandalone

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

./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

11
janpio
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
        }
    }
}
10
JP Ventura

署名を助けるために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ユーザーガイド を確認してください。

9
Andy Shiue

@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.signingsigning.gradleにコピーし、ダミー値を有効な資格情報で置き換えます。

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

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

6
mkjeldsen

ほとんどすべてのプラットフォームがある種のキーリングを提供するようになったため、クリアテキストのパスワードを残す理由はありません。

私は 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

ハッピーリリース!

5
naufraghi

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
SRC

私はこの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ファイルを見つけることができるはずです。

4
user2288580

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

画像を見る

enter image description here

Okをクリック

それからsigningConfigがbuild.gradleファイルに生成されます。

enter image description here

3

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

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を有効にすることは必須ではありませんが、お勧めです。

このアプローチは、環境変数を使用したりユーザー入力を要求したりするよりも、コマンドラインを使用しなくても、再リリースビルドタイプに切り替えてアプリケーションを実行することで実行できるため、より適しています。

3
argenkiwi

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

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
Botond Kopacz

私は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 {

        }
    }

}
1
ayyb1988

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

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();
}
1
davidpetter

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

...

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
user2768

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

1
cprcrack