はじめに
iOS では Xcodeで本番アプリと開発アプリをわけるベストプラクティス で書いたんですが Android もこれと同じようにわけたい!ってことでビルドタイプ、プロダクトフレーバー、ビルドバリアントについて書きたいと思います。
やりたいこと
下記のような要件で本番、開発、ダミーの3つのアプリにわけます。
- 本番、開発、ダミーで別々のアプリにわけたい(アプリIDをわけたい)
- 本番、開発、ダミーで接続先サーバをわけたい
- 本番、開発、ダミーでアプリ名をわけたい
- 本番、開発、ダミーでアプリアイコンをわけたい
※ 2.は本番→本番用サーバ、開発→開発用サーバ、ダミー→サーバ接続せずローカルのファイルを読み込むのような想定です。
ビルドバリアント
ビルド環境をわけるにはどうやらビルドタイプ、プロダクトフレーバー、ビルドバリアントを使うみたいです。
ビルドタイプは release, debug など Xcode でいう Build Configuration 相当で、 プロダクトフレーバーはスキームに相当するんだと思います。このビルドタイプ×プロダクトフレーバーの組み合わせがビルドバリアントでありこの数分だけ apk を分けれるようです
仮に下記のように設定すると
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
android { ・ ・ ・ buildTypes { release { ・ ・ ・ } // debugはなくても有効になってる debug { ・ ・ ・ } } flavorDimensions "hoge" productFlavors { app1 { dimension "hoge" } app2 { dimension "hoge" } } } |
ビルドタイプ×プロダクトフレーバーの組み合わせで下記4つのアプリができる
- app1Debug
- app1Release
- app2Debug
- app2Release
プロダクトフレーバーはさらに flavorDimensions
によってもわけれるので下記のようにすると
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
flavorDimensions "hoge", "fuga" productFlavors { app1 { dimension "hoge" } app2 { dimension "hoge" } foo1 { dimension "fuga" } foo2 { dimension "fuga" } } |
ビルドタイプ×プロダクトフレーバー× flavorDimensions の組み合わせで下記8つのアプリができる
- app1Foo1Debug
- app1Foo1Release
- app1Foo2Debug
- app1Foo2Release
- app2Foo1Debug
- app2Foo1Release
- app2Foo2Debug
- app2Foo2Release
flavorDimensions については下記参考
flavorDimensionsによるflavorの指定方法
アプリのわけ方
ビルドバリアントについてわかったところでアプリを本番、開発、ダミーの3つにわけていきます。
1. アプリを3つにわける
とりあえずフレーバーを下記のようにわければアプリがわけれます。アプリ ID も別々のものが設定されます!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
flavorDimensions "env" productFlavors { product { dimension "env" } develop { dimension "env" applicationIdSuffix ".develop" } dummy { dimension "env" applicationIdSuffix ".dummy" } } |
エミュレータで起動する場合は Android Studio の左下の Build Variants で起動したいアプリを選択する。
2. 接続先サーバをわける
それぞれのアプリで処理を分岐させるには下記のように書ける。これで接続先サーバもわけれます!
1 2 3 4 5 6 7 8 9 10 11 |
when (BuildConfig.FLAVOR) { "product" -> { Timber.i("product") } "develop" -> { Timber.i("develop") } "dummy" -> { Timber.i("dummy") } } |
3. アプリ名をわける
マニフェストファイルの android:labe
を下記のように変更する
1 |
android:label="${appLabel}" |
フレーバーの設定に manifestPlaceholders
を追加する
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
flavorDimensions "env" productFlavors { product { dimension "env" manifestPlaceholders = [appLabel:"@string/app_name_product"] } develop { dimension "env" applicationIdSuffix ".develop" manifestPlaceholders = [appLabel:"@string/app_name_develop"] } dummy { dimension "env" applicationIdSuffix ".dummy" manifestPlaceholders = [appLabel:"@string/app_name_dummy"] } } |
strings.xml にそれぞれのアプリ名を追加する
1 2 3 |
<string name="app_name_product">PiyoApp</string> <string name="app_name_develop">PiyoAppDev</string> <string name="app_name_dummy">PiyoAppDummy</string> |
これでアプリ名もわけれます!
この記事(Androidアプリのビルド設定管理(Product Flavor、Build Type))のようにフレーバーごとに文字リソースファイルを追加する方法でもいけるようです。
4. アプリアイコンをわける
ic_launcher > New > Image Asset > Next でフレーバーごとにリソースを追加する。
これでアプリアイコンもわけれます!
成果物はこんな感じ!
おわりに
これで iOS と同じようにアプリをわけることができました!
あとはコルーチンと通信まわり、Dagger について調べたらアプリ作成に入ろうと思います。(ながい。。。)
参考
- Android デベロッパー:ビルド バリアントの設定
- Android StudioでProduct Flavorを使う
- ビルドバリアントによる複数バージョンのAPKのビルド - ZOZO Technologies TECH BLOG
- flavorDimensionsによるflavorの指定方法
- Androidアプリのビルド設定管理(Product Flavor、Build Type)
コメント