こんにちは。趣味グラマのNobu(@nm_aru)です。
2個目のFlutterアプリ開発にようやく着手し始めました。
しかし、前回初めてのFlutterアプリをリリースをしてから早5ヶ月。すっかり作り方を忘れてたりします…。
特に初期設定や環境設定周りは、調査をしてその場で対応して終わりという事が多く、後になって振り返ろうにも何も記録が残っていないという事が多々ありました(あります)。
そこで、今回は将来の自分のため、そして誰かのために、少しずつでも記録を残しながら開発していこうと思います。
そもそもFlavorとは?
Flavorは、アプリで使用する環境を切り替えるために使用します。
アプリで使用する環境とは?って感じですが、例えばサーバ側のAPIが開発用と本番用それぞれが用意されている時に、開発用のFlavorを指定した時は開発用APIに、本番用のFlavorを指定した時は本番用APIに繋ぐといった事が考えられます。
また、開発用と本番用のアプリを両方とも一つの端末にインストールする場合、iOSならbundle identifierを、Androidならpackage nameを変更する必要がありますが、これもFlavorを使えば簡単に実現できます。
Flavorはビルドモードと組み合わせて使う
ビルドモードって何?って感じですが、Flutterのドキュメントにしっかり書かれています。
Flutterには3つのビルドモードがあり、それぞれ目的が決まっています。
ビルドモード | 目的(スマホアプリの場合) |
---|---|
Debug | シミュレーターや実機等を使って、アプリのデバッグを行う時に使います。 主な特徴は以下の通りです。 ・Assertが使えます ・Service extensions(後述)が使えます ・コンパイルが開発のために最適化されています ・デバッグが使えますし、DevToolsも使えます ・アプリのパフォーマンスは悪いです |
Profile | 実機を使ってアプリのパフォーマンスを分析する時に使います。 ほぼReleaseモードと同じですが、以下の違いがあります。 ・パフォーマンス計測周りに関するいくつかのService extensionsが使えます ・DevToolsが使えます ・シミュレーターやエミュレーターでは実行できません シミュレーターやエミュレーターで実行出来ないのは、実機じゃないと アプリの本当のパフォーマンスが測れないからです。 |
Release | ストアにリリースする時に使うモードです。最大限の最適化が行われます。 主な特徴は以下の通りです。 ・Assert使えません ・デバッグ使えません ・コンパイルが、実行速度の向上やアプリサイズの縮小のために最適化されています ・Service extensionsは使えません ・アプリのパフォーマンスは良いです |
何度も出てきたService extensionsとは、デバッグのために用意されている便利機能の事です。
このビルドモードとFlavorを組み合わせる事で、例えば以下のような事が実現出来ます。
ビルドモード | Flavor | 用途 |
Debug | Development | 開発時に使用。 |
Release | Staging | アプリはリリース用と同じだが、接続先APIをStagingにする事で、例えば 不具合の再現確認など、本番環境に影響を与えず行う事が出来る。 |
Release | Production | リリース用。 |
flutter_flavorizrで手軽にFlavorの設定を行う
Flavorの設定をググると、手動でXcodeやbuild.gradleの設定を行う例が沢山出てきます。
しかし、趣味グラマ的にはもっと楽に簡単にやりたい。そこで探してみると、flutter_flavorizrというパッケージを使えば出来そうだという事が分かったので、早速試してみました。
まずは準備とインストール
flutter_flavorizrを使うには、事前に以下3つのソフトを入れておく必要があります。
これらのソフトは、iOSのプロジェクトを操作するために使用されます。
次にpubspec.yamlのdev_dependenciesにflutter_flavorizrを追記し、インストールを実行します。
dev_dependencies:
flutter_flavorizr: ^2.1.0
flutter pub get
pubspec.yamlにFlavorの設定を記述する
flavorizr:
app:
android:
flavorDimensions: "flavor-type"
ios:
flavors:
development:
app:
name: "Dev App"
android:
applicationId: "tv.mrym.app.hoge-dev"
ios:
bundleId: "tv.mrym.app.hoge-dev"
production:
app:
name: "Prod App"
android:
applicationId: "tv.mrym.app.hoge"
ios:
bundleId: "tv.mrym.app.hoge"
Firebaseを使っている場合は、Flavor毎にFirebaseのプロジェクトを作った上で、以下のようにFirebaseの設定ファイルのパスを指定できます。
flavorizr:
app:
android:
flavorDimensions: "flavor-type"
ios:
flavors:
development:
android:
applicationId: "tv.mrym.app.hoge-dev"
firebase:
config: ".firebase/development/google-services.json"
ios:
bundleId: "tv.mrym.app.hoge-dev"
firebase:
config: ".firebase/development/GoogleService-Info.plist"
〜省略〜
Flavorの設定をプロジェクトに反映する
pubspec.yamlの記述が終わったら、以下のコマンドを実行してFlavorをプロジェクトに反映します。
flutter pub run flutter_flavorizr
実行が終わるとlib配下にFlavorに対応したmain-<Flavor>.dartが作成されます。
また、flutter_flavorizrはmain-<Flavor>.dart作成以外にも色々な処理を実行しており、デフォルトでは以下の処理が実行されます。
assets:download
assets:extract
android:androidManifest
android:buildGradle
android:dummyAssets
flutter:flavors
flutter:app
flutter:pages
flutter:targets
ios:xcconfig
ios:buildTargets
ios:schema
ios:dummyAssets
ios:plist
ios:launchScreen
google:firebase
assets:clean
ide:config
それぞれの処理が何をしているかは、ドキュメントに記載があります。
これらの処理はコマンド実行時に「-p」オプションと一緒にカンマ区切りで渡す事で、実行する処理を指定する事も出来ます。
また、毎回パラメータで渡すのが面倒な場合は、pubspec.yamlにinstructionsを追加して、必要な物だけ指定しておく事も出来ます。
flavorizr:
app:
android:
flavorDimensions: "flavor-type"
ios:
flavors:
〜省略〜
instructions: # 不要なものはコメントアウトする
- assets:download
- assets:extract
- android:androidManifest
- android:buildGradle
- android:dummyAssets
- flutter:flavors
- flutter:app
- flutter:pages
- flutter:targets
- ios:xcconfig
- ios:buildTargets
- ios:schema
- ios:dummyAssets
- ios:plist
- ios:launchScreen
- google:firebase
- assets:clean
- ide:config
例えば「flutter:pages」は、Flavorを使ったサンプルのWidgetファイルを作ってくれるのですが、そのまま使う事は無いと思うので、Flavorの使い方が分かったらコメントアウトしても良いと思います。
また、Flavor毎にAPIの接続先を変えたい等のニーズはあると思いますが、それは「flutter:flavors」によって作成されるflavors.dartで対応可能です。
ただし、超気を付けなければいけないのは、このflavors.dartもコマンド実行のたびに再作成されるので、このファイルに直接色々な設定を追加していくと地獄を見る気がします(何か回避方法あるのか?)
なので、もしflavors.dartを使っていくのであれば、初回作成後に確実にコメントアウトする必要があります。
flavors.dartと同じ事を実現するためのパッケージもあるので、それを使っても良いと思います。
Flavorを指定してアプリを実行する
以下のコマンドでアプリを実行します。
flutter run --flavor <flavorName> -t lib/main-<flavorName>.dart
ビルドモードと組み合わせる場合は、以下のコマンドを実行します。
flutter run --debug --flavor <flavorName> -t lib/main-<flavorName>.dart
flutter run --release --flavor <flavorName> -t lib/main-<flavorName>.dart
// ビルドモードを指定しない場合は、デフォルトがdebugになる
まとめ
個人開発で簡単なアプリを作るだけならFlavorの設定までは不要かもしれませんが、少し手の込んだアプリを作る場合はあった方が良い機能だと思うので、新規プロジェクト作成時は必ず導入するようにしたいと思います。
便利なパッケージを作ってくれる開発者の人には本当に感謝です(^^)
コメント