(Android) Expo bare workflow で 環境別に複数の applicationId を使い分ける
公式ドキュメントのExample: configuring development and production variants in a bare projectを参考にやってみたのでメモ。
環境
- Expo SDK 44
- bare workflow
applicationId とは
アプリの識別子。
すべての Android アプリには、「com.example.myapp」など、Java パッケージ名に似た一意のアプリケーション ID があります。 https://developer.android.com/studio/build/application-id?hl=ja
Expo manage workflow の app.json に存在する package プロパティはこの applicationId を設定している。また、iOS アプリにも同様の識別子は存在する。
概要
Android アプリのビルドバリアントという仕組みを利用する。環境別(dev, stg, prd...) にビルドバリアントを作成しそれぞれに applicationId を定義する。
ビルドバリアントは、ビルドタイプとプロダクトフレーバーの組合わせである。ビルドタイプが debug/release 、プロダクトフレーバーが dev/prd が存在する場合はビルドバリアントは 4つ存在することになる(dev-debug, prd-debug, ...)
したがって、厳密にはビルドバリアントに applicationId を定義するのではなく、ビルドタイプとプロダクトフレーバーそれぞれに定義している(どちらか片方でもいい)
今回の環境別に異なる applicationId を使い分けるという目的を達成するためには、このプロダクトフレーバーを使う。
build.gradle にプロダクトフレーバーを追加する
Expo の managed workflow から eject すると、/android/app/build.gradle
が生成される。このファイルに新しいプロダクトフレーバーを追加する(今回は例として、development と production)
buildTypes {...} // 省略 // 以下を追記 flavorDimensions "env" productFlavors { production { dimension "env" applicationId 'com.example.myapp' } development { dimension "env" applicationId 'com.example.myapp.dev' } }
ビルドバリアントを指定してビルドする
expo run:android の場合
expo run:android
コマンドは --variant
オプションを受け取ることができるので、ビルドバリアントを指定する。
ビルドバリアントは、ビルドフレーバーが development, ビルドタイプが debug の場合は以下のように指定ができる(ビルドタイプは大文字から始めることに注意)
expo run:android --variant developmentDebug
これで指定したビルドバリアントの applicationId を持つアプリをビルドできた。
EAS build の場合
ローカル環境で Android のビルドを行うと環境面で躓くことが多いので、自分は EAS build することの方が多い。
EAS build の場合は、eas.json の gradleCommand
というプロパティを使ってビルドバリアントの指定を行う。
コマンドの書式は、(assemble|bundle)FlavorBuildType
となっている。
assemble を指定すると、ビルドファイルの拡張子が.apk
になり、bundle の場合は .aab
になった。この辺の技術的な違いはよく分からない。
ビルドフレーバーとビルドタイプを大文字から始めることに注意(Upper Camel)
{ "cli": { "version": ">= 0.35.0" }, "build": { "development": { ... "android": { "gradleCommand": ":app:assembleDevelopmentDebug" // dev } }, "production": { "android": { "gradleCommand": ":app:bundleProductionRelease" // prd } } }, "submit": { "production": {} } }
あとは、通常通りにプロファイルを指定して EAS build を開始すれば良い。
eas build --profile development --platform android
ビルドバリアント毎にアプリケーションの名前も変えたい
ホームスクリーン上に表示されるアプリケーションの名前もビルドバリアント毎に変えることができる。
プロダクトフレーバー毎に新しくディレクトリとファイルを作成する。development の場合だと以下になる。
android/app/src/development/res/value/strings.xml
このファイルに以下のように名前定義をする。
<resources> <string name="app_name">(dev)app-name</string> </resources>