Android

【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

q1.png

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

q2.png

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

q3.png

デフォルトではapp配下にディレクトリが作成され、環境ごとのapkが作成されています。

apkごとに前述の通り内部の定数やversionNameが変更されています。

q4.png


おわりに

今回は接続先サーバーを変更する用途でしたが、ほかにも応用はできそう。

もっと良い方法があればご教授いただけると幸いです。