🌲

【Flutter】【Android】Add-to-app実行時のdart-defines/エントリーファイル指定の方法

2021/05/24に公開

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が変わります。

  1. Host側のBuild Variantの名前がprofileのとき、Flutter Module のBuild Modeがprofileになる
  2. Host側のBuild Variantが debuggable = true のとき、Flutter Module のBuild Mode は debugになる
  3. それ以外は 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