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


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

keystoreとは

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

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

公式 - アプリへの署名

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

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

環境

  • Windows 10 Pro

手順

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

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

/Users/user/.gradle/gradle.properties
Keys.repo='/Users/user/.signing'

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

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

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

keystoreファイルを生成する

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

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

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

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

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

keystoreを.signing/YourProjectNameに移動する

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

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

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

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

.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を記述します。

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

他にも書き方いろいろ。

Android Studio(Gradle)でapkファイルを作成する時にstorePassword/keyAlias/keyPasswordの指定方法をいくつか検証してみた。