[Android]apkへの署名周りまとめ

## 1. キーワード

キーワード|説明
---|---
アプリ署名鍵|apkファイルを端末にインストールする際にはapkが署名済みでなければならない。
アップロード鍵|GooglePlayストアにアプリを公開する際に必要になる署名をするための鍵。<br>生成には署名情報(氏名/会社・部署/国・都道府県・市区町村)と、キーエイリアス、キーパスワードを設定する必要あり。
キーストア|アプリ署名鍵　または アップロード鍵を保管しているファイル(.jks or .keystore)。<br>何らかの鍵を内蔵したキーストアを生成する際にはストアパスワードが必要。

## 2. アプリの公開について
- キーストアはAndroid Studioを使ってローカルで生成できる(以降ローカルで生成したキーストアを★と扱う)
- Playストアへのアプリの登録方法は以下の2種類ある。
    - A. [ローカルでaｐkを生成、★でapkに署名し、署名済みapkをアップロード](https://developer.android.com/studio/images/publish/appsigning_selfmanagediagram_2x.png?hl=ja)
    - B. [ローカルでAndroid App Bundleを生成、★でBundleに署名し、署名済みBundleをアップロード](https://developer.android.com/studio/images/publish/appsigning_googleplayappsigningdiagram_2x.png?hl=ja)

- A. の場合は、★はアップロード鍵および、アプリ署名鍵として扱われる。開発者はそれぞれの端末向けに複数のapkを生成して署名し、アップロードしなければならない。
- B. の場合は、★はアップロード鍵として扱われる。ユーザーがPlayストアからアプリをDLする際に、Playストア側がDL要求のあった端末に最適化されたapkを生成し、★とは異なるPlayストア側で独自生成したキーストアをアプリ署名鍵としてaｐｋに署名する。

Playストアへの署名済みアプリのアップロード形式|ローカルで生成したキーストア(内の鍵)の扱い|Playストアで生成されたキーストアの扱い
---|---|---
apk|アップロード鍵、アプリ署名鍵|生成しない
Android App Bundle|アップロード鍵|アプリ署名鍵


## 3. debugビルドする場合の署名
端末をつないでAndrodid Studioでdebugビルドを実行すると、端末にアプリがインストールされる。
「アプリ署名鍵とか作った覚えないのに・・・」と思うが、それはAndroid SDK ツールで生成された**デバッグ証明書で自動的にデジタル署名してくれる**

## 4. releaseビルドする場合の署名
前述のA. or B.で署名したapk or Bundleを作る手順は以下

### 4.1. Bundle か APKかの選択
- AndroidStudioのメニューのBuild > Generate Signed Bundle or APK を選択。
- 署名済みBundleを生成したい場合はAndroid App Bundleにチェック、署名済みapkを生成したい場合はAPKにチェックしてNextを押下

### 4.2. キーストアの生成
※すでに生成したものを使うならこの工程は不要

- Create new... を押下し、以下の情報を入力してOKを押下
    - キーストアの出力先
    - キーストアのパスワード
    - 鍵のエイリアス
    - 鍵のパスワード
    - 署名情報(氏名、国、組織名... etc.最低1つ入力)

### 4.3 ビルド&署名

- 以下を設定してNextを押下
    - 署名に使うキーストアのファイルパス
    - キーストアのパスワード
    - 鍵のエイリアス
    - 鍵のパスワード

- Build Variantsでビルドの仕向けを選択してFinish
→ビルドされる。保存先はAndroid StudioのEvent Logに出てくるlocateリンクを押せばわかる。

## 5. 署名済みapｋが作成されるまでの流れ

証明書やら署名やらよくわからん言葉が出てくるので色々調べたところ、
androidではどうやらこんな感じっぽい。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59542/688a1ed8-2ccd-42df-526f-6050a197988c.jpeg", width=500>

androidにおける署名とは、「apk自体を対象として生成したハッシュ値をキーストアの秘密鍵で暗号化したもの」 を指すらしい。
また、**「証明書で署名」** とかいうワードをググってるとたまに見かけて、
ハァ？わけわかんねぇな・・・と思っていたのだが、
どうやらこれは **公開鍵証明書の秘密鍵で署名** という意味らしい。
・・・いやいや、 **「証明書で署名」だと、公開鍵使ってるみたいじゃん！全然ちげぇじゃねぇか！**

で、「署名済みapk」には「apk本体」「署名」「公開鍵証明書」が含まれるみたい。



## 参考
https://developer.android.com/studio/publish/app-signing?hl=ja#sign_release
https://source.android.google.cn/security/apksigning?hl=ja
https://docsplayer.net/105771978-Agenda-android-%E3%82%A2%E3%83%97%E3%83%AA%E3%81%B8%E3%81%AE%E3%82%B3%E3%83%BC%E3%83%89%E7%BD%B2%E5%90%8D%E3%81%AE%E4%BB%95%E7%B5%84%E3%81%BF-android-%E3%82%A2%E3%83%97%E3%83%AA%E3%81%B8%E3%81%AE%E3%82%B3%E3%83%BC%E3%83%89%E7%BD%B2%E5%90%8D%E4%BB%98%E4%B8%8E%E3%81%AE%E7%8F%BE%E7%8A%B6-%E5%BC%B1%E3%81%84%E7%BD%B2%E5%90%8D%E3%81%8C%E6%96%BD%E3%81%95%E3%82%8C%E3%82%8B%E5%8E%9F%E5%9B%A0%E8%AA%BF%E6%9F%BB-%E3%81%82%E3%82%8B%E3%81%B9%E3%81%8D%E5%A7%BF%E3%81%AE%E8%80%83%E5%AF%9F-1.html
https://tech.pjin.jp/blog/2015/10/06/android%E3%82%A2%E3%83%97%E3%83%AA%E5%85%AC%E9%96%8B%E6%96%B9%E6%B3%95%E3%81%BE%E3%81%A8%E3%82%81%E3%80%80%E3%80%90%E7%AC%AC%E5%9B%9B%E5%9B%9E%E3%80%91%E3%82%A2%E3%83%97%E3%83%AA%E5%85%AC%E9%96%8B/