Google Play App Signing に対応させる

# 概要

自分の個人アプリを Google Play App Signing に対応させた時の作業に基づき、署名移行時の具体的な作業内容について書きます。誤った内容があったらコメントいただければと思います。

詳細: https://developer.android.com/studio/publish/app-signing?hl=ja

# 基礎知識

## Google Play App Signing とは

Androidアプリに対して付与する署名の新しい管理方式。アプリ署名とアップロード署名の2段階で署名され、安全な鍵管理が行えるようになります。
**アプリ署名**：Google Play側で管理され、登録時に勝手に署名されます。こちらから触れず、基本的には変わりません。
**アップロード署名**: ユーザ側で管理し、Google Playにアプリをアップロードする時にこれで署名されている必要があります。流出時などに申請で変更することができます。



## 対応期限

Google Playにアプリ登録するためには必ず署名が必要になり、現状では従来の署名方式と、Google Play App Signingのいずれかで登録できます。ただし、AAB形式で登録する上でGoogle Play App Signing対応が必須となり、新規アプリは2021年8月以降、既存アプリは2021年11月以降はAAB対応が必須となることから、そこまでに対応する必要があります。

# 作業内容

## Google Play App Signing への登録作業

端的に書くと、鍵の登録作業は次のようになります。

* 既存アプリが移行する場合
  * アプリ署名: 既存の署名をGoogle Playに登録する
  * アップロード署名: 新しく発行する
* 新規アプリ
  * アプリ署名: Google Playでアプリ登録すると勝手に作られる (作業不要)
  * アップロード署名: 新しく発行する

### 既存アプリの移行

既存アプリのメニューから「アプリの署名」を開くと、次の画面が開きます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78503/5f187bff-145a-12e7-1574-c3f169a7a20e.png" width="480" />

ここでは、「Android Studioから鍵をエクスポートしてアップロードする」による手順について書きます。

1. **Android Studioから鍵をエクスポートします**  
  [手順](https://developer.android.com/studio/publish/app-signing#sign_release)に従って、従来の署名からアプリ署名鍵ファイル(.pepk)を生成します。(これがアプリ署名になるので、厳重に扱います。)
2. **秘密鍵をアップロード**  
   1で作成した鍵をアップロードします。
3. **セキュリティを強化するには、新しいアップロード鍵を生成してください**  
   (省略可)となっていますが、省略するとアプリ署名と同じ鍵が使われるようなので、セキュリティの観点から省略するべきではないと思います。作業としては、次のようになります。
  * [手順](https://developer.android.com/studio/publish/app-signing#generate-key)に従いAndroid Studioを使って新しいアップロード用のkeystoreファイルを作成します。
  * 表示されているコマンドに従い、pemファイルを作成します。
  * pemファイルをアップロードします。

以上で、移行が完了です。

### 新規アプリの登録

現在、Google Playで新規アプリを作成すると、アプリ署名は自動的に作成されるため、こちらで作成等の作業をすることはないと思います。
アップロード署名については、新しく署名したAAB/APKをGoogle Playにアップロードしてリリースすると、そこに使われている署名が自動的にアップロード署名として扱われ、以後はそれを運用してくようになります。

## アプリの更新

アプリを更新する場合は、アップロード署名が付与されたAAB/APKをGoogle Playにアップロードします。すると、Google Playで自動的にアプリ署名がされ、それがストア上にリリースされます。
ちなみに、手元で動作確認をするために、アプリ署名されたアプリが欲しい場合、Google Play Consoleのメニューから、「App Bundle エクスプローラ」を開き、「ダウンロード」タブを開くと、APKがダウンロードできます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78503/ebd0c049-d9a7-16ff-402d-41a13b32bafd.png" width="480" />

# その他

## 既存の署名の管理はどうするか

(新しいアップロード鍵の生成を省略しなかった場合は)恐らく今後扱うことは無いと思うので、触れないようにアプリ管理者が厳重保管しておくのが良いと思います。移行作業で作成したpepkファイルは削除してしまいましょう。CIなどに署名用に登録している署名ファイルは、アップロード署名に置き換えます。とにかく、人目に触れるところに残さないようにするべきです。
新しいアップロード鍵の生成を省略した場合は、これがそのままアップロード署名になるはずなので従来と同様に運用します。

## アップロード署名の管理はどうするか

新しく発行する必要がありますが、従来の署名で使っていたパスワードと異なるパスワードを与えた方がいいと思います。こちらは手元でファイルを管理し、従来の署名と同様に扱います。

一つの開発者/企業で複数アプリを管理する必要がある場合、アプリ毎に発行するのではなく、共通のアップロード署名として管理する方法でも良いのかも知れませんが、この辺の正式な運用についてあまり知見がないので、よく分かっていません。
参考: [Androidアプリ開発のキーストアとエイリアスについて – 時にはWEBの話っ！](https://blog.aroundit.net/android-keystore-alias/)

## 署名の違いによる注意点

Google Map SDKなど、フィンガープリントを登録することで、APIを利用可能なアプリを制限するサービスを利用する場合、アップロード署名が付与されたアプリと、アプリ署名が付与されたアプリは、別のフィンガープリントになるため、それぞれの値を登録する必要がある点に注意です(アップロード署名版の方は無視してもいいかもしれませんが)。
また、公開前にアプリの動作確認をする場合は、App Bundle エクスプローラからアプリ署名されたAPKをダウンロードし、それを使って動作を確認するか、Google Playの内部テスト等を利用します。

# まとめ

Google Play App Signingは、署名が2つに分かれたことで管理がやや面倒になりますが、今年中に対応が必須となりますし、鍵の紛失などに備えることができるため、早めに対応した方が良いかと思います。