【Flutter】Androidアプリリリース手順（ビルド方法）

# はじめに
この記事ではFlutterで作成したアプリをGoogle Play Storeに公開するため、AABファイルの作成方法をまとめました。
GoogleはGoogle play Storeにアプリを提出する際にAAB(Android App Bundle)形式を推奨しているため、今回はAABファイルを作成しています。
多くの記事では、AndroidStudioのメニューバーのBuild > Generate Signed BundleからAABファイルを作成していましたが、バージョンの関係かAndroid Studio Koala 2024.1.1 Patch 1 ではGenerate Signed Bundleという項目がなかったため、コマンドを入力して作成しました。

# keystoreファイル（証明書）を作成する
下記のコマンドの{}のところを編集してプロジェクトのディレクトリで実行してください。
アプリの署名に使う証明書を作成します。
指定した出力先パスにkeystoreファイルが作成されます。
```書き方.
keytool -genkey -v -keystore {}\my_release_key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias {Alias名}
```
```例.
keytool -genkey -v -keystore C:Users\your_username\development\my_release_key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias key
```
説明
***・keytool***：証明書を作成する。
***・-genkey***：キーとペアを生成する
***・-v***：詳細を出力する
***・-keyalg RSA***：キーをRSA方式で暗号化する
***・-keysize 2048***：キーを2048ビットのファイルサイズで生成する
***・validity 10000***：証明書の有効日数を10000日にする
***・-alias***：証明書のエイリアスを任意の名前にする
```出力結果.
キーストアのパスワードを入力してください:｛パスワードを入力｝
新規パスワードを再入力してください:｛パスワードを入力｝
姓名は何ですか。
  [Unknown]:  ｛姓名を入力｝
組織単位名は何ですか。
  [Unknown]:  ｛組織単位を入力｝
組織名は何ですか。
  [Unknown]:  ｛組織名を入力｝
都市名または地域名は何ですか。
  [Unknown]:  ｛都市名または地域名を入力｝
都道府県名または州名は何ですか。
  [Unknown]:  ｛都道府県名を入力｝
この単位に該当する2文字の国コードは何ですか。
  [Unknown]:  JP
CN=xxx, OU=xxx, O=xxx, L=xxx, ST=xxx, C=JPでよろしいですか。
  [いいえ]:  y

10,000日間有効な2,048ビットのRSAのキー・ペアと自己署名型証明書(SHA256withRSA)を生成しています
        ディレクトリ名: CN=xxx, OU=xxx, O=xxx, L=xxx, ST=xxx, C=JP
[C:Users\your_username\development\my_release_key.jksを格納中]
```
# key.properties ファイルを作成する
下記のプロパティファイルを作成し、androidフォルダの直下に配置します。
```android\key.properties
storePassword={パスワード}
keyPassword={パスワード}
keyAlias=key
storeFile={key.jksの絶対パス}
```
:::note warn
注意
key.jksの絶対パスはWindowsの場合、\ を2つ書く必要があります。
:::

# app/build.gradle に署名設定を追加する
key.jksとプロパティファイルがビルド時に組み込まれるようにします。
android/app/build.gradleに情報を追記します。
```diff_gradle
//keystoreProperties をロードする
+def keystoreProperties = new Properties()
+def keystorePropertiesFile = rootProject.file('key.properties')
+if (keystorePropertiesFile.exists()) {
+    keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
+}

/* 中略 */

android {
    /* 中略 */
+   signingConfigs {
+       release {
+           keyAlias keystoreProperties['keyAlias']
+           keyPassword keystoreProperties['keyPassword']
+           storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null
+           storePassword keystoreProperties['storePassword']
+       }
+   }
   buildTypes {
       release {
-          signingConfig signingConfigs.debug
+          signingConfig signingConfigs.release    
       }
   }
/* 中略 */
}
```

# AndroidManifest.xmlファイルを編集する
android/app/src/main/AndroidManifest.xmlの{]を修正し、アプリ名を設定します。
```diff_xml
    <application
-        android:label="｛デフォルトのプロジェクト名｝"
+        android:label="｛アプリ名｝"
```

# ドメインを変更する
下記の関連する箇所の初期設定されているexampleドメインを独自パッケージ名やフォルダ構成に修正します。
例）com.example.アプリ名　→　com.{自分のドメイン}.アプリ名

***・android/app/src/main/AndroidManifest.xml : package***
```diff_xml
-<manifest xmlns:android="http://schemas.android.com/apk/res/android">
+<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.{自分のドメイン}.アプリ名">
```

***・android/app/src/debug/AndroidManifest.xml : package***
```diff_xml
-<manifest xmlns:android="http://schemas.android.com/apk/res/android">
+<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.{自分のドメイン}.アプリ名">
```

***・android/app/src/profile/AndroidManifest.xml : package***
```diff_xml
-<manifest xmlns:android="http://schemas.android.com/apk/res/android">
+<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.{自分のドメイン}.アプリ名">
```

***・android/app/build.gradle : defaultConfig の applicationId***
```diff_gradle
-applicationId = "com.example.アプリ名"
+applicationId = "com.{自分のドメイン}.アプリ名"
```

***・android/app/google-services.json : package_name***
```diff_json
-"package_name": "com.example.アプリ名"
+"package_name": "com.{自分のドメイン}.アプリ名"
```

# ビルドする
作ったアプリをリリース用にビルドをします。
下記のコマンドをプロジェクトのディレクトリで実行してください。
```
flutter build appbundle --release
```
出力先は`build/app/outputs/bundle/release/app-release.aab`となります。