Using Firebase Cloud Messaging and Analytics without google-services.json

Photo by Daniel Sturgess on Unsplash

イケてない

  • GitHub に上げれないので CI/CD しようと思ったときめんどくさい
  • apply plugin: ‘com.google.gms.google-services’ を app/build.gradle の 1 番下に書く必要がある
  • FCM と com.google.gms.google-services の仲が悪い(らしい)

ということで環境変数に APP_ID などを設定して FCM と Analytics を使う方法について書いていきます.

FCM

root の build.gradle(これは公式のやつと変わらない)

buildscript {
    ext.kotlin_version = '1.2.51'
    repositories {
        google()
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.1.3'
        classpath 'com.google.gms:google-services:3.2.0'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}allprojects {
    repositories {
        google()
        jcenter()
    }
}

app/build.gradle

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'android {
    compileSdkVersion 27
    defaultConfig {
        applicationId "net.yuzumone.test"
        minSdkVersion 21
        targetSdkVersion 27
        versionCode 1
        versionName "1.0"
        buildConfigField("String", "APP_ID", "\"${System.env.FCM_APP_ID}\"")
        buildConfigField("String", "API_KEY", "\"${System.env.FCM_API_KEY}\"")
    }
    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
} dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation"org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
    implementation 'com.android.support:appcompat-v7:27.1.1'
    implementation 'com.google.firebase:firebase-messaging:17.1.0'
}

Application

class TestApplication : Application() {
    override fun onCreate() {
        super.onCreate()
        FirebaseApp.initializeApp(this, FirebaseOptions.Builder()
                .setApplicationId(BuildConfig.APP_ID)
                .setApiKey(BuildConfig.API_KEY)
                .build(), getString(R.string.app_name))
    }
}

ポイント

  • buildConfigField を使用して環境変数から BuildConfig へ APP_ID を読み込む
  • Application クラスで FirebaseApp#initializeApp を呼び,APP_ID と API_KEY を入れる

これだけでとりあえず FCM は使えるようになる.
環境変数に値を設定するのを忘れずに.

Analytics

FCM にものに追加で設定する必要がある.

app/build.gradle

android {
    defaultConfig {
        // 追加
        resValue("string", "google_app_id", "\"${System.env.FCM_APP_ID}\"")
    }
} dependencies {
    // 追加
    implementation 'com.google.firebase:firebase-analytics:16.0.1'
}

上に示している通り,Analytics を使うには string.xml に google_app_id という name で APP_ID を追加で設定する必要がある.
string.xml に直で書くと意味がないので,resValue を使用して string.xml に値をセットするようにしてみた.
とりあえずこれでエラーが出なくなったので OK っぽい.