Android Vitals の新機能
Google I/O 2018 で
Android Vital の新機能を発表しました。今回の改善には、2 つのパフォーマンス領域の追加、既存の指標の情報に対する機能強化、Android Vitals で予期しない変化が生じた場合の通知方法が含まれています。
カテゴリのベンチマーク
アプリの指標の測定結果が「良好な」(低い)レベルとみなされるか、「不適切な」(高い)レベルとみなされるかは、Play ストアでそのアプリがどのカテゴリに含まれるかによって大きく左右されます。たとえば、「ボード」カテゴリのゲームアプリにおけるスタートアップの遅延の平均は、「レース」カテゴリのゲームアプリよりも低くなります。そのため、Android Vitals ではカテゴリのベンチマークが表示されるようになりました。これによりデベロッパーは、自分のアプリのパフォーマンスを同じカテゴリ内の他のアプリと比較できます。
異常の検出
アプリの動作の急激な変化は好ましいことではありません。そのような状況に迅速に対応できるよう、Android Vitals では、指標の急激な変化を検出すると Play Console のメッセージとメールを通じてデベロッパーに通知します。通知を受けたデベロッパーは Android Vitals にアクセスして状況を確認し、原因に対処できます。
権限の拒否
アプリによる権限リクエストを拒否したユーザーの割合が表示されます。拒否される割合が高い場合は、アプリのデザインを見直し、許可を求める理由の伝え方を改善するなどして、権限を許可してもらえるようになるかを確認することができます。
アプリのスタートアップ時間
優れた機能や素晴らしいゲームプレイ体験を提供していても、アプリの起動に時間がかかりすぎると、ユーザーはアプリを使わなくなります。新しく追加されたこのパフォーマンス領域には、アプリのスタートアップ時間に問題があるかどうかをデベロッパーが把握できるよう、対象のアプリやゲームについて、コールド スタートアップ(アプリが最近使用されておらず、メモリ内にキャッシュされていない場合)、ウォーム スタートアップ(アプリはメモリ内にあるが、アクティビティの再作成が必要な場合)、ホット スタートアップ(アプリとアクティビティがメモリ内にあり、ユーザーがそのアプリに切り替えた場合)の 3 種類のスタートアップ時間が表示されます。
Android Vitals でスタートアップに関する問題が見つかったら、
Android Studio 3.2 の Android プロファイラ ツール(アプリスタート時の CPU プロファイリング、Systrace など)を利用して、スタートアップの遅延に関する問題を調べます。
主な指標
高品質のアプリを提供するためにはすべての指標が重要ですが、特に優先すべき指標として、過度の wakeup、ANR、停止したバックグラウンドでの wake lock、クラッシュの 4 つを挙げることができます。過度の wakeup と ANR については、第 1 回の記事で取り上げました。そこで、今回は wake lock とクラッシュについて見ていきます。
Wake locks
従来、Android でのバックグラウンド作業の実行は、必要に応じたバックグラウンド サービスの作成に依存していました。こうしたバックグラウンド サービスは必要な期間実行され続けたため、フリーランニング サービスと呼ばれることもありました。こうしたバックグラウンド サービスの実行中は、端末の CPU と通信がオフにならないようにするために wake lock が使用されていました。
このような形での wake lock の使用は最適ではありません。アプリによって頻繁にサービスのスケジュールが設定され、結果的にサービスが長時間実行されてメモリなどのリソースが占有されることがあります。このようにしてリソースを使用すると、CPU と通信の使用が増えるほか、端末がスリープ状態にならなくなることから、端末のパフォーマンス低下と電池の消耗を引き起こすことがよくあります。
Android Vitals では、アプリの PowerManager クラスを通じて取得した
部分的な wake lock の詳細を、[停止した wake lock] ページと [停止した wake lock(バックグラウンド)] ページで提供しています。部分的な wake lock では CPU は動作しますが、画面やキーボードのバックライトをオフにすることができます。
レポートには、停止した wake lock の影響を受けたバッテリー セッション(端末の完全充電から次の完全充電までの期間)の割合が表示されます。この情報には、過去 30 日間とその前の 30 日間に影響を受けたセッションの割合、アプリの指標を Google Play のインストール数上位 1,000 のアプリと比較したベンチマーク、影響を受けたセッションの推移を示したグラフのほか、アプリのバージョン、Android OS のバージョン、端末などの条件に基づく内訳(スクリーンショットには表示されていません)が含まれています。
このベンチマークにおいて、自分のアプリが、停止した wake lock の影響を受けたセッションの指標で下位 25% に該当する場合は、アプリの改善を検討してください。
第 1 回の記事でもお伝えしたように、Android 5.0 での JobScheduler の導入以降、アラームとフリーランニング サービスの使用を取りやめることをおすすめしています。Android Oreo 以降、アプリはバックグラウンドでサービスを開始できなくなったため(例外が発生します)、アラームとフリーランニング サービスの使用の取りやめは必須となります。同様に、アプリでの wake lock の使用についても、ほとんどの使用例で適切な代替手段があるため、取りやめることを検討してください。wake lock を使用する代わりに、アプリで以下の方法を採用することをおすすめします。
- バックグラウンドでのジョブの実行が必要な場合は、JobScheduler か WorkManager API を使用する。こうした機能を使用すると、ジョブが実行されている間だけ、そのジョブの wake lock が保持されます。
- 決められた時間に、または定期的にバックグラウンド タスクを実行する必要があるときは、AlarmManager ブロードキャストをスケジュールする。AlarmManager は、BroadcastReceiver.onReceive() メソッドが実行されている間だけ、wake lock を保持します。
- ユーザーがアプリのアクティビティを見ている間も画面をオンにしておきたいウィンドウがある場合は、該当するウィンドウに FLAG_KEEP_SCREEN_ON を追加する。たとえば、電子書籍を読んでいるときなどが該当します。これにより、アクティビティが表示されなくなったときに、システムによって wake lock が解放されます。
自分で wake lock を管理する必要がある場合(実行時間の長いフォアグラウンド サービスを使用して音声トラックを再生する場合など)は、必ず以下のルールに準拠してください。
- 非推奨の種類の wake lock は使用せず、PARTIAL_WAKE_LOCK を使用してください。
- wake lock を取得するときはタイムアウトを指定してください。そうすることで、アプリが wake lock を解放しない場合でも、タイムアウト時間が経過するとシステムによって wake lock が解放されます。
- wake lock には、com.myapp: my wake lock のように静的でわかりやすいタグを付けてください。それにより、Android Vitals の wake lock のレポートがわかりやすくなります。カウンタやその他の動的なデータをタグに追加しないでください。適切でわかりやすいタグを付けることで、類似する wake lock が Android Vitals によってまとめられ(組み合わされ)て、個別の wake lock の動作を正確に把握できるようになります。
- wake lock は不要になったら解放してください。wake lock は、エラーの発生によっても不要となることがあります。エラー処理にあたっては、安全性を重視してコードを記述し、呼び出しを try { … } finally { wakeLock.release(); } のブロックでラップすることをおすすめします。
クラッシュ
Android Vitals ではクラッシュの概要と詳細の両方を確認できます。[クラッシュ発生率] ページと [マルチ クラッシュ率] ページでは、クラッシュ データと使用状況データを組み合わせて正規化された指標が表示されます。
この概要情報に加えて、[ANR とクラッシュ] ページにリアルタイムのクラッシュの詳細が表示されます。
停止したバックグラウンドでの wake lock と同様に、クラッシュ率を比較するための主な指標として「不正な動作のしきい値」があります。
アプリのクラッシュ率が不正な動作のしきい値を超えている場合、クラッシュへの対処を優先することをおすすめします。
コードが例外を引き起こしてアプリをクラッシュさせる理由は数多くあります。そのため、本稿でそのすべてを説明して解決策を提示することは困難ですが、クラッシュを防止するのに役立つ一般的なアドバイスをいくつかご紹介します。
Android Vitals を利用して、頻発しているクラッシュに関する情報と、そのクラッシュの影響を受けているユーザー数を確認できます。Android Vitals の大きな利点は、発生したクラッシュを、第三者のクラッシュ レポート SDK が初期化されるよりも前に捕捉できることです。
クラッシュの再現、デバッグ、修正のために詳細な情報が必要な場合は、
Firebase Crashlytics の利用をご検討ください。このツールを使うと、クラッシュ時にアプリ内で何が起きているかを詳しく把握できます。Firebase Crashlytics では Firebase Analytics との統合によってこの機能を実現しており、デベロッパーはカスタムのログ記録を追加してクラッシュ レポートに含めることができます。
クラッシュを引き起こす一般的な原因の多くは、以下の方法で回避できます。
- 一般的な処理を自力でゼロから記述しない
- Kotlin に移行する
- 公開 API を使用する
一般的なコードパターンを自力でゼロから記述しない
クラッシュを引き起こす可能性がまずない高品質のライブラリが提供されていて、簡単に再利用できる場合、一般的なタスクを自力でコーディングしてミスを犯すリスクを取る必要はありません。
Android Jetpack には、ほとんどの Android アプリの基盤として利用できるライブラリが数多く用意されています。Android Jetpack は、アクティビティのライフサイクルの管理、ナビゲーション、バックグラウンド ジョブの実行、データベースの操作、外部ソースからのデータの読み込みなど、数多くの一般的なタスクに利用できます。Google の開発したライブラリ以外にも、デベロッパーがアプリの開発に利用できる、実績ある優れたオープンソース ライブラリが数多く公開されています。
Java から Kotlin への移行を検討する
Google は昨年の I/O において、Android での
Kotlin のサポートを発表しました。現在も引き続き、Kotlin のサポートの改善に取り組んでいます。クラッシュにつながるおそれのある一般的なコーディングのミスを少しでも防ぐことで、デベロッパーの生産性を高めることが最終目標です。
Kotlin の大きな利点の 1 つは、null 許容性についての情報が言語の型システムに組み込まれていることです。null セーフの呼び出しとコンパイル時の null チェックにより、コードが実行時に NullPointerException を引き起こすことを防止できます。まだお試しでなければ、
Kotlin を使ってみることをおすすめします。アプリには Kotlin を徐々に追加していくことができます。Kotlin は Java との高い相互運用性を備えているため、Java のコードを全面的に置き換える必要はありません。
公開されている Android API を使用する
公開されている Android API とは、Android デベロッパー サイトにドキュメントが掲載されているクラスと public メソッドを指します。こうした API は、認定済みのあらゆる Android 搭載端末での利用と動作が保証されています。リフレクションを使ってアクセス可能な private メソッドや hidden メソッドは、クラッシュを引き起こす大きな原因となるおそれがあります。こうしたメソッドには、端末で利用できるかどうかの保証がなく、また、Android のアップデートのたびに変更や中断が生じることが多いという問題があります。そのため、テスト用としてはともかく、Play ストアで公開するアプリへの使用は避けることをおすすめします。
private メソッドや hidden メソッドには上記のような問題があるため、Android P デベロッパー プレビューおよび今後の Android のすべてのエディションでは、このようなドキュメント化されていない非公開 API へのアクセスが制限されます。アプリでのこうした API の利用を直ちに停止することで、互換性を維持できます。詳しくは、プレビュー サイトで
非 SDK インターフェースの制限についての記事をご覧ください。
おわりに
Android Vitals を活用して高品質のアプリを開発し、より多くのユーザーを引き付けて定着させることで、活気のあるビジネスを構築できます。全 2 回にわたる記事で、過度の wakeup、ANR、停止したバックグラウンドでの wake lock、クラッシュという 4 つの主な指標についての重要な情報をお伝えしました。また、最近 Android Vitals に追加された機能もご紹介しました。
この記事で紹介したおすすめの方法や詳細情報を活用することで、デベロッパーの皆様が Android Vitals に表示されるアプリの指標を的確に理解して、アプリの品質向上に役立てられるよう願っています。
Android Vitals や新機能についてご意見がございましたら、#AskPlayDev を付けてツイートしていただければ、
@GooglePlayDev から返信いたします。このアカウントでは定期的にニュースや Google Play で成功するためのヒントを紹介しています。
Reviewed by Iku Igarashi - Google Play Business Development Manager