日々是好日

プログラミングについてのあれこれ、ムダ知識など

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

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

今のところ一番腑に落ちる配置の仕方かな?

keystoreとは

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

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

developer.android.com

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

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

※情報として古いかもなのでご参考まで。

環境

手順

/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ファイルを生成する

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

f:id:kcpoipoi:20200812153238p:plain:w300

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

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

f:id:kcpoipoi:20200812153313p:plain:w500

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

f:id:kcpoipoi:20200812153332p:plain:w500

パスワードを設定し、Certificationの少なくともひとつのボックスに入力したら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に記述します。

RELEASE_STORE_FILE=/YourProjectName/release.keystore
RELEASE_STORE_PASS=xxxxx
RELEASE_ALIAS=xxxxx
RELEASE_KEY_PASS=xxxxx

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

appレベルbuild.gradleandroidブロックに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 "======================================================="
      }
    }
  }
}

ビルドバリアントをreleaseにしてビルド

ビルドバリアントをreleaseにし、署名付きAPKをビルドできれば完了です。

参考

ほぼ翻訳先。

stackoverflow.com