AndroidアプリでサーバーサイドAPIとの通信を実装する場合、通信するサーバーサイドのエンドポイントをdevelopment/productionと切り替えることがあるかと思います。
今までは定数ファイルとかにフラグを作成して、ハードコードで切り替えていたのですが、最近gradleのproductFlavorsを使えば、うまく切り替えることができることを知ったので備忘録です。
設定方法
以下のように、build.gradleにproductFlavorsを追記します。
build.gradle
android {
// ~~~
buildTypes {
release {
// proguard設定
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
zipAlignEnabled true
}
debug {}
productFlavors {
development {
setApplicationId("my.app.dev")
manifestPlaceholders = [appName:"開発MyApp"]
buildConfigField "boolean", "DEVELOPMENT_MODE", "true"
}
preproduction {
setApplicationId("my.app.pre")
manifestPlaceholders = [appName:"プレMyApp"]
buildConfigField "boolean", "DEVELOPMENT_MODE", "true"
}
production {
setApplicationId("my.app")
manifestPlaceholders = [appName:"MyApp"]
buildConfigField "boolean", "DEVELOPMENT_MODE", "false"
}
}
}
ビルド時にBuildConfig.javaが自動生成されるので、上記のbuildConfigFieldで設定した定数をアプリから呼び出せるようになります。
呼び出し方は下記のような感じ。
if (BuildConfig.DEVELOPMENT_MODE) {
return "https://development-api.example.com/";
}
return "https://production-api.example.com/";
コマンドラインから各ProductFlavorを使用してのビルド方法
ProductFlavorのキーとBuildTypeを組み合わせた文字列をgradlewに渡してあげると、ビルドが始まりapkファイルを生成することができます。
コマンド例
BuildTypeがdebug、ProductFlavorがdevelopmentの場合
./gradlew assembleDevelopmentDebug
BuildTypeがdebug、ProductFlavorがpreproductionの場合
./gradlew assemblePreproductionDebug
※ デフォルトの設定だと、apkファイルは/app/build/outputs/apk/以下に生成される。
上記のようにgradlewでビルドするためのコマンドは、以下のコマンドで確認できます。
./gradlew tasks