【Flutter】Android Studioで便利にSigned APKをリリースビルド

# はじめに
Flutterアプリの制作は二度目ですが、前回の経験をまるごと忘れてしまったので、記事として残しておきます。よければLGTMお願いします。

#Android Studio 起動！
**Android Studio**を起動して、アプリのディレクトリを開きましょう。
話はそこからです。

#Android moduleを開く
アプリのプロジェクトからでは、`Build -> Generate Signed Bundle / APK ...`というアクションを行えないため、Android moduleを開く必要があります。
![スクリーンショット 2020-09-13 160239.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539025/9e9af31d-4113-5a30-2f19-cd46cd71648b.png)
上のように`Tools`メニューをたどって、`Open Android module in Android Studio`を押してください。

#Signed APKを作成する
![スクリーンショット 2020-09-13 160326.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539025/002c3e3d-ebd2-72e5-0f2c-cb89d671f47e.png)
`Build -> Generate Signed Bundle / APK...`を押してください。

![スクリーンショット 2020-09-13 160404.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539025/af4ef7b2-b155-06a2-9403-3a74b94b91e2.png)
上のような画面が出てきます。
これは作成するのが`App Bundle`か`APK`のどちらかを選ぶ画面です。
今回は`APK`の方で作成するので、そちらを選択して`Next`を押します。

![スクリーンショット 2020-09-13 160804.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539025/5d616c95-ca3e-7b06-cb27-476a938b43dd.png)
`Next`で先に進むと、上のような画面になります。
（この画像では全ての欄が埋まっていますが、本来はどの欄も埋まっていません。）
赤枠で囲ってある`Create new...`を押してください。

![スクリーンショット 2020-09-13 160722.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539025/d5288276-0d57-7f1c-95a6-b592172dce8b.png)

すると、上のような画面になります。
ここでkeyStore, keyの設定をします。
一番上の`Key store path`には`APP_NAME/android/app`を選んでおきます。
ファイルの名前は`release.jks`としておきましょう。
（後でこの名前を使います。違う名前の場合は置き換えて考えてください。）
あとはPasswordを決めると、`KeyStore`の設定は終わりです。

`Key`の設定では、まず`Key`の名前を決めます。
（なんでもいいので`key0`とかでいいと思います。）
次に`Key`のパスワードを決めますが、特別な事情がない場合は`KeyStore`と同じパスワードでいいでしょう。

`Validity`は`Key`の有効期間です。デフォルトでは25年になっています。
変更したければ変更しましょう。自分はそのままにしています。

次に開発者情報を入力します。
指定通りに入力を進めていきますが

- First and Last Name
- State or Province
- Country Code(XX)

の三つがあれば十分かなと**自分は**思っています。

**`KeyStore`と`key`の項目は、あとで必要になるので全てメモしておきましょう**

入力を終えたら、`OK`を押します。

![スクリーンショット 2020-09-13 160804.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539025/5d616c95-ca3e-7b06-cb27-476a938b43dd.png)

`OK`で先ほどのページに戻ってきます。
戻ってきたときには、すべての欄が埋まっているはずです。
`Key password`の`Remember passwords`は自由にしてください。

欄が埋まっていることを確認したら、`Next`を押します。

![スクリーンショット 2020-09-13 160903.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539025/19777d3e-a082-a42f-b366-ce95b281a61b.png)

上のような画面に移動します。
`Build Variants`を`release`に設定します。
また`Sigrature Versions`も`V1`,`V2`の両方を選択するのが安牌でしょう。

以上を確認したら`Finish`を押します。

すると**どこか**に`Signed APK`が生成開始されるので待ちましょう。
（私は今回これを使わず、`flutter build`コマンドから`build`できるようにしているので先に進みます。）

# キーストアを参照する
これからアプリから作成したキーストアを参照します。
![スクリーンショット 2020-09-13 163508.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539025/09789482-7e0b-d9e8-f1bc-f2f1c4884927.png)
`android`ディレクトリに`keystore.properties`というファイルを作ります。
ここに
- KeyStoreのパスワード(`storePassword`)
- keyのパスワード(`keyPassword`)
- keyの名前(`keyAlias`)
- jksファイルの場所(`storeFile`)
をそれぞれ入力していきます。

（`storeFile`の箇所は、`release.jks`ファイルを`android/app`ディレクトリに作ったと思うので、release.jksと書いてください。）

この`keystore.properties`には重要な情報が載っているため、GitHub等でだれもが見れる状態にしておいてはいけません。
![スクリーンショット 2020-09-13 164922.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539025/9ef8c58a-8d5e-caa1-b568-0e9cc28ae2cf.png)
そこで`android/.gitignore`に

```
*.jks
keystore.properties
```
と書くことでそれを防止することができます。

#Gradleファイルでの署名設定
`android/app/build.gradle`を開いてください。

そのとき、上のメニューバーに`Open for Editing in Android Studio`というボタンがあると思うのでそれを押しましょう。
![スクリーンショット 2020-09-13 164312.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539025/49f5219d-a949-129c-4c3d-290757723fa1.png)
上の画像のように`android {...`の上に黄色枠で囲った部分を追記してください。

```gradle
def keystoreProperties = new Properties()
def keystorePropertiesFile = rootProject.file('keystore.properties')
if (keystorePropertiesFile.exists()) {
    keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
}
```
![スクリーンショット 2020-09-13 164456.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539025/0447b6a2-43e4-281c-327d-6d11f8c52dc7.png)
その後、50行目あたりにある`buildTypes`を消去して、
![スクリーンショット 2020-09-13 164556.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539025/85f73631-f20e-2764-757f-05eb9f3e7f18.png)
上の赤枠のように書き換えます。

```gradle

signingConfigs {
        release {
            keyAlias keystoreProperties['keyAlias']
            keyPassword keystoreProperties['keyPassword']
            storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null
            storePassword keystoreProperties['storePassword']
        }
    }
    buildTypes {
        release {
            signingConfig signingConfigs.release
        }
    }
```

`android/app/build.gradle`で変更できることに以下があります。

- Androidの対応OS(下の画像の赤丸)
- アプリのパッケージ名(`firebase`を利用する際に必要)

gradleファイルを編集した際は、`Sync Now`で同期しておくのが良いでしょう。
![スクリーンショット 2020-09-13 165832.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539025/b9a2b95f-2cb6-59e7-3ecf-d8b6199df894.png)
これでgradleファイルでの署名設定は終了です。

#APKファイルの生成
ここまでくれば、あとはコマンドを打ち込むだけです。

```
flutter build apk
```
というコマンドでapkファイルが生成されます。

**注意**
apkを分割して`build`した方がいいです。（アプリサイズが小さくなります。）
目的に合ったオプションをapkの後ろに付けてコマンドを叩きましょう。
ちなみに上のコマンドを叩くと、コマンドラインさんにも同じことを言われます。
![スクリーンショット 2020-09-13 165300.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539025/b4f38a1d-081a-c93f-a72a-752159ba9482.png)
コマンドを叩くと、上のように`build\app\autputs\flutter-apk`ディレクトリにapkファイルが生成されます。

このapkファイルをgoogle playにアップロードすることでアプリを世界にリリースできます！

お疲れさまでした！

#おまけ：アプリのバージョンアップ
アプリのバージョンを管理するのは`pubspec.yaml`です。
![スクリーンショット 2020-09-13 165436.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539025/77264a25-15da-f9ae-7671-56fdfc82fc99.png)

`version`に指定する数字は二つに分かれており、画像の例では

- 1.0.0 = VersionCode
- (+)1  = VersionNumber

となります。

アプリのバージョンアップに大事なのは`VersionNumber`の方です。
たとえ`VersionCode`を変更しても、`VersionNumber`がそのままだとアップデート用のapkファイルはアップロードできません。
逆に`VersionNumber`が違えば、`VersionCode`が同じでもアップロードができます。

`version`を正しく変更してapkファイルを作り、アプリのアップデートを行いましょう。

#おわり
読んでいただいてありがとうございました！
この記事でリリーズビルドした方はLGTMをお忘れなく（笑）
twitterは[こちら](https://twitter.com/thoth000)から

**参考記事**

- [(公式)Build and release an Android app](https://flutter.dev/docs/deployment/android)
- [(Qiita)FlutterでAndroidのリリース用APKをビルドする前の準備いろいろ](https://qiita.com/kasa_le/items/d23075d817f42e869778)
- [(stack overflow) How to build signed apk from Android Studio for Flutter
](https://stackoverflow.com/questions/55536637/how-to-build-signed-apk-from-android-studio-for-flutter)