「Android アプリのガチ開
発者が Mobile Backend
Starter を使ってみた」
あんざいゆき(@yanzm)
• blog : Y.A.M の雑記帳
• y-anz-m.blogspot.com
• twitter : @yanzm (やんざむ)
• Android女子部副部長
• uPhyca Inc. (株式会社ウフィカ)
あんざいゆき
Mobile Backend Starter とは
Google Cloud Platform を使った
Android 用のバックエンドをサーバー側
のコードを書かずに構築できるサービス
Mobile Backend Starter とは
• サーバ側のコードを書かなくていい
• Google App Engine を使っているのでスケー
ラビリティが高い
• 認証機能が組み込まれている
• Google Cloud Messaging(GCM)機能が組み
込まれている
• 継続クエリ
Mobile Backend Starter とは
• Deploy → App Engine に Mobile Backend がデプロイされる
• http://mobile-**********.[Project ID].appspot.com = 設定
• https://github.com/GoogleCloudPlatform/solutions-
mobile-backend-starter-java
Google Cloud Console
Deploy
設定
Android 用のライブラリ兼サンプルアプリ
デモ
http://bit.ly/13Z09YP
続きは私のブログにて
MBSの使い道
Android アプリ開発者にとっての MBS
• 簡単なのはわかった
• 使い道は?
• Google Cloud Messaging
• データ永続化(?)
• クラッシュログ収集
• センサーデータ収集
Google Cloud Messaging とは
• Android デバイスに push 通知を送れる機能
• GCMと略す
• 小さいデータを送ることができる
• サードパーティのサーバーが必要
Google Play
サーバー
アプリ
device
Google
Play アプリ
サードパーティ
サーバー
push
GCM の使い道
•同期のトリガー(GCM を受取ったら
サーバーに新しいデータを取りに行く)
•チャット・SNS
•お知らせ(配信)機能
•アプリ状態の同期
•位置情報の共有...
データの永続化
• オフライン対応必須 = デバイスの DB にもデータ
保存
• BackupAgent というバックアップ機能が
Android にすでにある
• 同期処理がめんどい(コンフリクトしたら...)
• ゲストブック的なものでオフライン対応を捨てる
ならあり(?)
クラッシュログの収集
• すでにリリーズ済みのアプリに MBS を組み込む
場合に一番ありうる
• Google Play にもクラッシュログ収集の機能があ
るが、ユーザーが送信ボタンを押さないといけな
い
• Google Analytics はクラッシュログは収集してく
れない
センサーデータの収集
• ライフログ的な使い方
• 多くのデバイスからデータを集めるような場合
に向いている
• 定期的にスマホで写真とってアップするなど
アプリ内課金の検証に使えるか?
• サーバーに詳しくない個人アプリ開発者はけっ
こう困ってると思う(セキュリティ対策はコス
パだからね)
• アプリの公開鍵をサーバー側に持たせる必要が
ある = サーバー側のコードをいじらないと無理
• クライアント・サーバー間でセキュアなハンド
シェイクが必要
ゲームに使えるか?
• サーバー側のコードを変えられないので不可能
• ユーザーデータの保持には Google Play
Services のゲーム用機能が利用できる
• ゲーム系は悪意のあるユーザーを考慮しないと
いけないので難しい
MBS の使い道まとめ
•GCMによる通知
•ログ収集
•データ収集
•ユーザー間のデータ共有(位置データな
ど)
MBS の Android
Client Library
Android アプリ用の SDK やライブラリ
を作るときに押さえておきたいこと
サンプルアプリは必要?
•ぜひ作りましょう!
•でもサンプルアプリとライブラリがバン
ドルしているのはよくない
サンプルアプリは必要?
• Android に依存しない部分 → jar
• Android に依存する部分 → Library Project
• http://developer.android.com/tools/
projects/projects-eclipse.html
• サンプルアプリは jar や Library Project を利
用する
ライブラリ作成時の注意点
• bin/ gen/ はリポジトリや zip に入れない
• github が生成してくれる .gitignore には
bin/ gen/ が含まれている
• Build path の設定に注意
• リソース(Library Project)の扱いに注意
• 画面回転に注意(ライブラリでメモリリークと
かつらい!)
Build path の設定に注意
• project のインポート時に endpoint-libs が build path
として認識されないことがある
• project 直下の src 以外にコードがあるとめんどいかも
[Java Build Path] の [Source] にendpoint-libs/
libmobilebackend-v1/mobilebackend/mobilebackend-
v1-generated-source を追加
Library Project とは
• 別のプロジェクトをそのままライブラリとして
利用できる機能
• Library Project とアプリケーションで同じリ
ソースIDのものがあるとどちらかが無視される
ので、ライブラリ側はパッケージ名などで
prefix をつける
• Action Bar Sherlock などが Library Project
形式のライブラリとして有名
Library Project とは
アプリ
library Project
jar Activity
Service
Receiver
res
MBS の Android
Client Library を
改造してみた
サンプルアプリ
Library Project
GCMの register が
うまく動かない...
GCM の register をしないようにしたら動いた
com.google.android.gcm は deprecated
• GCM は Google I/O
2013 で発表された
Google Play
Services に含まれる
ようになった
×
○
public class GCMReceiver extends BroadcastReceiver {
private final static String GCM_KEY_SUBID = "subId";
private final static String GCM_TYPEID_QUERY = "query";
public static String getRegistrationId(Context context) {
GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(context);
String registrationId = null;
try {
registrationId = gcm.register(Consts.PROJECT_NUMBER);
} catch (IOException e) {
e.printStackTrace();
}
return registrationId;
}
@Override
public void onReceive(Context context, Intent intent) {
// decode subId in the message
String subId = intent.getStringExtra(GCM_KEY_SUBID);
Log.i(Consts.TAG, "onMessage: subId: " + subId);
String[] tokens = subId.split(":");
String typeId = tokens[1];
// dispatch message
if (GCM_TYPEID_QUERY.equals(typeId)) {
CloudBackendAsync.handleQueryMessage(tokens[2]);
}
<application
android:allowBackup="false"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
...
<receiver
android:name="com.google.cloud.backend.android.GCMReceiver"
android:exported="true"
android:permission="com.google.android.c2dm.permission.SEND" >
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<action android:name="com.example.mbssample.permission.C2D_MESSAGE" />
<category android:name="com.example.mbssample" />
</intent-filter>
</receiver>
</application>
GCM 動いた (*´ω`*)
まとめ
• サーバー側を書かずに GCM 使えるのは便利
• 1分しないくらいで push が来る(10秒とか速
い)
• 認証機能が組み込まれているのもありがたい
MBS へのお願い
• 簡単に GAE に移行したい = サーバー側のコード
も少しいじりたい
• 画像アップロードのサンプルがほしい
• Android 2.x でも使いたいなー(今は API Level
16以上)
• ぜひ Library Project にしてください
• Google Play Services の GCM 使ってね
その他
• API とか GAE コンソールとか API Key とかが全
部 Google Cloud Console から行けるようにまと
まったのはとてもいい
• developers.google.com/cloud/ 以下のコンテン
ツが Google Cloud Console に対応してないのが
残念!Google の人がんばって!
ありがとうございました

「Android アプリのガチ開 発者が Mobile Backend Starter を使ってみた」