AndroidでFirebaseを利用してみた

# はじめに
今携わっているプロダクトでABテストなどをできる仕組みを導入したくて、調査してみました。

# Firebaseとは
Firebaseは、Googleが提供しているBasSサービスです。
リアルタイム通知可能、かつアクセス制御可能なオブジェクトデータベース機能に加え、認証機能やアプリケーションのログ解析機能などを利用することができます。

# アカウント登録
Googleアカウントを持っていれば誰でも無料で利用することができます。
https://console.firebase.google.com/

# 環境
Android Studio 2.2 preview

# 導入
## プロジェクトにアプリを登録する
1.https://console.firebase.google.com/ にアクセスし、プロジェクトの新規作成を行う。
![スクリーンショット 2016-06-28 23.37.25.png](https://qiita-image-store.s3.amazonaws.com/0/96091/5af6e7c5-bfd0-814b-04b7-b6031f06e78b.png)

2.アプリを追加
![スクリーンショット 2016-06-28 23.38.09.png](https://qiita-image-store.s3.amazonaws.com/0/96091/1a34f811-6d8b-8005-b5c3-0dd036acd04b.png)

3.AndroidアプリにFirebaseを追加
![スクリーンショット 2016-06-28 23.36.04.png](https://qiita-image-store.s3.amazonaws.com/0/96091/70856117-4a88-3ccd-750e-21275c078f4e.png)

4.必要な情報を追加し、アプリを追加する。
パッケージ名:
デバッグ署名証明書(SHA-1):keystoreから取得した値を指定する
※Authなどを利用する場合は必須です。

```
keytool -v -list -keystore [keystore名]
```

![スクリーンショット 2016-06-28 23.38.50.png](https://qiita-image-store.s3.amazonaws.com/0/96091/b0598c4e-808c-d335-d9a3-5d386bcaffed.png)


## アプリにライブラリを導入する
Firebaseを利用するプロジェクトのbuild.gradle ファイルを修正します。

```
project/build.gradle

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.2.0-alpha3'
        classpath 'com.google.gms:google-services:3.0.0'
    }
}

project/app/build.gradle

android {
    packagingOptions {
        exclude 'META-INF/LICENSE'
        exclude 'META-INF/LICENSE-FIREBASE.txt'
        exclude 'META-INF/NOTICE'
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:23.4.0'
    compile 'com.android.support.constraint:constraint-layout:1.0.0-alpha3'
    testCompile 'junit:junit:4.12'

    compile 'com.firebase:firebase-client-android:2.5.0'
    compile 'com.google.firebase:firebase-core:9.0.2'　←analytics
    compile 'com.google.firebase:firebase-crash:9.0.2' ←crash
    compile 'com.google.firebase:firebase-config:9.0.2'←RemoteConfig
}

apply plugin: 'com.google.gms.google-services'　←最終行に記述してください。

```

2.各アプリケーションID用のgoogle-servie.jsonをapp配下におく必要がある。
Flavorを分ける場合、それぞれのディレクトリに配置してください

# できること
## auth
- Auth系のtoken取得／管理を行う機能
- Twitter/GitHub/Facebook/Googleログインに対応しているようです。

今回は使わないので割愛します。
http://qiita.com/yamacraft/items/f93defaff6a15389390c

## Analitycs
-　Firebase Analyticsはアプリケーションのログ解析に最適化された、いわばアプリ版のGoogle Analyticsです。
-　iOS、Androidに対応しており、課金、アプリ削除イベントなどを自動で収集してくれる。
　なお、個別にイベントを定義することもできます。

### 自動収集イベント
Firebase SDK を使用することで自動で収集されるイベントがいくつかあります。
以下のようなログについては、個別で定義する必要はなさそうです

・アプリ初回起動
・GooglePlay/AppStoreでの課金完了イベント
　プロダクト ID、商品名、通貨、数量がパラメータとして渡されるようです。
・セッション
・アプリ削除
・Firebase Cloud Messagingで受信した通知からのアプリ起動

詳細については以下参照
https://support.google.com/firebase/answer/6317485

### 自動収集されるユーザープロパティ
https://support.google.com/firebase/answer/6317486?hl=ja&ref_topic=6317484

### カスタムイベント
Flurryとかのように柔軟にカスタムイベントを定義できますが、Analyticsのイベントで詳細を確認することができませんでした。BigQueryにデータを流して確認するしかなさそうですね。

### 定義されているイベントの送信
```
FirebaseAnalytics analytics = FirebaseAnalytics.getInstance(this);    
Bundle params = new Bundle();
params.putString(FirebaseAnalytics.Param.ITEM_ID, "10");
params.putString(FirebaseAnalytics.Param.ITEM_NAME, "name");
params.putString(FirebaseAnalytics.Param.CONTENT_TYPE, "text");
mFirebaseAnalytics.logEvent(FirebaseAnalytics.Event.SELECT_CONTENT, params);
```

### 独自イベントの送信
```
FirebaseAnalytics analytics = FirebaseAnalytics.getInstance(this);
Bundle params = new Bundle();
params.putString("screen_name", "Splash");
mFirebaseAnalytics.logEvent("screenView", params);
```

### レポート
以下のように収集したイベントを確認することができます。

![スクリーンショット 2016-06-28 22.52.19.png](https://qiita-image-store.s3.amazonaws.com/0/96091/4d574cca-71dc-d45c-6559-356ca7235b21.png)

## Remote Config


1.Firebase コンソール>「Remote Config」でパラメータの追加を行う。
![スクリーンショット 2016-06-28 23.05.16.png](https://qiita-image-store.s3.amazonaws.com/0/96091/a3504e4c-f45f-d56f-62c8-69f61e2bda39.png)

<パラメータ>
パラメータは以下のようなものが設定できるようです。
string
boolean
long
double

2.パラメータに対して条件を追加する。
各項目に対して、この条件ならこの値を利用するように設定することも可能なので必要であれば設定してみてください。

今回は、アプリIDを指定してみました。

![スクリーンショット 2016-06-28 23.04.41.png](https://qiita-image-store.s3.amazonaws.com/0/96091/44a9fdb3-e7ad-5309-fffe-ae44f26290a6.png)

<条件設定>
・ユーザー(ランダム%)
・アプリID
・ユーザー層
・OSの種類
・端末の地域(国)
・端末の言語

用意されている条件は上記のようなものがありますが、所感としては、あまり汎用性がないので、設定値のみRemoteConfigにもたせてアプリ側でセグメントを区別したりすることになりそうです。


3.名前と適用する条件を追加して、条件を作成するボタンをタップすると以下のように条件が追加されるので
値を入力して更新ボタンをタップする。

![スクリーンショット 2016-06-28 23.16.30.png](https://qiita-image-store.s3.amazonaws.com/0/96091/d51adda6-1f15-9fcc-f665-bb30fa8c1229.png)

4.公開ボタンをタップして公開する。
公開するとアプリ側で指定している時間毎に、設定したパラメータがアプリに反映されるようです。
その際のデフォルトファイルをアプリのres/xml/remote_config_default.xmlのように配置してあげることでデフォルト値をアプリが取り込むことができます。

### 制限事項
RemoteConconfigにはパラメータなどに制限があるようです。

パラメータ　2000個まで
パラメータキー 最大256文字
条件 100個まで
パラメータの値は合計50万文字まで

## Crash
とくに設定など必要なく、gradleでライブラリを取り込むだけで利用できるようです。

# サンプル
各機能のサンプルは以下にあります。
https://github.com/firebase/quickstart-android

# 所感
- Analyticsはまだまだ微妙な感じなので現在GAを利用されているのであれば無理に移行しなくてもよさそうです。今後のアプデに期待です。

- RemoteConfigはまだまだ汎用性はないですが、アプリでABテストを行ったり、事前に組み込んでおくことでアプデ無しに内容の更新などもできるので採用してみてもいい気がします。
個人的にはTagMannagerを利用してABテストを行うようりは使いやすかったです。

- crashはcrashlyticsのようにissueをcloseすることはできませんが、crashlyticsを導入していないのであれば、無料だし、画面も見やすいので導入しても良いかもしれません。

- 導入自体は簡単なので既存使っているサービスと併用して導入してもいいんじゃないでしょうか。

# 参考
http://qiita.com/yamacraft/items/fd736203c29dfd3c7050
http://qiita.com/SnowMonkey/items/5b9019a936aa6762cf53