flutter run --debug(release) と app/build.gralde
まえがき
Flutterアプリを開発していて、多用するflutter run
コマンドのオプションに --debug
と--release
というビルドタイプがある。
それぞれを指定したときにandroid/app/build.gradle
のbuildTypes
やsigningConfig
(リリース作業の時にkeystoreのプロパティなどを設定するときに編集するところ)の関係がこんがらがったので整理してみた
--debug と --release 違い
まず、flutter run --debug
。
--debug
オプションはデフォルトオプションでもあるので、flutter run
としただけでも--debug
として実行したことになる。
--debug
では、名前の通りデバッグビルドを行ってアプリをデバッグモードで実行するオプションである。
このモードでは、Flutterで有名なホットリロードやホットリスタートなどの開発用の機能が利用可能になり、
要は、デバッグがしやすいアプリの実行を提供してくれる。
--release
では、リリースビルドを行って最適化されたコードと最小限のデバッグ情報のみを含めるため、実際に製品版としてリリースするアプリのパフォーマンスに近い形で動作する。
主な違いまとめ
特徴 | デバッグビルド | リリースビルド |
---|---|---|
目的 | デバッグやテスト | 配布 |
コンパイル方法 | JITコンパイル | AOTコンパイル |
デバッグ機能 | ホットリロード、ホットリスタート、ステップ実行 etc. | 無効 |
署名 | デフォルトのデバッグキーで署名 | カスタムのリリースキーで署名 |
アプリサイズ | 大きい | 小さい |
flutter run --debug(release) と app/build.gradle
Flutterプロジェクトを作成した直後の android/app/build.gralde
のbuildTypes
は以下のようになっている。
...
buildTypes {
release {
// TODO: Add your own signing config for the release build.
// Signing with the debug keys for now, so `flutter run --release` works.
signingConfig signingConfigs.debug
}
}
...
flutter run --debug
と build.gradle
flutter run --debug
を実行すると、Flutterは内部でGradleを使用してデバッグビルドを行います。このとき、buildTypes.debug
に定義された設定が適用される。
なので、buildTypes.debug
を読み込みたいですが、Flutterプロジェクト作成直後のこのbuild.gradle
ファイルにはbuildTypes.release
のみでbuildTypes.debug
は定義がない。
これはデバッグビルドでは署名設定は通常必要ではなく、Gradleビルドシステムは、特に設定がない場合はデフォルトのデバッグビルド設定を提供してくれるので、それを適用するという意味で定義がなく、このままで良い。
flutter run --release
と build.gradle
flutter run --release
を実行すると、Flutterは内部でGradleを使用してリリースビルドを行うと同時に、app/build.gradle
の buildTypes.release
に定義を適用する。
また、signingConfig signingConfigs.debug
は、アプリに対する署名モードを指定している。
上記のgradleファイルの場合は、buildTypes.release
がsigningConfig signingConfigs.debug
となっているので、この定義を適用する。
ただし、Flutterプロジェクト作成直後のこのbuild.gradle
ファイルにはsigningConfigs
の定義はないが、ここもGradleビルドシステムのデフォルト設定を提供してくれるので、それを適用するという意味で定義がなく、このままで良い。
一方で、配布用のリリースビルドを作成するときはFlutterのドキュメントにもあるとおり、以下のようにapp/build.gralde
にsigningConfigs
を追加で定義し、signingConfigs.debug
をsigningConfigs.release
に変えるとある。
...
signingConfigs {
release {
keyAlias keystoreProperties['keyAlias']
keyPassword keystoreProperties['keyPassword']
storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null
storePassword keystoreProperties['storePassword']
}
}
buildTypes {
release {
signingConfig signingConfigs.release
}
}
...
上記の場合、flutter run --release
コマンドが実行されると、app/build.gradle
のbuildTypes.release
の定義を見ていき、その中で signingConfig が signingConfigs.release
となっているので、その定義を見にいく。
signingConfigs.release
には、署名のためのキーストアの情報が定義されているので、これらを適用してビルドファイルに対して署名を行うという流れになる。
なので、flutter run --release
を実行する場合は、上記の定義が正しく設定されていないとビルドに失敗します。
あとがき
今回の内容を整理したきっかけは、 GitHub Actions でFlutterアプリのAndroidビルド(.aabファイル)を Play Console のテストトラックにアップロードするという設定を行う過程で、android/app/build.gradle
のbuildTypes
のsigningConfigs.debug
の部分をシェルスクリプトでsigningConfigs.release
に書き換えるというワークフローのジョブステップを定義したことであり、
わざわざこれを書き換えるシェルスクリプトを用意するくらいなら、初めからここの定義はsigningConfigs.release
でいいのでは? という発想からである。
結論としては、シェルスクリプトを残すことにした。
理由は、この記事の内容の通りflutter run --release
はbuildTypes.release
の定義を参照するので、ローカルでリリースビルドを確認したい時に署名情報が必要になり、このローカル手配を手間でありローカルに署名情報を置きたいくないという意図があるからでした。
Discussion