Androidの署名の仕組みについて調べたことをまとめます。
ローカルでreleaseバリアントをビルドするところまでで、Play Storeへのリリースまでは扱いません。
内容は基本的に公式ドキュメントのまとめです。
https://developer.android.com/studio/publish/app-signing?hl=ja
Android Studioのバージョンは3.2です。
署名の意味
公開キー証明書(電子証明書)には、公開キーおよび、キーの所有者を特定するメタデータ情報が含まれている。
APKに署名すると、公開キー証明書がAPKにアタッチされる。公開キー証明書は指紋の役割を果たすため、以降のAPKのアップデートが元の作成者からリリースされたことが確認できる。
デバッグ用証明書
Android Studioでアプリを実行すると、Android Studioがデバッグ用証明書を生成し、自動でAPKに署名する。
デバッグ用証明書と証明書作成に使用された秘密キーは以下に保存されている。
~/.android/debug.keystore
リリース用証明書の作成と、自動で署名してアプリを実行する方法
releaseバリアントでアプリを起動しようとすると、以下のエラーが表示される。
Error: The apk for your currently selected variant (app-release.apk) is not signed. Please specify a signing configuration for this variant (release).
これは、releaseバリアントに署名設定がされていないために起こるエラーである。
なお、debugバリアントは特別で、Android Studioによって自動で署名が行われるようになっていて、署名設定の編集もできない。
Android Studio はデバック用署名情報を署名の設定に自動的に保存するため、デバッグのたびに入力する必要はありません。...デバッグ用署名の設定を直接編集することはできません
キーストアの生成
署名に必要なキーストアの生成は、Build > Generate Signed Bundle / APKメニューから行う。
キーストアの情報を入力する。
- 
Key store path: キーストアの保存場所を指定する。あんまりよくわかってないが、ファイル拡張子はjksにすると良さそう。
- 
Password: キーストアのパスワード。署名設定時に必要になる。キーストアの中身を確認する際にも使用する。
- 
Key > Alias: キーの名前。署名設定時に必要になる。
- 
Key > Password: キーのパスワード。署名設定時に必要になる。
- 
Key > Validity (years): デフォルトのままにしておいた。
- 
Key > Certificate: どれか一つ入力が必要なので、名前だけ入れておく。
入力したらOKをクリックする。
これでキーストアが作成されたので、Cancelをクリックしてウィザードを終了する。
キーストアの中身は以下のコマンドで確認できる。
キーストアのパスワードを聞かれるので、先程設定したものを入力する。
$ keytool -v -list -keystore ~/Desktop/android.jks
キーストアのパスワードを入力してください:
キーストアのタイプ: JKS
キーストア・プロバイダ: SUN
キーストアには1エントリが含まれます
別名: key0
作成日: Dec 11, 2018
...
releaseバリアントの署名設定
releaseバリアントに署名設定を行う。
File > Project StructureメニューのSigningタブで新しい署名設定を作成する。
先程作成したキーストアの情報に合わせる。
Key PasswordとStore Passwordの位置がさっきの画面と逆なので注意(ここで少しハマった...)。
Build Typesタブでreleaseを選択し、Signing Configに先程作成した署名設定(ここではconfig)を指定する。
ここまでできたら、Build Variantsウィンドウでreleaseバリアントを指定してアプリを実行できる。
署名設定は、build.gradleファイルに反映されているのでわかりやすい(パスワードが丸見えなので、環境変数化するとか必要)。
android {
    signingConfigs {
        // 署名設定
        config {
            keyAlias 'key0'
            keyPassword 'S853OEW2'
            storeFile file('/Users/user/Desktop/android.jks')
            storePassword 'zsAU2hbV'
        }
    }
    ...
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.config  // 署名設定
        }
    }
}







