Google for Mobile  - Android アプリ実装について


12/9 パシフィコ横浜で開催された Google for Mobile のセッションからいくつかまとめと補完した。


## マテリアル デザインでよりよいユーザー体験を実現しよう
なぜマテリアルデザインしたのかとその内容の話
すでにいろいろなところにまとめれれてる

* [Design | Android Developers](https://developer.android.com/intl/ja/design/index.html)
* [Material Design Awards - Articles - Google Design](https://design.google.com/articles/material-design-awards/)
* [Material Design with the Android Design Support Library](http://www.sitepoint.com/material-design-android-design-support-library/)
* [Android Design Support Library | Android Developers Blog](http://android-developers.blogspot.co.ke/2015/05/android-design-support-library.html)



##高品質 Android アプリ実装ヒント集 〜 ゴミアプリと言わせないために 〜

###ユーザー評価
[Essentials for a Successful App](http://developer.android.com/intl/ja/distribute/essentials/index.html) で記載されている内容には、ユーザーからのリアルなクレームを元にも作成されている。
[2015 年ベストアプリ - Google Play](https://play.google.com/store/info/topic?id=bestof2015_apps) は、評価が高く、品質が高く、Android標準に沿った使いやすいUIのアプリが選ばれている。

* 推奨ガイドライン
	* [Design from iOS to Android (and Back Again)](https://design.google.com/articles/design-from-ios-to-android/)
	* [The Secrets to App Success on Google Play (Second Edition)](https://play.google.com/store/books/details/Google_Inc_The_Secrets_to_App_Success_on_Google_Pl?id=O2a5CgAAQBAJ)
	* [Mobile App UX Principles: Improving User Experience and Optimising Conversion](https://www.thinkwithgoogle.com/intl/en-gb/article/mobile-app-ux-principles-improving-user-experience-and-optimising-conversion/)


*ユーザーからの評価を読むことは非常に大事である。*

* アプリである意味が無い
	* WebViewだけのアプリ
	* ブラウザを開くだけのアプリ
	* モバイルWebでこと足りる？
		* プログレッシブウェブアプリが進化するとアプリ化する必要性が低くなる?
			* [Cache API for Service Worker](https://www.chromestatus.com/feature/6461631328419840) でオフライン時の操作が可能になる。
			* [Push API](https://www.chromestatus.com/feature/5416033485586432)で、ネイティブアプリと同等にPush通知が可能になる。 ＊Facebook API が対応
			* [Background Sync API](https://www.chromestatus.com/feature/6170807885627392) で、ブラウザを閉じている時に通信が可能になる。
			* これらは、最新のWeb技術 [Service Worker](https://www.chromestatus.com/feature/6561526227927040) で実現されているらしい。
			* (参考) [Progressive web apps reading list](https://gist.github.com/nolanlawson/d9e66349635452a95bb1)
* 動作が遅い/重い
	* Activity / Fragment の画面遷移が遅い
		* 事前にデータのダウンロード Sync Apapter / Intent Service / GCM etc.
		* Viewの階層を減らす
		* onStart/onStopでリソースの確保と開放
	* 画像等のサイズを最適化
	* 画像キャッシュ
	* RecyclerView+Adapterの活用
	* UIスレッドは軽く
	* タッチ操作時の視覚的フィードバック
		* ボタンの押した感
		* プログレスの表示
		* リップル効果
	* チューニングツール
		* デバイスの開発者向けオプションの厳格モードを有効にして、UIスレッドの処理が長引いて画面が点滅しないか確認する。
		* [Profiling with Traceview and dmtracedump](http://developer.android.com/intl/ja/tools/debugging/debugging-tracing.html)
			* 実行時間の計測
			* プロファイリング
		* [Analyzing UI Performance with Systrace](http://developer.android.com/intl/ja/tools/debugging/systrace.html)
		* [Optimizing Your UI](http://developer.android.com/intl/ja/tools/debugging/debugging-ui.html)
* RAMの消費が激しい / いつも居座っている
	* onStopでリソースの開放
	* 無駄に常駐しないService / IntentService
	* onTrimMemory / onLowMemory の活用
	* SparseArray の使用
	* 定数は enum より static final
	* Runtime Injection は避ける (Guice等)
	* ビットマップの管理
		* LruCacheでキャッシュ化
		* RecyclerView+Adapter
		* Glide library を利用する
* 電池の消費が激しい
	* batterystats /Battery Historian で計測
	* JobScheduler APIで、充電中のみ、Wi-Fi接続時のみにジョブを実行するコントロールが可能 (Android 5.0+)
* 新しい機種/OSバージョンに非対応
	* 検証デバイス選定の指針
		* バージョン
		* RAM容量
		* GPUファミリー
		* チップセットファミリー ArmとAtomなど
* サーバーの設備が追いついていない
	* Google Play のアルファ/データテスト機能を活用して、キャパシティテストを行う。
		* クローズドベータ
		* オープンベータ 機能が追加された
	* Google Cloud Platform のコンテナ技術の活用してスケールアウトしやすくする。
* 位置情報の取得処理
	* Fused Location Provider を使う
	* Fine Location と Coarse Location の使い分け
	* [Making Your App Location-Aware](http://developer.android.com/intl/ja/training/location/index.html)
	* [Location Strategies](http://developer.android.com/intl/ja/guide/topics/location/strategies.html)
* パーミッション要求が不審
	* パーミッション要求は必要最低限に
	* 6.0の実行時パーミッション機能にも対応
	* ※アプリのパーミッション画面で表示される「連絡先」は 端末に登録してあるGoogleアカウント情報を取得するための権限の GET_ACCOUNTS であることがややこしい...
* タブレットユーザー
	* フォンユーザーよりタブレットユーザーの方が課金率は高い
	* 画面サイズが large/xlarge であるタブレットは 全てのAndroidデバイス中 12.4% を占める
	* ファミリー向けアプリの多くはタブレット向け
* サインイン、会員登録が面倒
	* バージョンアップ時にもサインイン状態は保持するように
	* パスワード入力を少なく
		* Google Sign-in
		* Smart Lock for Passwords
		* ※ Yahoo! Japan のアプリはブラウザでログインさせてる。ブラウザでログイン済であれば、ID/Passwordの入力が不要になる。
* 通知、広告やポップアップはうるさい
	* ※フルスクリーンの動画広告はやめて欲しい。Landscapeになるので持ち替えが必要になる...
* UI がモダンではない
	* アプリの使い勝手が悪いとユーザーはすぐに離れる
	* コンテンツが良くても残念なアプリは多々ある
	* 同類アプリ間で品質の競争が発生している


###マルチスクリーン時代のおもてなし
* 端末の性能向上、アプリ間の品質競争
	* 品質に不満 = 即アンインストール
	* アンインストール数 = 不満足度の指数
* ユーザーの期待
	* モバイルWeb との差別化
	* 軽快な動作
	* 電池消費
	* ネットワーク効率
	* タブレット対応
	* オフライン
	* うるさくない通知
	* モダンで洗練されたUI
* Google Play レビュー欄は貴重な情報の宝庫
	* 苦情の中にヒントあり
	* 評価 4.0 以上を目指す
	* レビュー返信機能の活用
* マルチスクリーン時代 = 顧客設定の増大
	* どの窓口でも優れた「おもてなし」を

##Android TV, Chromecast と Nearby API の接近通信で実現するマルチスクリーン体験

### Chromecast
Chromecast のアプリについては以下の内容と大きく変わりはなかった。

* [Chromecastアプリ開発入門（1）：Chromecastで動くHTML5ベースのメディアストリーミングアプリを作るための基礎知識 (1/3) - ＠IT](http://www.atmarkit.co.jp/ait/articles/1409/03/news033.html)
* [Chromecastアプリ開発入門（2）：スマホとWebSocketで連携するテレビ用SPA（Single-Page Application）の作り方 (1/5) - ＠IT](http://www.atmarkit.co.jp/ait/articles/1411/13/news187.html)

新しい Google Cast API が 2015/5に発表された

* Remote Display API (Beta)
	* Sender アプリから画面描画をCastに送信できる。
		* これまでもChromecastをSecondary displayとして使用できたがそれとの違いが判らなかった...
* Game Manager API
	* Receiver アプリは HTML,CSS,JavascriptのSAP
	* マルチデバイスからReceiverへ接続できる
		* これもいままで出来ていたのでAPIの利点がよくわからなかった...

### Android TV
特に目新しい内容は無かった

ハードウェア仕様
テレビ製品、OTT.、STB向けのAndroidプラットフォーム
タッチ入力は出来ない。リモコン操作に対応しなければならない。
Google製アプリ(Chrome/Gmail/Map等)は非搭載

リリースは、Google Playでアップロードした後に Googleの審査が行われてから、ストアに公開される。

**動画再生プレイヤー**

*  [ExoPlayer](https://github.com/google/ExoPlayer) が使用できる
	* GitHubで公開し、改善継続中なので使用して欲しい
	* 対応機種では4K映像の再生も可能である
	* MediaDrm が使用できる
	* YouTUbe, Google Play Movies でも使用実績がある
* 標準 MediaPlayer API
	* 昔からあるAPI
	* DrmManagerClient
* その他サードパーティのプレイヤー製品
	* [sonyxperiadev/DrmLicenseService](https://github.com/sonyxperiadev/DrmLicenseService) が使えるのかどうかが気になる...

Leanback ライブラリを使用すると ガイドライン推奨のUIでアプリを開発することができる。


### Nearby API
* 物理的に近い距離のデバイスを自動的に探索して通信することが可能
* 2015/7 提供 AndroidとiOSに対応
* Nearby Messages API
	* 近くのデバイスを Bluetooth, BLE, WiFi, 超音波 で探索できる
	* デバイスが同一LANにいなくてももよい。(WiFiで探索の場合は除く。WiFi Directではない?)
	* Publisher / Subscriber
	* Chromcast のゲストモードは、超音波で探索している
	* デバイスの通信はそれぞれのネットワーク経由で行われる
* Nearby Connections API
	* 同一LAN上のデバイス間で高速通信
	* peer to peer の Messages 送受信？