Firebaseの環境をSTGとPRODで変えたい

Firebaseを使用して、環境をSTG環境、本番環境に変えたいという要望はあるかと思います。

まずは事前準備

Android

Androidアプリはjava + kotlinで開発をしています。そのためswiftやobjective-cにあるようなプリプロセッサの概念が存在しません。

build.gradleを編集し、dev、stg、prodを切り替えれるようにしました。なお、build.gradle単体では解決できないのでフォルダ構造、一部ソースの編集が必要となります。

以下build.gradleから抜粋

変更前

android {
    signingConfigs {
        release {
            storeFile file('/xxxxx/xxxx/xxxxxxx/xxxxx.jks')
            keyAlias = 'xxxxxx'
            keyPassword 'xxxxxx'
            storePassword 'xxxxxx'
        }
    }
    compileSdkVersion 29
    buildToolsVersion '29.0.0'

    defaultConfig {
        applicationId "xxx.xxx.xxx.xxx"
        multiDexEnabled true
        minSdkVersion 21
        targetSdkVersion 29
        versionCode 96
        versionName "x.x.x"
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('xxxx.txt'), 'proguard-rules.pro'
        }
    }

    productFlavors {
        development {
            applicationId = "xxx.xxx.xxx.xxx.xxx.xxx.xxx"
        }
    }
}

buildTypesを修正します。

 buildTypes {
        debug {
            debuggable true 
            applicationIdSuffix ".debug"
            versionNameSuffix "-DEBUG"
            buildConfigField "int", "CONNECT_INFO", "1"
            resValue "string", "app_name", "[S]hogehoge app name" 
            signingConfig signingConfigs.debug 
        }

        staging {
            debuggable true
            applicationIdSuffix ".stg"
            versionNameSuffix "-STG" 
            buildConfigField "int", "CONNECT_INFO", "2"
            resValue "string", "app_name", "[P]hogehoge app name" 
            signingConfig signingConfigs.debug 
        }

        release {
            minifyEnabled false
            buildConfigField "int", "CONNECT_INFO", "2"
            resValue "string", "app_name", "hogehoge app name"
            proguardFiles getDefaultProguardFile('xxxx.txt'), 'proguard-rules.pro'
        }
    }

変更内容について

  • buildTypes {
    hogehoge{ … }
    }

buildTypes配下に、それぞれビルドタイプに指定しています。今回は、開発(debug)、STG(staging)、prod(release)として設定をしています。こうすることで、android studioのビルドタイプが増えます。

  • applicationIdSuffix “.stg”

applicationIdSuffix は defaultで設定しているapplication idに対して文字を繋げる指定ができます。

そうすることで同じ端末に対して、開発(debug)、STG(staging)、prod(release)の3つのバージョンのアプリをインストールすることができます。

  • resValue “string”, “app_name”, “[P]mediLink”

上記を設定することで、アプリの名前を変えています。つまりres/strings.xmlの中身を指定しています

  • buildConfigField “int”, “CONNECT_INFO”, “2”

gradleを走らすことで、BuildConfigを生成できますが、その中に指定の定数を設定しています。これでアプリ内部で開発(debug)、STG(staging)、prod(release)の挙動を変更しています。

package xxxx.xxx.xxx.x;

public final class BuildConfig {
  public static final boolean DEBUG = Boolean.parseBoolean("true");
  public static final String APPLICATION_ID = "xxxx.xxx.xxx.x.debug";
  public static final String BUILD_TYPE = "debug";
  public static final String FLAVOR = "";
  public static final int VERSION_CODE = 100;
  public static final String VERSION_NAME = "3.1.4";
  // Fields from build type: debug
  public static final int CONNECT_INFO = x; ←これになります
}

上記の設定をした場合、ソース側の構成の変更が必要となります。

build.gradleで変更を入れた名前(この例だと、debug,dtaging,release)のディレクトリを用意します。

また今回javaが混じっているため、そのファイルを継承した形のものを用意します。main配下のApplicationクラスを継承した形で用意します。

debug

staging

それぞれのソースはシンプルでmainにあるMLMainApplication.javaの継承をしているだけです(以下staging環境)

package xxx.xxx.xxx.xxx;

public class StagingMainApplication extends MLMainApplication {

    @Override
    public void onCreate() {
        super.onCreate();
    }
}

それぞれ継承したマニュフェストを編集します。

toolsで”android:name”を指定し、継承したアプリケーションクラスを指定します。

tools:replace=”android:name”
android:name=”.StagingMainApplication”

   <application
        tools:replace="android:name"
        android:name=".StagingMainApplication"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:networkSecurityConfig="@xml/network_security_config"
        android:roundIcon="@mipmap/ic_launcher_round">

あとはandroid studioからビルドタイプを指定して走らす形です。

これでビルドタイプを指定してビルドが通るようになりました。

Firebaseをそれぞれの環境に繋げるようにする

本題です。ここまでやっておけばあとは楽です。buildTypesで用意したフォルダ直下にそれぞれのFirebaseの設定ファイルを配置するだけです。

Firebaseに設定するアプリのパッケージ名はapplicationIdSuffixでつなげた値にしましょう。

なお、providerの「android:authorities」も引っかかるで”${applicationId}”を指定してあげると良いかもしれません。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

Bitnami