環境
- Android Studio 3.4.1
やりたいこと
- 本番サーバーと検証サーバー向けのapkを一度にビルドしたい
- 都度ソースコード(定数等)の変更はしたくない
- 検証サーバー向けの場合はapkのversionNameを変更して分かりやすくしたい
やり方
Gradle設定サンプル
app/build.gradleを修正します。
buildTypes{}の中にrelease_stage{}を追加します。(名称は任意)
サンプルでは基本的に既存のrelease{}のコピペですが、buildConfigFieldとversionNameSuffixを追加しています。
android {
compileSdkVersion 28
defaultConfig {
applicationId "com.example.myapplication"
minSdkVersion 21
targetSdkVersion 28
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
buildConfigField "String", "PRODUCTION_MODE", "\"PRODUCTION\""
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
release_stage {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
buildConfigField "String", "PRODUCTION_MODE", "\"STAGE\""
versionNameSuffix "_stage"
}
}
}
buildConfigFieldとは
buildConfigFieldとは、BuildConfig.javaに定数を定義する設定であり、
書式はbuildConfigField "定数の型", "定数名", "値"です。
デフォルト値(release{}で有効になる値)としてdefaultConfig {}にもbuildConfigFieldを追加します。
今回のサンプルではBuildConfig.javaに以下の通り、定数PRODUCTION_MODEが追加されます。
public final class BuildConfig {
...省略
// Fields from default config.
public static final String PRODUCTION_MODE = "PRODUCTION";
今回のサンプルでの上記の定数PRODUCTION_MODEの値は、
release{}が反映されたapkでは"PRODUCTION"、
release_stage{}が反映されたapkでは"STAGE"になります。
今回はソースコード上で以下のように処理を分けました。
void hoge() {
switch (BuildConfig.PRODUCTION_MODE) {
case "PRODUCTION"
// 本番サーバー向けの処理
break;
case "STAGE"
// 検証サーバー向けの処理
break;
}
}
versionNameSuffixとは
versionNameSuffixとは、versionNameの末尾に結合する文字列を定義する設定です。
今回のサンプルでのversionNameは、
release{}が反映されたapkでは"1.0"、
release_stage{}が反映されたapkでは"1.0_stage"になります。
apkビルド方法
Build ⇒ Ganerate Signed Bundle / APK...を選択
APKを選択してNext

Key storeを選択、passwordを入力しNextを選択。

Build Variantsでreleaseとrelease_stage両方を選択しFinishを選択。

デフォルトではapp配下にディレクトリが作成され、環境ごとのapkが作成されています。
apkごとに前述の通り内部の定数やversionNameが変更されています。

おわりに
今回は接続先サーバーを変更する用途でしたが、ほかにも応用はできそう。
もっと良い方法があればご教授いただけると幸いです。