【Flutter】【Android】Add-to-app実行時のdart-defines/エントリーファイル指定の方法
3行まとめ
- AndroidプロジェクトにFlutter Moduleを埋め込む時のdart-defineとエントリーファイルの指定方法を調べた。
- AAR作成時は dart-defineのパラメータをコマンドラインから渡せる。
- それ以外は .android/Flutter/build.gradle を修正すればできる。
はじめに
Flutterでアプリ開発をすると、開発環境を切り替えるために flavorとエントリーファイルを使ったり、最近だとdart-definesを使ったりすると思います。Flutter単体で開発をしている場合、これらの環境変数やエントリーファイルの指定は難しいことでは無いです。しかし、Flutterで開発しているアプリを 既存のAndroidプロジェクトにFlutter Module として組み込む場合、開発しているFlutter アプリに dart-define やエントリーファイルってどうやって渡せばいいんだ?となりました(自分が今までiOS開発メインだったのもありますが)。そこで、今回は下記の表の???の部分を 調べて、まとめてみました。
Androidプロジェクトへの組み込み方 | エントリーファイル指定方法 | dart-define利用方法 |
---|---|---|
AAR経由 | ① ??? | ② ??? |
ソースから | ④ ??? | ③ ??? |
Flutter Module を AAR化してビルドする場合
① flutter build aar 時に エントリーファイルを指定する方法
flutter build aar コマンドには、flutter build apk や ios と異なりエントリーファイルを指定する -t オプションが無いです。なので、直接 Androidのproject ファイルを修正する必要がありました。 flutter pub get 実行後に作成される、.adnroid/Flutter/build.gradle (.androidなので注意)の以下を修正することで、エントリーファイルの指定ができます。なお、デフォルト値で lib/main.dart を見に行くようになっているので(参考 flutter.gradle 644-636 )、エントリーファイルを複数用意していない場合は特に設定する必要ないです。
flutter {
source '../..'
target 'lib/main.dart' // 追加
}
② flutter build aar 時に dart-defineで環境変数を設定する方法
flutter build aar 実行時は、コマンドライン引数に渡すことで環境変数の設定ができます。
$ flutter build aar --dart-define=env=hoge
Flutter Module を ソースからビルドする場合
③ ソースからビルドする時に dart-defineで環境変数を設定する方法
flutter build aar コマンドを使う場合は、AAR作成時に dart-define をオプションとして渡すことができました。しかし、ソースからビルドする場合は、 ~.dartのビルドは、.android/Flutter/build.gradle の中で行われます。よって、.android/Flutter/build.gradle を修正する必要があります。
個人的にソースからビルドする時にdart-defineで環境変数を指定するオススメの方法は、android/Flutter/build.gradle と同じ階層に gradle.properties を作成し、以下の定義を追加することです。
// android/Flutter/gradle.properties
--dart-defines=env=dev
これにより、サブプロジェクトとして登録されている .android/Flutter/build.gradle の flutter project インスタンスに、dart-defines プロパティとその値が追加されます。
gradle.properties は Home ディレクトリ → プロジェクトのルートディレクトリ→ サブプロジェクトのディレクトリの順番で見ていくので(参考:Configuring the Build Environment
)、Host側のAndroidプロジェクトの gradle.propertiesに追加してもよいです。
④ ソースからビルドする時にエントリーファイルを指定する方法
こちらはAARの場合と同様に、.adnroid/Flutter/build.gradle (.androidなので注意)のflutter クロージャには target プロパティがあり、エントリーファイルの指定ができます。
flutter {
source '../..'
target 'lib/main.dart' // 追加
}
他の方法だと、gradle.properties に設定することも可能です。なお、flutter クロージャと、gradle.properties の両方に設定した場合は、gradle.propetiesのほうが優先されます(参考 flutter.gradle 644-636 )。
// android/Flutter/gradle.properties
target=lib/main.dart
余談:ソースからビルドする場合は、Host側のBuildVariantに応じてFlutter ModuleのBuild Mode(debug/release/profile) が変わる
調べてたところ、Host側のプロジェクトのBuild Variantに応じて、サブプロジェクトのFlutter Module のBuild Modeは自動で切り替わるようです。
Flutter ModuleをAAR化する場合は、Host側のAndroidプロジェクトのapp/build.gradle に Build Variantに応じて読み込む AARを指定すれば良いので特にHost側のBuild ModeとFlutter ModuleのBuild Modeを意識する必要はありませんでした。
一方で、Flutter Moduleをソースからビルドする場合は、Host側のAndroidプロジェクトの サブプロジェクトとして Flutter Moduleが扱われるため、Host側のBuild Variantに応じて Flutter Module側のBuild Modeも変わります。調べたところ以下のルールでFlutterのBuild Modeが変わります。
- Host側のBuild Variantの名前がprofileのとき、Flutter Module のBuild Modeがprofileになる
- Host側のBuild Variantが debuggable = true のとき、Flutter Module のBuild Mode は debugになる
- それ以外は Flutter のBuild Mode は release になる
例
Host側のBuild Variant | Flutter のBuild Mode |
---|---|
freeRlease | release |
freeDebug | debug |
freeDebug | debug |
profile | profile |
参考元:flutter.gradle
感想
- Flutter単体で開発するときの情報は多いものの、Moduleとして組み込む場合の情報はFlutter本体のコード読んだり、issueを見にいく必要があったので、まだまだ情報が少ないのかな?と感じました。
Discussion