2013年5月24日金曜日

Google I/O 2013 - Android : Getting Discovered on Google Play

# Google Play の検索(発見)エンジンの話
# いままでにこれに関する話をしたことがなかった!
  • なんとなく Google Play を開いてブラウジングしてよさそうだなと思ったアプリをインストールしたことは?
  • なにか目的(レシピとか)があってそれのためのアプリを探してインストールしたことは?
  • 友達に勧められてインストールしたことは?


このセッションのゴールは「我々がどのようにこれらのオンラインとオフラインの思考プロセスをインストールアプリにつなげようとしているのか、どのように Play 上で見つけられるようにしようとしているのか」について話すこと

1. 新しい Google Play Store のビジョン
2. 検索と発見のアルゴリズムの詳細
3. Play でより見つけてもらうためにできる 5つの具体的な手法の例

数週間前に新しい Google Play Store をリリースした
Personalized, yet personal.

Personalized : 過去にユーザーが教えたこと(何を購入したかなど)に基づいている
何が個人に関連していることなのか?
・ユーザーの領域で有名だから関連している
・特定のカテゴリや開発者に興味を示したから関連している
・友達がそれに興味を示したから関連している

さらに次のレベルに行くために
これらのオススメ毎、コンテンツ毎に、なぜそれを勧めるのか注釈をつけるようにした
・友達が +1 したから
・友達がレビューしたから
・新しい Google Play game services に基づくものもある


Google Play のゴールとして
1. ユーザーが探しているものを簡単にシームレスに見つけられる手助けをする
2. Android により美しいアプリを送る手助けをする
3. 開発者がプラットフォームでよりビジネスできるように手助けする



Major Install Sources

1つめは Browse & Discovery

トップリストやトレンドリストのランキングの順位など
ここには我々が browsing discovery features と呼んでいるものがある
これはさらに3つのサブコンポーネントに分けられる

・Charts
editor's pick やトレンドリストなどの結果

・Personalized Recommendations
去年の Google I/O でローンチしたもの

・Related / Cross-Sell
ユーザーのコンテキストに基づいたもの
アプリの詳細画面で
- このアプリを見たユーザーは、こちらのアプリも見ている
- このアプリをインストールしたユーザーは、こちらのアプリもインストールしている
が表示される

2つめは Search
これは Categorical と Navigational に分けられる

検索の目的は2つある
Categorical
・あるタスクのためのアプリを探している(レシピとか、レストランのレビューとか、マルチプレイヤーゲームとか)
Navigational
・特定のアプリを探してる(友達に勧められたとか、広告でみたとか)

・12% のユーザーが毎日アプリを探している
・50% のユーザーが毎週アプリを探している
・月に検索されるユニークフレーズは 6M+



ビジョンのまとめ
・"Personalized Play made Personal"
・Search & Browse are main install sources
・Bringing to Google Play



Focus on the Good

悪いアプリやスパムアプリを検出することに多くの時間をかけてきた
もちろん、いいアプリを見つけ出すことにも多くの時間をかけてきた

いいアプリにフォーカスすることにより多くの時間を割いてきた
アプリの APK やメタデータ、ユーザーが何といっているかに基づいていいアプリをプロモートできる

いいメタデータで、どのようにアプリを褒めることができるのか

"アプリのもっとも重要なメタデータのピースはタイトル"
Short & Clear Title
(独自性&創造性を奨励)

創造性は重要だが、わかりやすさよりは重要ではない

例)
Beautylish: Makeup Beauty Tips
Makeup に関連するアプリということがわかる

タイトルに短いアプリの呼び名 + 短い解説があるとよい
SEO にも役立つ

次に重要なメタデータは詳細(description)
Functional & Vivid Desciption
・メインのメッセージを最初に!
・ユーザーになったつもりで

例)
Star Chart というプラネタリウムアプリ

”このアプリはなんなのか” を最初に書く!
phone では詳細の下のほうは折り畳まれていてみえない
最初の画面で ”このアプリはなんなのか” が見えていることをチェックする
SEO 的にも詳細の最初の方は超重要


アプリの詳細ページをどのように利用できるか
実際のユーザー体験を模倣する
ユーザーの期待を設定することが重要

1. スクリーンショット
(ユーザーは実際にこれをチェックしている!)
developer console でタブレット用、フォーン用のスクリーンショットをアップロードできる

実際のユーザー体験とスクリーンショットがすごい異なると、それはネガティブな効果になる
ユーザーはアプリをアンインストールしたり、低い評価をつけたり、ネガティブなレビューを書いたりする

2. Video previews
(ダークホースだよ)
スクリーンショットの次のレベル

例)
AutoRap というアプリ

3. Reviews & Rating

レビューや評価の順番をユーザーに関連できるように試している
同じデバイス、同じ国、同じ時間帯、サークルに追加している人、ユーザーが信頼している人、が上のほうに来るようになっている
ユーザーがレビューや評価をしつづけることは Google Play に対してすごく強いシグナルになる

インドのデベロッパーの話
彼はインドの貧弱なデバイススペック、ネットワーク通信に最適化したアプリをだした
そうすると、彼のターゲットとする人からはポジティブなレビューが付いた(星5)。その一方で 4G ネットワークがあるような環境のユーザーからはネガティブなレビューが付いた(星1)。最終的に彼はデベロッパーコンソールでターゲットとする国・キャリアを制限した。それ以降、評価の平均は上昇しだした。

つまり、”誰がターゲットとしているユーザーなのか” を考える
もしアプリが特定のユーザーをターゲットとしているなら、ターゲット外の人によってレビューが汚染されないようにする


Good App Metadata: Summary

・Creative Yet Clear Message(Title & Description)
・Mimic Real Experience(Screenshots & Video Preview)
・Know Your Audience



Discovery Features in the Store

Search and Discovery エンジンは statistics の情報は利用しない

もちろん、どのくらいインストールされているかは気にかけている
よりインストールされていれば、ランキングの上にいく

アンインストール数も気にかけている

容量の大きいゲームアプリなどで、ユーザーがクリアしたあとにアンインストールするのはどう扱うの?
そこで3つ目の統計、long installs を使う
アンインストールされるまでの時間が長い場合はペナルティにしない


最近フォーカスしていることは engagement
いつ使っているのか、どのように使っているのか
ことなる種類のアプリではなにがどのように異なるのか
例えば、Google Now は長時間使うわけではないが、ゲームでは1時間使うこともある
どっちがよくてどっちが悪いということにはならない

これについて開発者のフィードバックが欲しい


開発者からよくある質問
「この検索ワードで、私のアプリは3番目だけど、それより上にあるアプリは私のアプリよりインストール数も少ないし評価も低いよ。どうして?」

前のスライドで言及したけどアンインストール率を見ています
全インストール数に対する全アンインストール数だけでなく、最近のアンインストール率も見ています

何年もアップデートしていないアプリがあるとすると、インストール数よりもアンインストール数が多くなります
アップデートして、ユーザーがアプリを入れ続ける様にしてください



ユーザーがこれまでに行ったことを Feedback している(多くの Google Product で行われているが Google Play も例外ではない)
例えば、US で "Yahoo" と検索した場合、多くのユーザーは Yahoo アプリか Yahoo Mail アプリ をインストールする。一方、日本で検索した場合、多くのユーザーは Yahoo Japan アプリをインストールする。我々のシステムはこれをなんども学ぶことで、日本では Yahoo Japan アプリを一番目に、Yahoo アプリや Yahoo Mail アプリは2番目に表示するようになる。


同様にタブレットではモバイルデバイスのときとは異なるアプリをインストールする
我々は、デバイスタイプ、ロケール、などなどいろいろな要素を利用している

1年前に検索候補の表示に加えて、navigational search 候補も出すようになった


よくある質問で
「どのようにトップリストが生成されているのか?」
「トップリストに関連する項目は何なのか?」
がある

search or discovery system とは違って、常に我々のシステムをチューニングしている

↓ どう見えるかのスナップショット

基本的なクオリティバリアがある
レビューや評価などの考慮する指標もあるが、よりハイレベルではトップリストを国ごと、カテゴリーごと、デバイスタイプごとに作る


top paid と top free、top grossing list は Google Play の frist-time user、もしくは新しいデバイスを取得したユーザーにターゲティングしてる
彼らはベーシックなアプリを必要としているので、Google Play で最も人気のあるアプリはなにか?が必要

top new paid と top new list はすでにベーシックなアプリを持っているユーザーをターゲティングしている
最近の30日間にリリースされたアプリを対象としている
これはグローバルに配信された日に基づくので、あとから新しい国で配信をはじめてもそこの top new paid や top new list には入らない


Trending
Trending というカテゴリページがある

・内部では Movers & Shakers list と呼んでいる
・我々の予測よりも速く成長しているアプリをハイライトする
・30 day moving window
・今 hot なものがなんなのかをユーザーに伝える
・Google Play の全てのアプリが対象
・全てのアプリには我々の予測成長率がある
・予測成長率はアプリがライフサイクルのどこにいて、どれだけインストールされているかを考慮する
・サッカーのワールドカップのときには FIFA のアプリが Trending にいたし、東日本大震災のときには関連のアプリが Trending にいた

Related / Cross Sell

インストールされているアプリに似たアプリを勧める

Personalized Recommendations

パーソナライズされたおすすめ
友人が +1 しているものが出るなど

personalizing search
電車のスケジュールで検索したときに、NYC に住んでる人と SF に住んでる人は求めているものが違う

Discovery Features: Summary

・Search Statistics (The Feedback loop)
・Navigation Search Suggest
・Top Charts (Paid, Grossing, Free)
・Trending Apps
・Related / Cross Sell
・Personalizing Play(Recommendations, Search, All Lists)



5 Things You Can Do

これをやる前にまずは "すばらしいアプリを作ること"

1. "Designed for Tablets"

タブレットに対応する

2. Ensure helpful Web Anchors

サプリ用のサイトを用意する
レビューサイトに記事を書いてもらう
よく知られていないが、アプリのランキングをあげる有効な方法

3. Avoid Common Mistakes

・有名なアプリとちょっとだけ違う名前を選ばない
月あたりの 6M+ のユニークフレーズ検索の 50% はミススペリング、でもほとんどのユーザーは求めていたものにたどり着けている
autocorrect で有名なアプリに直されたら、自分のアプリのところにはこれない

・国とキャリアの制限

・デベロッパーの URL があるなら、それを設定する(わりと重要)

4. APK を小さくする

・小さい APK はよりインストールされている
・小さい APK はよりアンインストールされていない
・コアコードと SDK コードのパーセンテージ
・リンクしているライブラリ

5. アプリの Viral Loop を作る

・ソーシャルレビュー
・アプリ内からの友人の +1s
Google+ recommendations API page を使うとアプリ内からアプリに +1 できる
# ドキュメントは https://developers.google.com/+/mobile/android/recommend
# 「What's new in Google Play Services」の最後で紹介されていた +1 ボタンを表示できる機能を使うっぽい
# 自分のアプリの Google Play Store の URL で PlusOneButton を使う

数ヶ月以内にアプリ内評価、アプリ内レビューもできるようにする

・Social Leaderboards, Multiplayer, etc Google Play game services


5 Things You Can Do: Summary

・Designed for Tablets
・Helpful Web Anchors
・Avoid Common Mistakes
・Smaller APK
・Promote Reviews & Ratings
・+1 from Within App
・Play Games Services


User Acquisition(ユーザーの獲得)
・Organic
・Viral
・Paid


Paid ユーザーの獲得は organic と viral にいいインパクトを与える


Lifetime Value
・User Acquisition
・User Retention
・User Monetization

User Retention
1. short-term user retention ratio
そのようにユーザーをキープするのか
なにをユーザーと約束するか

2. long-term user retention ratio
Scramble というアプリの例
ワードゲームだったので、最初は多くのユーザーを獲得した
時間が経つにつれてよりソーシャルな方向に成長した

User Monetization
インストールに対するレベニュー
Active User に対するレベニュー



2013年5月23日木曜日

Google I/O 2013 - Android : Android Graphics Performance

1. Architecture

将来の変更の話

reordering & merging

■ reordering

GPU の性能をより引き出すために、描画の順番を変える
Checkbox → Checkbox → Button → Text → Button → Text

Checkbox の画像 → Checkbox の画像 → Button → Button → Checkbox のテキスト → Checkbox のテキスト → Text → Text

GPU のステータスを変えなくていいので効果的


■ merging

Checkbox の画像 → Checkbox の画像 → Button → Button → Checkbox のテキスト → Checkbox のテキスト → Text → Text

Checkbox の画像 x2 → Button x2 → Text x4

# draw call が 88 から 38 に減ったサンプルを実際にデモ


Multi-threading

マルチコアの性能を引き出すため

例えば4コアあるとすると、描画時に shadows を4コアで描画した後、何個かのコアで Path を描画するなど

non-rectangular clipping

今までは hardware accelerated pipeline でサポートされていなかった 3D rotation でフリップさせたとき、レイヤーを使わないでアニメーションを走らせると、現状の Android(4.1 とか 4.2)では clipping breaks が起こる 回転させたときの rect はもはや四角にならないはずだから



2. Developer Tools

"Show GPU overdraw" オプション(Developer options)

何回描画されたかに応じてオーバーレイされる色が変わる
1x Blue
2x Green
3x Red
4x Deep Red


"Profile GPU rendering"(Developer options) オプション

時間毎のフレームレートを表示するオプション

ADB を介してデータをダンプしてチャートを作る機能はあったが、画面上に直接チャートを表示できるようになった
緑の横線は 60FPS を表していて、常にこれを超えないようにするべき


Systrace

次のアップデートでは systrace の使い方がより簡単になる

$ cd sdk/platform-tools
$ ./systrace.py gfx view freq sched

"Enable OpenGL traces" の systrace


android.os.Trace

新しい API import android.os.Trace; @Override public View getView(int pos, View view, ViewGroup parent) { Trace.beginSection("getView"); if(view == null) { view = createView(); } // Trace time spent binding dta Trace.beginSection("bind"); bindView(pos, view); Trace.endSection(); Trace.endSection(); return view; } この新しい API を使うときは -a オプションで systrace を使う

$ cd sdk/platform-tools
$ ./systrace.py -a com.example.myapp

アプリのどこが遅くなっているのか調べるのにいい



3. Tips and Tricks

"Show GPU overdraw" オプションを使ったデモ

ListView の android:background で指定していた背景色をテーマの android:windowBackground に移したら Deep red が blue になった


9patch のコンテンツエリアの透明化

コンテンツによって完全に隠されるエリアを透明にしてしまう


MIP mapping

コードから MIP map を有効にする private void loadData() { // Load bitmap Bitmap b = getBitmap(); // Enable trilinear filtering b.setHasMipMap(true); } XML で MIP map を有効にする <bitmap android:mipMap="true" android:src="@drawable/my_drawable" />


Canvas Layers

Clip layer @Override protected void onDraw(Canvas canvas) { //Create a clipped layer canvas.save(); canvas.saveLayer(x, y, width, height, Canvas.CLIP_TO_LAYER_SAVE_FLAG); // Draw stuff canvas.drawBitmap(bugDroid, 0.0f, 0.0f, null); canvas.restore(); } Canvas.CLIP_TO_LAYER_DAVE_FLAG を付けないとパフォーマンスにすごい悪いので気をつける


Using alpha with case

View に alpha を設定する方法はいくつかあるが、これらはいずれも canvas.saveLayerAlpha(l, t, r, b, 127, Canvas.CLIP_TO_LAYER_SAVE_FLAG); をしていることになる

View 上のコンテンツを透明にしたいのか、View 自身を透明にしたいのか(View の後ろにあるものが見えてほしいのか)はっきりさせる

・TextView

TextView 上のコンテンツを透明にしたいだけの場合は View の setAlpha() を使うのではなく int newTextColor = (int) (0xFF * alpha) << 24 | baseTextColor & 0xFFFFFF; textView.setTextColor(newTextColor); にする

・ImageView

ImageView 上のコンテンツを透明にしたいだけの場合は View の setAlpha() を使うのではなく imageView.setImageAlpha((int) (alpha * 255)); にする(setImageAlpha は Jelly Bean で追加された API)

・CustomView

CustomView 上のコンテンツを透明にしたいだけの場合は View の setAlpha() を使うのではなく int alpha = (int) (255 * slider.getProgress() / 100.0f); paint.setAlpha(alpha); canvas.draw*(..., paint); にする

・レイヤーを使う(特にアニメーション) view.setLayerType(View.LAYER_TYPE_HARDWARE, null); // Transient layer view.animate().alpha(0).withLayer(); ・その他の関連すること // API level 16+ @Override public boolean hasOverlappingRendering() { // Don't lie to us! return false; }


Canvas の注意点

canvas の getWidth() と getHeight() は hardware rendering と software rendering で異なる
with Hardware rendering : View のサイズ
with Software rendering : Window のサイズ

canvas のサイズを View のサイズとして使ってはいけない!


Clipping の注意点 @Override protected void onDraw(Canvas canvas) { // Keep the jellybeans canvas.clipRect(l, t, r, b); // Rotate the jar canvas.rotate(-30.0f, pX, pY); // Draw the jar canvas.drawBitmap(mJellyBeans, x, y, null); } 命令の順番に注意する
ここでは最初にクリップしてから回転している
これだと最終的なクリップエリアは四角になっている
もし、回転してからクリップすると、最終的なクリップエリアはダイアモンド型になるのでパフォーマンスによくない


clip bounds の注意点

getClipBounds の Rect は hardware rendering と software rendering で異なる
with Hardware rendering : View の bounds
with Software rendering : invalidate の dirty rect の bounds



Google I/O - Android : What's New in Google Play Services


What is "Google Play Services

Google services と Play services 向けの API を Android デバイスの1ヶ所にまとめた単一のライブラリー
Android 2.2 以上に対応している(= デバイスのサポートについて心配しなくていいよってこと)

・主な機能
  • Maps(Location)、(以前からある MapsFragment V2 も含まれる)
  • Google Play games
  • Google Cloud Messaging
  • Google Wallet instant buy
  • Google+ sign-in
  • OAuth2(Google Play Services がライブラリを介して Google services へのアクセスを取得するための単一の認証 API を提供すし、ユーザーは一貫性のある方法で OAuth access token を受信できる)
Google Play Services は Google エコシステムのためのプラットフォームのコア部分であるため、常に最新の状態にしておく必要がある
バグ修正やアップデートを、 Android フレームワークやキャリアのリリーススケジュールの外で行う必要がある。
そのため Play Store を通じてアップデートされる


・なぜ Android 2.2 以上なのか?

Android 2.2 以上は、Play Store にアクセスする有効な Android ユーザー全体の 98.2% に達しており、さらに Froyo ではマスストレージにアプリケーションをインストールするような便利な API が追加されていて、Google Play Services を使うほとんどのアプリケーションが利用する API があるから。


・なぜ Google Play Services と Android support library の2つにわけたのか?

Google Play Services は Play エコシステムをサポートし、開発者が(そのエコシステムの) API を使えるようにしている
Android support library は Android エコシステム向けのオープンソースのラリブラリー


What's New?

・Location based services

■ Fused Location Provider
(いままでは MapFragment V2 があった)
  • Google Play Services で位置を取得できるようになった
  • ここで提供した理由は、今までより賢くやる能力があるから
  • Fused Location Provider というめんどうなことを全部やってくれる新しいプロバイダーが増えた
  • 今までの方法で位置検出をやったことがある開発者なら、常に効果的な方法でベストな位置を取得するのはかなり面倒であることを知ってると思う。ベストプラクティスを実現するにはかなりの量のコードを書かないといけない
この面倒なことをすべて Fused Location Provider の後ろに入れこんだので、これが全部やってくれる。どのプロバイダーが有効か、どれがオンでどれがオフになっていて、どのプロバイダーが最適な結果を提供しているのかを、特定の時間に検出してくれる。

使うのもすごく簡単。ほとんどの Google Play Services のクライアントと同じく、インスタンスを作り、connect を呼び、非同期で servic やアプリケーションを Google Play Services の service とバインドする。
一度こうすれば、今までの古い location-based services client と同じ方法で Location client を扱えるようになる。 private void connectLBS() { int gpsExists = GooglePlaySErvicesUtil.isGooglePlayServicesAvailable(This); if (gpsExists == ConnectionResult.SUCCESS) { mLocationClient = new LocationClient(this, this, this); mLocationClient.connect(); } } @Override public void onConnected(Bundle connectionHint) { requestUpdates(mlocationClient); } LocationRequest request = LocationRequest.create(); request.setInterval(minTime); request.setPriority(lowPowerMoreImportantThanAccuracy ? LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY : LocationRequest.PRIORITY_HIGH_ACCURACY); mLocationClient.requestLocationUpdates(request, new LocationListener() { @Override public void onLocationChanged(Location location) { updateLocation(location); } } ただの interval 以外に minimum interval や maximum interval もセットできる

Google Play Services の一部として常にロジックをアップデートできるので、アプリ側の修正をしなくてもより正確でより効果的な手法が各リリースで届けられる。


■ Geofenceing API
  • 以前の proximity alerts のようなものと予測できるが、これは実際にちゃんと使える
  • 各アプリケーションの geofences を全て常にトラックし、それぞれの geofences の境界からどのくらい離れているかに応じて、どのプロバイダーが使われるべきかを判断する
位置と半径で簡単に geofence の境界を作成できる List<Geofence> fenceList = new ArrayList<Geofence>(); // TODO Repeat for all Geofences Geofence geofence = new Geofence.Builder() .setRequestId(mKey) .setTransitionTypes(Geofence.GEOFENCE_TRANSITION_ENTER | Geofence.GEOFENCE_TRANSITION_EXIT) .setCircularRegion(latitude, longitude, GEOFENCE_RADIUS) .setExpirationDuration(Geofence.NEVER_EXPIRE) .build(); fenceList.add(geofence); mLocationClient.addGeofences(fenceList, pendingIntent, addGeofenceResultListener); これらは中心の Fused Location Provider で処理される。GPS を使うべきなのか Cell ID なのかはそれが全部やってくれる。


■ Activity recognition
  • ユーザーがどこにいるかだけではなく、ユーザーが何をしているか(どういう身体活動をしているか)もわかるようになった
  • 単に立っているのか、走っているのか、自転車に乗っているのか、車に乗っているのか
  • まったく新しいカテゴリのアプリを作ってもいいし、フィットネスアプリでユーザーに現在の活動を手動で選んでもらう代わりにも使える
活動のアップデートをリクエストして、インターバルをセットするだけ Intent intent = new Intent(this, ActivityRecognitionIntentService.class); intent.setAction(MyActivity.ACTION_STRING); PendingIntent pi = PendingIntent.getService(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); mActivityRecognitionClient.requestActivityUpdates(interval, pi); @Override protected void onHandleIntent(Intent intent) { if(intent.getAction() == MyActivity.ACTION_STRING) { if(ActivityRecognitionResult.hasResult(intent)) { ActivityRecognitionResult result = ActivityRecognitionResult.extractResult(intent); DetectedActivity detectedActivity = result.getMostProbableActivity(); int activityType = detectedActivity.getType(); if (activityType == DetectedActivity.STILL) setUpdateSpeed(PAUSED); else if (activityType == DetectedActivity.IN_VEHICLE) setUpdateSpeed(FASTER); else setUpdateSpeed(REGULAR); } } } 身体活動に応じて異なるユーザー体験を提供することができる

例えば、近くの情報を表示する場合、立っているだけの状態ならアップデートを一時停止し、車のなかにいるならユーザーがいいレストランを見つけられるようにできるだけ早くアップデートする

例えば、スポーツスコアやニュースなら、立っているときにもっとも頻繁にアップデートし、自転車に乗っているなら電話はポケットにあるはずだからアップデートを行わない


これは全く新しい API なので大きなチャンスがある
ユーザーによりより体験、より効果的な体験を作るために、どのようにこの新しいセンサー情報を使えばいいのか考えて


より詳しくは Beyond the Blue Dot: New Features in Android Location

(↑のセッションがこのセッションの1つ前の時間帯だったので、「Android と Google Play Services に time travel API を作っていたらその時間に戻ってみることができるよ!でも残念ながらまだできない。。。」「あれ、まだリリースしてなかったけ?」「してないよ」「そんな遠くないよ。 11:15 だよ(このセッションは 12:45 から)」「えと、、、あとで話そう」「秘密だったね」「そうだよー。だから YouTube でチェックしてね」というやりとりがあるw)



・Google Play games
  • Achievements
  • Leaderboards
  • Cloud Save
  • Real-time Multiplayer invitations
新しい Developer console で左上の play games ロゴのタブを選択する。そうすると Leaderboard や Achievements を追加するところがある

■ Achievements

実際のゲーム内で、achievements のデフォルトの look and feel を提供する
achievements の小さいダイアログが表示され、全ての achievement 画面でもみることができる


■ Leaderboards

Leaderboards もデフォルトの look and feel を提供する


■ Cloud Save

4つの 128K のデータブロック(chunk)を持つことができ、ここにアプリケーション用のユーザーデータを保存できる
1つの chunk はアバター、別の chunk はプロフィール情報、ゲームの進捗情報、などをいれて同期する
Could Save は conflict resolution strategies (chunk のデータが衝突したときにどう解決するか)がある

より詳しくは New Developments in Mobile Gaming

これらの機能は Google+ によって支えられているので、Google+ sign-in をアプリに組み込むと、これらの play services の機能にアクセスできる。

より詳しくは Advanced Game Development Topics



・Google Cloud Messaging

すでに API になっていたが、Google Play Services の中にいれた

GCM はサーバーからクランとにアップデートしたいときに通知する

昔のよくない方法では定期的なアラームをセットしていた
この方法では、デバイスを起こし、無線を起こし、サーバーに「なんか、ダウンロードするものある?」と聞くために ping していたが、ほとんどの場合の答えは「なにもないよ」だった
もし答えが「あるよ」だったとしても「あるよ、でも2時間前なら役に立ったけどね」みたいなことがあった

GCM なら必要なときにクライアントに通知でき、通信量も電池の消費量も減らせる

新しい API では、永続的な XMPP 接続を開発者のサーバーと GCM サーバーに間に作ることができる。これにより、この接続を使ってデバイスから開発者のサーバーにメッセージを送れるようになった。low latency で high reliability な connection でデータを送れる

この機能を使って、アプリが動いているデバイスから、同じアプリが動いている別のデバイスにメッセージを送ることができる。キーノートの notification のデモのように複数のデバイスで同期させることができる

Upstream の実装はすごく簡単 GoogleCloudMessaging gcm = GoogleCloudMessaging.get(context); gcm.send(to, msgId, data); 直接サーバーとやりとりしたときは projectID を指定し、他のデバイスに転送してほしいときは notification ID を指定する


サーバー側についてより詳しくは Google Cloud Messaging


・Google Wallet instant buy
  • 制限があり、利用するにはホワイトリストユーザーになる必要がある
  • 現在は US only (らしい)
  • デバイスの Gmail アカウントとデバイス内の Google Wallet を使って、物理的な商品を Android アプリ内で売ることができる
  • 商品の販売を始めると、その情報がアップロードされ、アプリ内に instant buy での Google Wallet ボタンが表示される。それをタップするだけでクレジットカードの詳細やログインなしで購入できる
  • 購入のフローは簡単で、購入された商品の金額はデバイスの Google Wallet を通じてチャージされ、一緒に提供される住所に商品を送ればいい
より詳しくは Selling physical goods on Android with Google Wallet Instant Buy





どうやって使うの?

・Android 側

SDK manager で Google Play services をインストールし、extras 内の play services library をワークスペースにコピーする

詳しくは http://developer.android.com/google/play-services/setup.html

Panaorama というサンプルアプリがある


・API 側

Google API Console https://code.google.com/apis/console に行って、必要な API をオンにし、API key (アプリ内にコピペして使う)を取得する

API key は特定の証明書とパッケージ名にリンクしているので、そのアプリでしか使えない



Auth

Auth は紛らわしい。Authentication? Authorization?

Authentication : その人がだれかを認証する(デバイス内の Google アカウントは authenticated)
Authorization : その人のためにサービスへのアクセスを取得する

Google Play services は authenticated account(認証されたアカウント)に対する標準化された authorization を提供する
Google Play services ないのプロダクトだけでなく、Web の Google APIs に対しても使える

以前は、Google API 用の authorization token を取得するフローはそこそこ面倒だった。web view など他のものを利用しないといけなかったので、そのためのいいライブラリもいくつか書かれた
Google Play services でより簡単にトークンをとれるようになった

1. アカウントを選択する startActivityForResult( AccountPicker.newChooseAccountIntent(null, null, new String[] { GoogleAuthUtil.GOOGLE_ACCOUNT_TYPE}, true, "Can haz token plz?", null, null, null), REQUEST_PICK_ACCOUNT);

2. Preflight Check @Override protected void onResume() { super.onResume(); int canPlay = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this); }

3. アクセストークンを取得 mToken = GoogleAuthUtil.getToken(this, "foo@gmail.com", "oauth2:" + Scopes.PLUS_PROFILE + "," + YouTubeScopes.YOUTUBE_READONLY); ダイアログが表示される

4. データにアクセスする URL url = new URL("https://www.googleapis.com/oauth2/v1/userinfo?access_token=" + token); HttpURLConnection con = (HttpURLConnection) url.openConnection(); int serverCode = con.getResponseCode(); if(serverCode == 200) { ... } else { // check error, code do something else return; }


Adding a +1 button <com.google.android.gms.plu.PlusOneButton android:id="@+id/plus_button" android:layout_width="wrap_content" android:layout_width="wrap_content" plus:annotation="inline" plus:size="standard" /> button.initialize(mPlusClient, "http//...", null); とある URL に +1 できるボタン


Google Play services はどうテストしたらいいの?

「デバイスを買いたまえ!2.2以上のやつを...」
「いやいや、みんがテスト用のデバイスを買うかどうかわらないじゃないか、もっといい方法ないの?」
「実はあるよ。。。Google Play services emulator をリリースしたよ!」

Google APIs emulator をベースにしている
Play services のメジャーリリースごとにアップデートする予定



QA

Q. x86 イメージの play services エミュレータはありますか? ARM だけ?
A. まだローンチしてないと思う。ARM のしか見たことないよ。。。(他の人にきいている)ないって。tools チームのエミュレータの人と話すといいと思うよ

Q. WebView を Google Play services でリリースする計画はありますか?異なるバージョンの OS に渡って update できるように
A. いい質問ですね。現状でこの点で行ったものはないし、将来の計画もわからないです。

Q. Google Play services のアップグレードの頻度はどのくらいですか?
A. すごく早いよ、毎週かな。

Q. Google play games をゲーム以外のアプリに使ってもいいのですか? FourSquare のバッチのようなのを考えています。 A. もちろん。Cloud Save のような機能はゲーム以外のものにも適しています。achievements もゲーム以外でも有効だと思います。 ゲームカテゴリーじゃないといけないなどの制限はないです。

Q. geofence の制限(100個まで)はアプリ毎ですか?ユーザーが毎ですか? A. アプリケーションあたり100個です。

Q. Google Play services のアップデートが(なにかの原因で)行われなかった場合、アプリはどうバージョンコントロールすればいいですか? A. Google Play services はそれを利用しているアプリが起動するたびに update があるかどうかチェックします。

Q. Cloud Save の容量制限を超えることはできますか?
A. Google Drive API 使ってください。

Q. Geofence はクラウドに保存されますか?デバイスに保存されますか?
A. デバイスに保存されます。毎回クラウドに聞きにいくと通信を圧迫するからです。

Q. Could Save はいつクリアされますか?マニュアルですか? A. いい質問ですね。マニュアルだったと思います。https://developers.android.com/games をみてください。