LoginSignup
3
4

More than 3 years have passed since last update.

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

Posted at

環境

  • 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

おわりに

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

3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4