EDIT MODE

モバイルアプリ開発に関することを書いています

Firebase Analytics Guide

前回は Firebase Analytics の概要をまとめたのですが、ドキュメントや Google I/O 2016 のセッション動画などを見て、もう少し具体的な内容をまとめたいなと思い、この記事を書きました。

androhi.hatenablog.com

Firebase Analytics の位置づけ

Firebase Analytics は、Firebase のコアとして、無料かつ無制限のアナリティクス・ツールとなっています。 Google I/O 2016 での各セッションでも、そのことが繰り返し述べられていました。

Google Analytics とは異なり、モバイルアプリのためのツールとなっているため、対象となるプラットフォームは現在のところ Android と iOS のみとなっています。

なお Google Analytics との違いは、以下のヘルプページで詳しく解説してありました。

上記にも記載がありますが、Google Analytics との大きな違いは以下の2点だと思います。

  1. イベントベースのデータ収集モデル
  2. いくつかのイベントやプロパティの自動測定

どのように機能するのか?

Firebase Analytics は、iOS もしくは Android アプリでいくつかのイベントとユーザープロパティを、自動で収集してくれます。 どのような項目を自動収集するのかは、以下のページに詳細があります。課金イベントも自動で収集されるのは嬉しいですね。

これらの自動収集されたデータは、Firebase console のダッシュボードで確認することができます。

f:id:androhi:20160527003216p:plain

他のサービスとの統合

Firebase Analytics は、他の Firebase サービスのログも収集することができ、それらをダッシュボード上で確認することが出来ます。 たとえば Notifications の通知イベントは、自動収集対象にもなっているので下図のように細かくログを確認することが出来ます。

f:id:androhi:20160603014823p:plain

他のサービスについては、どのように統合されているのかを示すにはサンプルアプリでは限界があるので、以下の Google I/O 2016 のセッション(英語)を見ていただくのがいいかと思います。

Analytics の基本的な使い方

Analytics では、最初に次の 1〜4 を行ったあと、必要に応じて 3 と 4 を繰り返していくことを想定しているようです。それぞれの手順を、以下にまとめました。

1. アプリを Firebase に接続する

"Get started with Firebase Analytics for Android" を参考に、解析したいアプリでデータの自動収集が行われるようセットアップします。 詳細は上記サイトを見ていただいて、以下はおおまかな流れです。

a. Firebase SDK のセットアップ

やるべきことは次の3つです。

  • Firebase console にアプリのパッケージ名(=ApplicationId)を登録
  • build.gradle を編集
  • app/build.gradle を編集
b. FirebaseAnalytics オブジェクトの初期化

ドキュメントには、アプリのサインイン・アクティビティの onCreate() メソッドに、以下の初期化処理を書くように記載されています。

// Obtain the FirebaseAnalytics instance.
mFirebaseAnalytics = FirebaseAnalytics.getInstance(this);
c. [オプション]: ログイベントの使い方

いくつかのイベントは、b までのステップが完了したらログは自動収集されますが、もちろん開発者が自分でログを送信するイベントを記述する方法も用意されています。 以下のように、 logEvent() メソッドを使って実現します。その際、自動収集対象のイベントは FirebaseAnalytics クラスに定数として用意されているので、それを使用することも可能です。

Bundle bundle = new Bundle();
bundle.putString(FirebaseAnalytics.Param.ITEM_ID, id);
bundle.putString(FirebaseAnalytics.Param.ITEM_NAME, name);
bundle.putString(FirebaseAnalytics.Param.CONTENT_TYPE, "image");
mFirebaseAnalytics.logEvent(FirebaseAnalytics.Event.SELECT_CONTENT, bundle);

ちなみに、以下のように adb コマンドを叩くと logcat 上で logEvent() のログが見れるようになります。


ターミナルなどで

$ adb shell setprop log.tag.FA VERBOSE
$ adb shell setprop log.tag.FA-SVC VERBOSE
$ adb logcat -v time -s FA FA-SVC


logcat から抜粋

06-03 01:00:26.952 D/FA      (23012): Logging event (FE): select_content, Bundle[{_o=app, item_category=button}]
06-03 01:00:26.952 V/FA      (23012): Using measurement service
06-03 01:00:26.953 V/FA      (23012): Connecting to remote service
06-03 01:00:26.969 D/FA      (23012): Connected to remote service
06-03 01:00:26.970 V/FA      (23012): Processing queued up service tasks: 1
06-03 01:00:27.008 V/FA-SVC  (11813): Saving event, name, data size: select_content, 43
06-03 01:00:27.009 V/FA-SVC  (11813): Event recorded: Event{appId='com.androhi.firebaseextensionsample', name='select_content', params=Bundle[{_o=app, item_category=button}]}
06-03 01:00:27.025 V/FA-SVC  (11813): Upload scheduled in approximately ms: 3579219
06-03 01:00:27.027 V/FA-SVC  (11813): Background event processing time, ms: 55
06-03 01:00:31.977 V/FA      (23012): Inactivity, disconnecting from AppMeasurementService

2. カスタム・イベントのログを送る

これは前述した「ログイベントの使い方」とほぼ同じですが、以下のようにイベント名を任意の名称にすれば、独自のイベントとしてカウントされるという内容です。 ドキュメントでいうと、"Firebase Analytics - Log Events" の項目です。

Bundle params = new Bundle();
params.putString("image_name", name);
params.putString("full_text", text);
mFirebaseAnalytics.logEvent("share_image", params);

3. オーディエンスを作成する

いわゆる収集データのフィルタリングです。

イベントやユーザープロパティ、デバイスデータなどを使って、収集されたデータにフィルタをかけます。 Firebase console にて、下図のようにフィルタする条件を選択することができます。

f:id:androhi:20160603015007p:plain

4. ターゲットへの施策を実行する

手順3で施策を打ちたいターゲット層を決定し、他の Firebase サービス、例えば Notifications や Remote Config などを使って、プロモーションなどを行います。

f:id:androhi:20160603023905p:plain

補足:既に Google Analytics を使って場合はどうするのか?

以下の内容は、個人の見解です。

まずは公式の見解はどうなのかというと、Google のヘルプページに参考となる情報が載っていました。

  1. アプリ専用の企業の場合: Firebase Analytics をご利用ください
  2. ウェブサイトのみを運営する企業の場合: Google アナリティクスをご利用ください
  3. アプリとウェブサイトの両方を運営する企業の場合: Firebase Analytics と Google アナリティクスの両方をご利用ください

つまり今後モバイルアプリは、 Firebase Analytics を使って欲しいということのようです。確かにページビューなどによる計測は、アプリの場合あまり意味を成さないですし、無料枠での Google Analytics ではデータのサンプリングなども行われるので、すぐにでも Firebase Analytics に移行しても良い気がします。

それ以外では、以下の状況によって移行の是非や時期を関係者で良く話し合うのが、現実的なのかなと思います。

  • Google Analytics はプレミアムか?
  • AppIndexing や AdWords など、Firebase に統合されたサービスを使っているか?
  • 今後アプリのグロースを強化したいか?

ちなみに、上記3に該当するような場合、両方の管理画面をチェックするのが面倒になりそうですが、Google Analytics 上で Firebase Analytics のレポートを見られるように設定ができるようです。


参考:Google Analytics と Firebase Analytics の接続

f:id:androhi:20160603022250p:plain

f:id:androhi:20160603022316p:plain

まとめ

簡単な導入ステップされ終えれば、基本的なデータは自動的に収集されるので、まずは Firebase Analytics だけを先行して導入してみても十分なメリットが得られるように思います。(場合によっては、Google Analytics からの移行に検討が必要かもしれませんが。)

しかし、Firebase Analytics の真価は他のサービスとの連携にあるようなので、導入した際には積極的にアプリのグロース関係を始めとして、他のサービスの利用も検討してみるべきかなと感じました。

Firebase Analytics Overview

Firebase Analytics とは?

Google I/O 2016 で発表された、Firebase 拡張機能群のうちの1つです。

Google Analytics をモバイル向けに最適化したもので、特に「アプリの利用状況」と「ユーザーエンゲージメント」の監視に特化しているようです。 Android と iOS に対応していて、解析内容は専用の Firebase Console 上で確認できるようになってます。


f:id:androhi:20160527003313p:plain Firebase Console

公式のドキュメントはこちら。

Firebase Analytics Guides


拡張された Firebase の概要は、このセッションが参考になりました。(英語ですがデモが多くて見やすいです。)

Firebase Overview - Google I/O 2016

Firebase Analytics の利点

ざっと触った中で、(主に Google Analytics と比較して)良かった点を挙げてみようと思います。

なお以下は、個人的な見解です。

1. 導入および実装がものすごく簡単

Firebase Analytics のセットアップは驚くほど簡単です。
この公式の手順通り進めていけば、特に迷うことは無いと思います。 ちなみにAnalytics は Firebase-Core に含まれているので、上記の共通手順を終えるだけで組み込むことが出来ます。


注意点

"通常はスムーズにセットアップ出来ると思いますが、1点だけ僕がハマったところがあります。 Firebase Console は Google Account でログインした状態で使用しますが、ブラウザに複数アカウントをログインさせてる状態だと、設定ファイル(google-services.json)のダウンロードに失敗するようです。
もしそういった状況になった時は、Firebase Console で使用しないアカウントをログアウトしてから、再度 Firebase Console にログインするとうまくいくようになりました。"


プラグインとライブラリをセットアップしたら、Analytics のセットアップ方法にあるように、 FirebaseAnalytics.getInstance(Context) を Activity の onCreate() などで呼ぶだけです。 必要なコードの追加は、ものすごく少ないです。

getInstance() メソッドコール以降は、Analytics 側で自動でログを収集してくれるようです。 何を自動収集するかは、以下に書かれています。


f:id:androhi:20160527003216p:plain 収集されたイベントログ

Google Analytics で xml 書いたりログ送信処理書いたりしていたのが、嘘みたいな簡単さですね...

2. Web のダッシュボードが見やすい

下図のように、モバイルアプリに必要な項目に絞って各レポートが表示されており、とてもスッキリして見やすいです。 また、フィルターを組み合わせていけば、レポート表示をカスタムすることもできます。

個人的には普段 Android 端末メインなので、Console 全体が Material Design に沿って作られていることも良いなと思います。


f:id:androhi:20160527001921p:plain Analytics ダッシュボード

まだ細かく触っていないので、どこまで詳細な分析ができるか未知数ですが、Google Analytics よりも操作は直感的に行えるように思えました。

3. 他機能との連携が強力

Firebase Analytics の真価は、他の機能と一緒に使うことで発揮されるようです。 具体的にはこのあたりに、どういった連携がなされるのかが書いてあります。

中でも Firebase Notifications は、関連するイベントが自動で記録されたり、下図のように「送信数(予測)」や「既読率」なども計測できるようです。


f:id:androhi:20160527003647p:plain Notifications ダッシュボード

まとめ

Firebase Analytics は Google Analytics に比べると、シンプルでアプリに特化している分、使いやすくなっているなと思います。 加えて、導入も簡単で他の Firebase 機能との連携もあるなど、開発者視点だと今すぐにでも Google Analytics から移行したいほど、Firebase Analytics は良く出来ているなと感じました。

ただし、Web 的な指標がベースの Google Analytics とは、分析内容がかなり異なる部分もあります。そのため、もしその分析内容を共有しているメンバー(特に非エンジニアが含まれる場合)がいるようなプロダクトに投入したい場合は、しっかりと事前に検討が必要そうだとも思いました。

サンプルコード

この記事を書くにあたり、実際に Firebase Analytics と Firebase Notifications が動くサンプルアプリを、GitHub にアップしています。 とはいっても、本当に追加したコードは少ないので、ドキュメント見たほうが早いかもしれません...。

サンプルアプリ - GitHub

Zaim 開発合宿を開催しました

5月10日、11日の1泊2日で Zaim メンバーにて、開発合宿を行いました。 合宿地は、湯河原温泉にある「おんやど恵」という旅館です。

会議室を借りることが出来るので、そこで「普段気になってるけど中々実行出来ないタスクをやる」というコンセプトで、各メンバー取り組みました。

f:id:androhi:20160511171850j:plain

合宿で何をやったか?

合宿中にやるタスクについては、各々事前にいくつか候補を出しておきました。 合宿開始時に、実際にやるタスクを発表し、途中で進捗報告の発表も入れながら、メンバーが何をやっているのか共有するようにしました。

ちなみに合宿の大まかなスケジュールは、このような感じでした。

1日目

時間 内容
10:30 湯河原駅にて集合
11:00 おんやど恵に到着
会議室にて合宿開始
13:00 昼食
14:00 足湯などしつつ午後の部開始
18:30 夕食
20:00 温泉
21:30 ボードゲーム大会
??:?? 力尽きた者から就寝

2日目

時間 内容
08:00 朝食
09:00 午前の部開始
13:00 昼食
14:00 足湯などしつつ午後の部開始
18:00 合宿終了
18:40 湯河原駅にて解散

旅館はどうだったか?

今回宿泊した「おんやど恵」さんで、僕の主観ですが良かったな〜と感じた点を紹介します。

1. 足湯が気持ちいい

素敵な中庭を眺めながら、足湯に浸かることが出来ます。 さらにその中庭を見ながら、朝食や夕食を取ることが出来るので、とても癒やされました。

f:id:androhi:20160511171939j:plain

f:id:androhi:20160511172226j:plain

2. ボードゲーム標準装備

フロントで申し込むと、ボードゲームを借りることが出来ます。 Zaim にはボードゲームにかなり詳しいメンバーがいることもあり、1日目の夜はボードゲーム大会で盛り上がりました。

3. 会議室にBluetooth対応スピーカーがある

運が良かったことに、我々が合宿をする一月前から会議室にスピーカーが設置されたようです。しかも会議室利用者なら無料で使えます。

Bluetooth対応なので、作業中のBGMをスマートフォンからも流せます。(僕は全然スピーカーに詳しくないのですが、ハーマン・カードン社といえばオーディオ機器では有名みたいです。) Zaim の合宿でも、このスピーカーで音楽を流しながら作業しました。

感想

開発合宿についての、個人的な感想です。

「普段気になってるけど中々実行出来ないタスク」が出来たことは、思っていた以上に有意義な時間でした。加えて合宿という形式で作業するのも、良い気分転換になりました。ボードゲーム大会楽しかったです。

僕は開発合宿というものは初めてだったのですが、感覚としては通常勤務と社員旅行の中間みたいな感じがしました。 Zaim では今回が第1回目となる開発合宿でしたが、良い合宿だったと思います。ぜひ第2回目も開催できればなと思っています。

Kotlin/Pluginもくもく会を開催しました

先日、Kotlin や IntelliJ Plugin をテーマにもくもく会を開催しました。

もくもく会の様子

当日は、簡単な自己紹介をした後、1名飛び込みで LT をしていただいたりしました。

その後、Kotlin グループと Plugin グループとで何となく分かれ、開発を始めたのですが、 飲み物とピザをサムライズム山本さんが用意して下さってので、飲んだり食べたりしながら楽しくもくもく出来ました!

ちょっと写真が無くて申し訳ないのですが、サムライズムさんはプロジェクターやマイク、電源、WiFiと何でも揃っているので最高でした。

僕は Plugin グループでもくもくしてたのですが、意見交換とかも出来て楽しかったです。 Kotlin グループも Kotlin エヴァンジェリスト?のたろうさんも来て下っていたし、ちょこちょこ会話も聞こえてきて楽しそうでした。

同じ目的でもくもくするのって、やっぱりいいですね。

会を終えて思ったこと

過去2回やった Plugin 勉強会でも思ったのですが、少人数開催とはいえ初対面の方や開発中に声かけづらいとかもあり、コミュニケーション取るの難しいなと思っていました。

そのため今回は、参加者のみなさんに簡単な自己紹介をお願いして、コミュニケーションしやすくなればいいなと思ったのですが、 もしかしたらあまりプラスに働かなかったかもしれません。

他に何か良い方法は無いかなと考えたところ、slack のグループがあったらいいのかもと思いました。

Kotlin を始め、メジャーなテーマでは既に slack の公開グループがいくつかありますが、Plugin 開発は無さそうでした。 今後も勉強会やもくもく会でコミュニケーションが円滑になったり、継続して情報交換が出来るようになればいいなと思い、Plugin 開発をテーマとした slack グループを作成しました。

だいぶニッチかもしれませんが、興味ある方は誰でも参加可能ですので、もしよろしければ以下のリンクから参加申請してみてください。

IntelliJ Plugin Developer への参加申請リンク

勉強会 or もくもく会の方も、都合が悪く参加出来なかった方もいらしたので、ぜひまた次回開催できればいいなと思っています。

Rx Ja Night 2016 #1 に参加しました

最高のイベントでした。 RxJavaがメインではありましたが、他のReactiveXでも適用できる内容だったと思います。

主催の @fushiroyamaさん 、発表者のみなさま、会場を提供してくださったVOYAGE GROUPさま、ありがとうございました!!

15分セッション

1. 実際のアプリ開発で使った Rx を紹介 ( bl_lia さん)

2. ReactiveX のドキュメントにある図の見方の解説 ( yanzm さん)

3. RxJava + Vert.x + jOOλ で Microservice 的な何かを作ってみた(業務的に)( chimerast さん)

4. Tapping Retry ( hydrakecat さん)

10分LT

1. Subject 入門 ( fushiroyama さん)

2. iOS の Reactive 系ライブラリ ( wm3 さん)

3. TestSubscriver ( yuyakaido さん)

上記以外で参考になったこと

みんな新しい Operator を試すときにどうやってるのかなーと思ったのを聞いてみたところ、RxJava だと IntelliJ で Java のプロジェクトを作って、その中でミニマムな実装で動きを確認するという話しを聞きました。

他にも RxSwift だと playground で試せるっぽい話も。

まとめ

個人的に今日心に焼き付けたいことTOP3です

  • marble diagram で operator をしっかり理解しよう
  • テスト書こう
  • retryWhen 便利っぽいので使いこなせるようにしよう

DroidKaigi2016にスタッフ&スピーカーとして参加したのでKPTしました

DroidKaigiの運営では、2015のときもそして今回もイベント終了後に全員でKPTによる振り返りを行っています。 それにあやかって、僕個人に対してもKPTをしてみようと思いました。

Keep

  1. 発表のシミュレーションを繰り返し行う
  2. 事前にイベント会場を下見する

1については、今回初めて50分という持ち時間に挑戦しました。これまでは30分が最長だったため、資料を作っていても時間配分のイメージが全く湧きませんでした。細かい内容は今までの経験上、当日ちょっと変わる可能性もあったので、大まかにですが全体を流すように発表のシミュレーションをするようにしました。

シミュレーションをすることで、資料を作っているときには気づけなかった点に気づくことができ、資料にメリハリをつけられるようになったと思います。1つ注意点としては、いろんなところが気になってしまい、何度もシミュレーションと修正を繰り返し、無限に時間が吸われていったことです。

2は、スタッフとしての視点です。一応念のためくらいの軽い気持ちで、2週間ちょっと前くらいに他のスタッフと一緒に会場の下見に行ったのですが、今思うと行っておいて大正解だったなという感じです。

当日朝の集合時間が早かった(朝8時現地集合)のですが、会場までの道のりは経験済みだったため余裕を持って移動できたし、イベント中も会場となる大学内を1人で移動するのも不安はありませんでした。イベント1ヶ月前とかまでは、誘導担当でも無いし下見しなくていいかなと考えていましたが、下見は重要でした。

Problem

  1. スタッフとスピーカーの兼任はリソース配分をよく考える
  2. 備品はケチらない

1はそもそも兼任しないのがいいなという結論なのですが、それでも兼任するならどうすれば良かったのかを書こうと思います。 当たり前と言えば当たり前ですが、イベント日が近づくにつれ、スタッフ業務もどんどん忙しくなっていきます。時には予定外の作業も発生します。そのときに資料作成も佳境に入っていたのでは、睡眠時間を削るしかなくなっていきます。(実際にそうでした。)

ではどうするべきだったか。スタッフ業務の忙しさは自分ではコントロールできないので、資料作成のピークをスタッフ業務のピークと反比例するようなスケジュールを立てるべきだったと思います。今だから言えることで、実際にやるのは大変そうですが...。

2については、僕は今回のDroidKaigiで各会場で使用する電源タップの発注を担当したのですが、全体の約半数を型落ちの安価な品で購入しました。一応販売会社のレビューとかもチェックして、粗悪品を掴まないようにと気にしてはいたのですが、現実には安価な方の2個が初期不良で、別の2個がイベント中に大破するという結果でした。

もう半数の品は1個も壊れることなくイベントを終えたので、まさに「安物買いの銭失い」を地でいってしまうことになってしまいました。必要なものは、きちんと相場と同程度の金額を掛けるのが安心だと思いました。(幸い別のスタッフが1日目終了時に、電源タップを追加購入してくれたおかげでイベントに支障はでませんでした。)

Try

  1. 海外スピーカーの方に質問する

これは本当は今回のDroidKaigiで挑戦したかったのですが、完全に自分自身をコントロールできなくなって資料作成とスタッフ業務で手一杯となって、英語学習が日に日に疎かになったため、実行する勇気が出ませんでした。 ただ今回、スタッフとして海外スピーカーと接する機会があったのに、「Yes」しか言えなかった悔しい体験をしたので次こそは...。

他にもTryな項目を考えたのですが、次回スピーカーをやりたいのかスタッフをやりたいのか、まだ全然決められないので、今の時点としては1つだけにしました。

まとめ

Problemにも書きましたが、もし次のDroidKaigiがあって関わりたいのであれば、スタッフとスピーカーはどちらかにして、今回の教訓を活かしてもっとクオリティの高いアウトプットをしなければいけないなと思いました。

最後になりましたが、素晴らしいスタッフの面々と一緒にDroidKaigi2016に携われたことが、とても嬉しいです。本当にお疲れ様でした!&ありがとうございました!

f:id:androhi:20160219202842j:plain

@mgmix5さんの写真より

0 から Android アプリ開発を学びたい人へ

先日「Androidアプリ開発って、どうやって勉強したらいいですかね?」という質問を受けたので、そのときに話した内容に少し追加して、まとめてみました。

ネット上の情報だと断片的で、体系的な学習に使えそうなものが少ないですし、書籍だと何を買ったらいいか選ぶのも難しく、かつ値段も高いという悩みが多いと思います。そのあたりの敷居を下げつつ、きちんとした内容で学習できそうなものを、独断と偏見でピックアップしました。

続きを読む