Androidアプリのアップロード鍵.keystoreの作成と管理について

Androidの署名ファイル（keystore）について個人的まとめ。

# keystoreとは

今回作成するkeystoreファイルはアップロード鍵と呼ばれるもの。

> アップロード鍵: Google Play アプリ署名用にアップロードする前に、App Bundle または APK への署名に使用する鍵。アップロード鍵は非公開にする必要があります。

[公式 - アプリへの署名](https://developer.android.com/studio/publish/app-signing?hl=ja:embed:cite)

非公開にしなければならないため、Androidプロジェクトディレクトリ配下に置いてあると、うっかりGitHubにプッシュしてしまったりと危険な香りがします。 

そのためローカル（`/Users/user/.gradle`）に格納し、アプリのビルド時もそこから参照するように設定します。

# 環境

* Windows 10 Pro

# 手順

## /Users/user/.gradle/gradle.propertiesにパスを記述する

あらかじめ`Keys.repo`という名前でパスを定義しておきます（名前は任意）。
`gradle.properties`が無い場合は作成してください。

```groovy:/Users/user/.gradle/gradle.properties
Keys.repo='/Users/user/.signing'
```

## .gradle/.signingフォルダを作る

パスワード等を記述した`projectname.properties`を格納するため、`.signing`というディレクトリを作成します（`projectname`部分は任意）。
さらに、直下に`keystore`を格納するためのディレクトリを作成します。

```ps1
$ mkdir .gradle/.signing
$ New-Item -Type File projectname.properties # touchと同じ
$ mkdir .gradle/.signing/YourProjectName # keystoreを格納。名前は任意
```

## keystoreファイルを生成する

Android Studioを起動し、**Build -> Generate Signed Bundle / APK**をクリックします。

![generate_nav.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209042/26e17ebf-0ba8-e390-d195-f445e231e94d.png)


選択は**APK**でも**Bundle**でも、どちらでも構わないようです。
今回は**APK**を選択し、**Next**をクリックします。

次に、**Create new...**をクリックしてkeystoreの作成先を指定します。

![generate_nav2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209042/b279e01b-ae9d-07de-0743-8fa93f8623ff.png)

keystoreは作成したら`.signing`に移動させるので、プロジェクトルート直下等適当な場所で構いません。
ファイル名は`release.keystore`としておきます。

![generate_nav3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209042/2c434956-7732-f83b-0a72-3f5f70e19d25.png)


パスワードを設定し、Certificateの少なくともひとつのボックスに入力したら**OK**をクリックします。
そうしたら**Next**をクリックし、次の画面で**Finish**をクリックすれば、指定したディレクトリに`release.keystore`が作成されます。

## keystoreを.signing/YourProjectNameに移動する

`release.keystore`を`.signing/YourProjectName`ディレクトリに移動します。

```ps1
$ mv ProjectRoot/release.keystore /Users/user/.gradle/.signing/YourProjectName
```

## パスワードをprojectname.propertiesに記述する

`release.keystore`を作成するときに設定したパスワード等を`.signing/projectname.properties`に記述します。

```groovy:.signing/projectname.properties
RELEASE_STORE_FILE=/YourProjectName/release.keystore
RELEASE_STORE_PASS=xxxxx
RELEASE_ALIAS=xxxxx
RELEASE_KEY_PASS=xxxxx
```

## build.gradleに署名付きビルドのためのコードを記述する

appレベル`build.gradle`のandroidブロックに`signingConfig`を記述します。

```groovy:appレベルbuild.gradle
android {
  signingConfigs {
    debug {}
    release {
      if (project.hasProperty("Keys.repo")) {
        def projectPropsFile = file(project.property("Keys.repo") + "/projectname.properties")
        if (projectPropsFile.exists()) {
          Properties props = new Properties()
          props.load(new FileInputStream(projectPropsFile))

          storeFile file(file(project.property("Keys.repo") + props['RELEASE_STORE_FILE']))
          storePassword props['RELEASE_STORE_PASS']
          keyAlias props['RELEASE_ALIAS']
          keyPassword props['RELEASE_KEY_PASS']
        }
      } else {
        println "======================================================="
        println "[ERROR] - Please configure release-compilation environment - e.g. in ~/.signing  directory"
        println "======================================================="
      }
    }
  }
}
```

以上です。

# 参考

ほぼ翻訳先。

[gradle set absolute path value for a keystore file](https://stackoverflow.com/questions/35983677/gradle-set-absolute-path-value-for-a-keystore-file/35989396#35989396)

他にも書き方いろいろ。

[Android Studio(Gradle)でapkファイルを作成する時にstorePassword/keyAlias/keyPasswordの指定方法をいくつか検証してみた。](https://qiita.com/shiraji/items/8f55b5295094487ce71a)