【Android】定数の異なる複数のapkを一度にビルドする


環境

  • Android Studio 3.4.1

やりたいこと

  • 本番サーバーと検証サーバー向けのapkを一度にビルドしたい
  • 都度ソースコード(定数等)の変更はしたくない
  • 検証サーバー向けの場合はapkのversionNameを変更して分かりやすくしたい

やり方

Gradle設定サンプル

app/build.gradleを修正します。

buildTypes{}の中にrelease_stage{}を追加します。(名称は任意)
サンプルでは基本的に既存のrelease{}のコピペですが、buildConfigFieldversionNameSuffixを追加しています。

app/build.gradle
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が追加されます。

BuildConfig.java
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ビルド方法

BuildGanerate Signed Bundle / APK...を選択
APKを選択してNext

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

Build Variantsreleaserelease_stage両方を選択しFinishを選択。

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

おわりに

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