Google for Mobile - Tokyo『高品質Androidアプリ実装ヒント集～ゴミアプリと言わせないために』

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

この記事は、2015/12/09に開催された「[Google for Mobile – Tokyo](https://events.withgoogle.com/google-for-mobile-tokyo/)([#gfmtokyo](https://twitter.com/search?q=%23gfmtokyo))」の下記セッションの紹介です。

> Develop Track / Session 2
> 『高品質Androidアプリ実装ヒント集～ゴミアプリと言わせないために』
>  Developer Advocate　松内　良介

## Contents

> 最近の動き：ガイドライン資料、Google Play ベストアプリ 2015
> 
> ユーザー評価を読む
> 　　アプリである意味がない
> 　　遅い、重い
> 　　電池を使いすぎる
> 　　ネットワークを使いすぎる、オフラインで使えない
> 　　いつも居座っている
> 　　Back ボタン対応
> 　　新しい機種 / OSバージョンに非対応
> 　　サーバー設備が追いついていない
> 　　位置情報の取得処理がデタラメ
> 　　パーミッション要求が不審
> 　　タブレットユーザーを無視
> 　　サインイン、会員登録が面倒
> 　　通知、広告やポップアップがうるさい
> 　　UIがモダンではない
> 
> まとめ：マルチスクリーン時代のおもてなし


# 最近の動き


## Google Play でのユーザー評価と収益性の相関
![sales.png](https://qiita-image-store.s3.amazonaws.com/0/93531/6b6cedfb-1655-fc3a-2717-50f4fed9c89a.png)
- Google I/O 2014 での資料
- Google Play でのユーザー評価が4.0以上でないと、ビジネスとしては厳しい
    - この後のユーザーからの不満とその対策を元に、ユーザー評価を4.0以上にしてください


## 推奨ガイドライン資料の追加・更新

以下のガイドラインが追加・更新されたので、確認してください。

- [The Secrets to App Success on Google Play (Second Edition)](http://android-developers.blogspot.jp/2014/11/introducing-new-guide-secrets-to-app.html)
    - 2014.11.06 初版公開
    - 2015.11.17 第2版公開

- [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/)
    - 2015.4 公開

- [Design from iOS to Android  (and Back Again)](https://design.google.com/articles/design-from-ios-to-android/)
    - 2015.5 公開


## App Quality ガイドライン

- [Core App Quality](http://developer.android.com/intl/ja/distribute/essentials/quality/core.html)
    - 引き続き重要
    - 一見ドライだが、ユーザーからの厳しい不満と直結している、本当は生々しいガイドライン


- [Android アプリ品質ガイドライン](http://googledevjp.blogspot.jp/2013/01/core.html)
    - Google Developers Japan (blog) に Core App Quality の日本語訳がありました。
    - 2013.1.25 公開なので、内容が多少ふるいかもしれません。


## [Google Play 「ベスト オブ 2015」](https://play.google.com/store/info/topic?id=bestof2015_apps)

![best2015.png](https://qiita-image-store.s3.amazonaws.com/0/93531/ec9ee33c-88f3-b617-eedb-7a24454af68f.png)

- [2015.12.03 公表](http://googlejapan.blogspot.jp/2015/12/google-play-2015.html)
- 評価軸
    - **高いユーザー評価**
    - **高い品質**
    - **Android 標準に沿った使いやすいUIデザイン**
    - etc


# ユーザー評価を読む

## アプリである意味がない

> ★★☆☆☆
> ブラウザから普通に行ったのと変わらないためアプリの必要性がわからない
>
> ★★☆☆☆
> **必要ある？**
> アプリ起動して色々選択するとブラウザに飛ぶ 必要あんの？

ユーザーは、アプリらしい体験を期待しています。

- アプリらしい体験の例
    - Web サイトよりも早く目的の情報にたどりつける
    - 動作や表示が軽快で、操作感が気持ち良い
    - オフラインで使える（データ通信が少ない）

## 遅い、重い

> ★★☆☆☆
> **重すぎ**
> 素人さん？
>
> ★☆☆☆☆
> **重い**
> アプリならサクサク動く、て説明を訂正した方が良い。重いし固まるし切断するし、うんざりします。ブラウザで良い。

アプリの動作速度を上げる

- 起動
    - 無駄なスプラッシュ画面の生成などでユーザーを待たせない
    - できるだけ起動の前にデータをダウンロードしておく
    - SyncAdapter, IntentService, GCM, 先読み, Background download
    - 会員登録などの要求でユーザーを邪魔しない（できるだけ後回しに）

- 一般の Activity / Fragment 遷移時
    - できるだけ遷移前にデータをダウンロードしておく
    - 無駄な View 階層の生成を避ける（LinearLayoutの入れ子しすぎなどに注意）

- スクロール時
    - View の生成 / 解放、ビットマップ管理を極限までチューニング
    - RecyclerView + Adapter, Glide など標準API / ライブラリに処理を任せる

- その他 一般的な配慮
    - UI スレッドはとにかく軽く（AsyncTask, ThreadPoolExecutor）
    - タッチ操作には 速攻で視覚的フィードバックを表示
    - Native API で簡単に表現できる UI に WebView を使わない

利用すべき支援ツール

- Developer Options の strict (厳格)モード(Android 4.0+)
    - 画面に赤枠が出たら UI スレッドが重すぎる

- [Traceview](http://developer.android.com/intl/ja/tools/help/traceview.html)
    - コード内の各部分の実行時間を計測

- [dmtracedump](http://developer.android.com/intl/ja/tools/help/dmtracedump.html)
    - 実行時間のプロファイルをツリー形式(html)で出力

- [Systrace](http://developer.android.com/intl/ja/tools/help/systrace.html) (Android 4.1+)
    - アプリやシステムの実行時間を記録・表示

アプリの動作速度を上げる ： 解説動画

- 解説動画シリーズ ["Android Performance Patterns"](https://www.youtube.com/playlist?list=PLOU2XLYxmsIKEOXh5TwZEv89aofHzNCiu)
    - 2015年1月から公開開始
    - 現在 YouTube で64本の短編動画を公開中


## 電池を使いすぎる

> ★★☆☆☆
> 使わない時もずっと裏で動いてて電池と通信料を消費している
>
> ★☆☆☆☆
> **よく見て**
> 待機時の電池消費だった。費用対効果よく考えてインストールしよう

アプリの消費電力を抑えるノウハウ

- 解説動画
    - ["Android Performance Patterns"](https://www.youtube.com/playlist?list=PLOU2XLYxmsIKEOXh5TwZEv89aofHzNCiu)
    - ["DevBytes: Efficient Data Transfers"](https://www.youtube.com/playlist?list=PLWz5rJ2EKKc-VJS9WQlj9xM_ygPopZ-Qd)
        - 通信アンテナの消費電力の理解、先読み、Sync Adapter etc

- 解説資料
    - ["Transferring Data Without Draining the Battery"](http://developer.android.com/intl/ja/training/efficient-downloads/index.html)

- [Batterystats & Battery Historian](http://developer.android.com/intl/ja/tools/performance/batterystats-battery-historian/index.html) (Android 5.0+)
    - アプリの電力消費を解析するためのツール

- [JobScheduler API](http://developer.android.com/intl/ja/reference/android/app/job/JobScheduler.html) (Android 5.0+)
    - 充電中のみ、Wi-Fi 接続時のみ、といったジョブ実行の条件が指定可

- Doze モード、App Stanby (Android 6.0+)
    - 省電力モードを無理に回避しない


## ネットワークを使いすぎる、オフラインで使えない

> ★★☆☆☆
> **重たすぎる**
> 内容は楽しくていいんですが、データ容量食いすぎじゃないですか！！？1週間で1ギガぐらいいきましたよ！！何にそんなにデータを使うのでしょうか、最近は制限がかかるのでせっかく楽しくても使えません。
>
> ★☆☆☆☆
> **オフラインじゃ使えない**
> タブレットからで外では公衆Wi-Fiがないとネット繋げない状況なので使えません。オフラインじゃ使えないって大きく書いておいてほしい。


## いつも居座っている

> ★★☆☆☆
> 常にバッググラウンドで動いているのが気持ち悪い。常駐して何をしているのか？
>
> ★☆☆☆☆
> **常駐**
> プッシュ通知をオフにしてるのに常駐するのを止めて欲しい。

- IntentServcie を丁寧に設計し、サービスの処理はできるだけ早く完了して長時間居座らない
- 必要もないのにシステム通知領域に居座らない

アプリの RAM 消費を抑えるノウハウ

- 解説資料、推奨事項を公開中
    - ["Process Stats: Understanding How Your App Uses RAM"](http://android-developers.blogspot.jp/2014/01/process-stats-understanding-how-your.html)

- ノウハウの例
    - お行儀のよい IntentService
    - onStop でリソース解放
    - onTrimMemory / onLowMemory 活用
    - HashMap ではなく SparceArray を
    - enum ではなく static final 定数を
    - 抽象化のしすぎを避ける（[Guice](https://github.com/google/guice)とか）

- ビットマップ管理
    - LruCache
    - RecyclerView + Adapter
    - [Glide library](https://github.com/bumptech/glide) (GitHubで公開中)

- [procstats](https://source.android.com/devices/tech/debug/procstats.html) ツール (Android 4.4+)
    - adb shell dumpsys procstats
    - dumpsys meminfo
    - dumpsys activity

- Android Studio の [Memory Monitor](http://developer.android.com/intl/ja/tools/performance/memory-monitor/index.html)


## Back ボタン対応

> ★☆☆☆☆
> 終了してしまう 他の方も書いていますが、端末のバックをタップすると終了してしまうのでは使い物にならない。なぜ1つ前の状態に戻れないのか。あまりに不便でブラウザの方を使用しています。早く修正してください。
>
> ★☆☆☆☆
> 使いづらい…前のページに戻りたくて端末のバックをタップすると、何でだか「アプリを終了しますか？」と表示される。結局トップページに戻って検索し直し。腹立つわ。


## 新しい機種 / OSバージョンに非対応

> ★★★★★
> アップデートしたら、android 6.0でも動いたから、5★に戻す。対応ありがとうm(_ _)m
>
> ★☆☆☆☆
> **android6.0では難があります**
> しょっちゅう落ちます


最新の Android バージョンには できるだけ早く対応を

- テスト端末分類の指針例
    - Android バージョン
        - [Nexus Factory Image](https://developers.google.com/android/nexus/images) ダウンロードも活用を
    - RAM 容量
        - 1 GB,  512 MB,  2 GB…
    - GPU ファミリー
        - Adreno,  PowerVR,  Tegra,  Mali
    - チップセットファミリー
        - Snapdragon,  MediaTek,  Intel,  Samsung,  Nvidia


## ユーザーの数の増加にサーバー設備が追いついていない

> ★☆☆☆☆
> ここ3日位、使う度にメンテナンス中ですと表示され動かないってか、いつまでメンテナンス中なんですか？メンテナンスに3日もかかる物なんですか？

- Google Play のアルファ / ベータテスト支援機能をご活用ください
    - クローズドベータ
    - オープンベータ

- 迅速なキャパシティ増減
    - Google Cloud Platform のコンテナ技術
	    - ミリ秒単位のスピードで CPU を追加


## 位置情報の取得処理がデタラメ

> ★★☆☆☆
> バッググラウンドでやたら動いて電池の消耗を早める一因になっている。GPSもしょっちゅう動作するので不信感ある。
>
> ★★☆☆☆
> **アプリを立ち上げるとGPSが**
> バックグラウンドで起動しだして、位置計測してますが必要でしょうか。。GPSはバッテリーを消費しがちなので、控えてもらえるとありがたいです。

- 常に GPS (Fine Location) を使うのではなく Fused Location Provider の低精度モード (Coarse Location) も活用を
- ユーザーがアプリを離れたら (onStop) 位置情報の取得は停止
- 国内／国外判定をミスらない
    - 常に SIM の MCC/MNC や IP アドレスのみに頼るのは危険


## パーミッション要求が不審

> ★★☆☆☆
> **よくわらからない**
> 何でカメラやマイク、Bluetoothの権限が必要なんだろう？そういうアプリなんでしたっけ。
>
> ★☆☆☆☆
> **録音権限が追加されています**
> アップデート内容の説明にはバグ修正としか書かれていないのに、録音権限を要求するようになりました。この様な権限を不自然に要求するアプリはウイルスやマルウェアの可能性があるのでインストールしない方が良いでしょう。

- パーミッション要求は最小限に
- Android 6.0 実行時パーミッション機能にも対応を


## タブレットユーザーを無視

> ★★★★☆
> **表示の自動回転**
> タブレットでは横向きの方が見やすいと思います。対応お願いします。
>
> ★☆☆☆☆
> **相変わらず縦固定**
> タブレットでは、縦固定は、非常に見にくいです。スマフォでも横の方が見易いこともあります。縦横切り替えの早急な対応を願いたいです。

- 1.7 x
    - タブレットユーザーと電話(フォン)ユーザーの課金率の違い (Google I/O 2013)

- 12.4 %
    - 全 Android 端末中、画面サイズが Large または Xlarge の割合 (Android Dashboards / Nov 2, 2015 )


## サインイン、会員登録が面倒

> ★☆☆☆☆
> **ひどい**
> アプリでは完結せず、Webからの設定が必要。しかし、アプリから情報は連携せず。いちいちログインが必要だし、ログインすると今まで入力していた項目がクリアされる。ならばアプリは必要ないのでは？
>
> ★☆☆☆☆
> **だめ**
> ちゃんと登録したのにログインできない。パスワードの変更をしなおしても駄目だった。時間返せ。

- バージョンアップ時もサインイン状態は引き継ぎを

- パスワード入力の必要性の低減をご検討ください
    - [Google Sign-in](https://developers.google.com/identity/)
    - [Smart Lock for Passwords](http://get.google.com/smartlock/#for-passwords)
        - ChromeやAndroidアプリでGoogleアカウントに認証情報を保存、取得ができる
        - Netflix, Eventbrite, Instacart, Orbitz, LinkedIn などが対応済み


## 通知、広告やポップアップがうるさい

> ★★☆☆☆
> **他のサイトへの勧誘が多い**
> いちいち他のサイトに登録させようとするのが、読む気を無くさせる。
>
> ★☆☆☆☆
> **なぜか**
> プッシュ通知をオフにしてるのに通知が届いてしまうのでアンインストールします。

- 通知がうるさいのはユーザーにとって大きなストレス
    - 通知オフ設定は、アプリのバージョンアップ時も必ず引き継ぎを

- 広告やポップアップがユーザーの利用の邪魔をしてしまうのは致命的です
    - 場合によっては、規則違反として警告・削除の対象になる可能性があります


## UIがモダンではない

> ★☆☆☆☆
> **ダメダメ**
> 全部webviewでしょ。重いわ。UIもモダンじゃない。ダサい。ログイン保持できない？

- ユーザーは、アプリが時代に沿った体験を提供しているかどうかを敏感に感じています

- 最新の Support Library を活用し、Material Design への対応をご検討ください
    - [Android Design Support Library](http://android-developers.blogspot.jp/2015/05/android-design-support-library.html)


# まとめ：マルチスクリーン時代のおもてなし

- 端末の性能向上により、アプリ間の品質競争が激化
    - 品質に不満 ＝ 即アンインストール
    - アンインストール数 ＝ 不満足度の指標

- ユーザーの期待
    - モバイル Web との差別化
    - 軽快な動作
    - 電池・ネットワーク効率
    - タブレット対応
    - オフライン対応
    - うるさくない通知
    - モダンで洗練された UI

- Google Play レビュー欄は貴重な情報の宝庫
    - 苦情の中にヒントあり
    - 評価 4.0 以上を目指してください
    - レビュー返信機能も活用を

- マルチスクリーン時代 ＝ 顧客接点の増大
    - どの窓口でも優れた「おもてなし」を