Flutter アプリのリリース手順（Google Play ストア編）

## はじめに
Flutterでのアプリ開発が一区切りしたので、GooglePlayストアとAppleStoreの両方にリリースしたのだが、その際にいつもの様に色々と手こずったので、誰かの参考になればと思い（自分のためにも）メモを残す。

## 環境
【PC】
　　MacBook Air (M1, 2020)

【各SWバージョン】
　・macOS Big Sur 11.6.1
　・Flutter 2.5.3　（dart 2.14.4）
　・Xcode 13.1
　・Cocoapods 1.11.2
　・VScode(AplleSilicon) 1.62.2

## メモ内容

① GooglePlayストアへのリリースまでの準備
② GooglePlayストアへのリリースおよびテスト
 
 
## ① GooglePlayストアへのリリースまでの準備
以下の手順でリリースします！
　※前提としてGoogle Playへのアカウント登録が完了していること。

・アップロード用の署名鍵の生成
・アプリ名の変更
・ビルド前の設定追記
・Flutterアプリのビルド
・Google Playにアプリ登録

### アップロード用の署名鍵の生成

以下のコマンドより署名鍵を生成する必要がある。

```terminal
keytool -genkey -v -keystore key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias key
```

早速以下の様なエラーが出た。

```terminal:
The operation couldn’t be completed. Unable to locate a Java Runtime.
Please visit http://www.java.com for information on installing Java.
```

Javaが入っていなかったので、こちらのサイトよりOpenJDKをインストール。

https://www.azul.com/downloads/?version=java-17-lts&os=macos&architecture=arm-64-bit&package=jdk#download-openjdk


```terminal:インストールしたJavaバージョンを確認
% java -version
openjdk version "17.0.2" 2022-01-18 LTS
OpenJDK Runtime Environment Zulu17.32+13-CA (build 17.0.2+8-LTS)
OpenJDK 64-Bit Server VM Zulu17.32+13-CA (build 17.0.2+8-LTS, mixed mode, sharing)
```

再度、以下のコマンドより署名鍵を生成する。

```terminal
keytool -genkey -v -keystore key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias key
```

都道府県や国コードなど聞かれるため、それらを入力して鍵の生成ができれば完了！
（terminalでコマンド実行した際のカレントディレクトリに`key.jks`ファイルができる）


### アプリ名の変更

`android/app/src/main/AndroidManifest.xml`を以下の部分を書き換える。

```xml:android/app/src/main/AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="******************************************:">
   <application
        android:label="[ここに表示したいアプリ名を入れる]"
```

### ビルド前の設定追記

**先程作成した鍵を使ってアプリをビルドするために、`key.jks`ファイルをFlutterプロジェクト内の`android/app/`に配置。**
　※本番環境のビルド前の状態をgitなどにアップロードしている場合、この鍵ファイルまでアップロードしてしまわない様に気を付ける。

**以下のファイル`key.properties`を作成して、Flutterプロジェクトの`android`フォルダ直下に設置する。**

```:android/key.properties
storePassword=[署名鍵の生成に設定したパスワード]
keyPassword=[署名鍵の生成に設定したパスワード]
keyAlisas=key
storeFile=key.jks
```

**`android/app/build.gradle`の設定追記（１箇所目）**　※30行目あたり

```gradle:android/app/build.gradle
android {
    // 〜〜省略〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜 
    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`の設定追記（２箇所目）**　※任意の箇所でOK

```gradle:android/app/build.gradle
def keystoreProperties = new Properties()
def keystorePropertiesFile = rootProject.file('key.properties')
if (keystorePropertiesFile.exists()) {
    keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
}
```

### Flutterアプリのビルド

以下のコマンドよりAndroidアプリをビルド。

```terminal:
flutter build appbundle --release

💪 Building with sound null safety 💪

Removed unused resources: Binary resource data reduced from 165KB to 165KB: Removed 0%
Running Gradle task 'bundleRelease'...                             48.2s
✓ Built build/app/outputs/bundle/release/app-release.aab (21.0MB).
```

**一応ビルドは上手くいった！**

※ 2021年8月からは、Google Play上の新規アプリを公開するにはAPKでなく「Android App Bundle」を使う必要があるとのこと。

### Google Play Consoleにアプリを登録

https://play.google.com/console/u/0/developers

**以下の内容は日々アップデートされる可能性があるため参考程度に！**

**まずは、全てのアプリより『アプリ作成』をする。**
アプリ名、デフォルトの言語、アプリ/ゲーム、無料/有料　など必要な入力・選択をする。
　※無料/有料の設定について、アプリそのもののダウンロードが有料化無料かの指定。ダウンロード自体は無料で、アプリ内での追加コンテンツなどの購入が有料の場合でも、「無料」を選択する。

**次に下図に書かれていることを順々に設定していく。**
![Qiita-no065_img01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654767/cbfe986e-d1e1-9292-90e2-b52b7241b093.png)

**■アプリのアクセス権**
自分のアプリにログイン機能があったため、アプリ機能を使うためのログイン認証の手順を作成。

**■広告**
広告の有無を選択するだけ。

**■コンテンツのレーティング**
コンテンツの評価をしてもらうため、色々な質問に回答する。

**■ターゲットユーザー**
13未満をターゲットにする場合は、プライバシーポリシーへの追加が必要らしい。
また、子供向けアプリの場合ファミリー向けプログラムに参加する。

**■ニュースアプリ**
ニュースアプリかどうかの回答をするだけ。

**■データセーフティ**
ここが結構時間のかかるところ。
自分はFirebaseを利用していたので、以下のサイトを確認しながら色々と回答した。
アプリ内でAdmobを使っていたりすると、少し入力項目が増える。

https://firebase.google.com/support/privacy?hl=ja

設定の最後にプライバシポリシーへのURLを登録する必要があるので、無料のブログサイトなどで作っておく。

**■アプリカテゴリの選択・連絡先情報の登録**
アプリカテゴリーやタグは少し悩むかもしれないが、基本的には必須項目を埋めるだけでよい。

**■ストアの掲載情報を設定する**
アプリ名、アプリの簡易な説明、アプリの詳細説明、アイコンやその他画像アップロードが必要。
　※アイコン画像について、Google Playの方では 512×512 の解像度だが、Appleストアの方は確か 1024×1024 なのでこちらに合わせて画像ファイルは作っておいた方が良いかも。


**ここまで終われば後はリリースするだけ！**

## ② GooglePlayストアへのリリースおよびテスト
審査さえ通れば、もちろんいきなりリリースすることも可能だが、リリースしたアプリを一般公開する前にテストすることも可能。

#### クローズドテストをするため、以下に提示される項目を入れていき、テスターを登録すればOK！

![Qiita-no065_img02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654767/d268de45-9bc2-e843-e0f9-d968959df653.png)


※リリース時にアップロードするファイルは、`flutter build appbundle --release`の実行結果にも出力される様に`/build/app/outputs/bundle/release/app-release.aab`となる。

審査が通ると、テストアプリをダウンロードするためのリンクをコピーできる様になり、テスターユーザーからそのリンクにアクセスするとアプリがダウンロードできる。


#### 製品版をリリースして、審査が通れば対象の国内でアプリが公開される！