Android 9(API レベル 28)には、端末の電力管理を改善するための新しい機能が導入されています。これらの変更点と以前のバージョンに既に搭載されていた機能により、システム リソースを最も必要とするアプリでシステム リソースを利用することが可能になります。
電源管理機能は、次の 2 つのカテゴリに分類されます。
- アプリ スタンバイ バケット
- システムがアプリの制限を行うアクセスするなど、デバイス リソースには ユーザーの使用パターンに基づく CPU またはバッテリー。これは Android 9。
- バッテリー セーバーの改善
- バッテリー セーバーをオンにすると、 すべてのアプリに制限が適用される。これは既存の機能であり Android 9 で改善されました。
アプリ スタンバイ バケット
Android 9 では、新しいバッテリー管理機能としてアプリ スタンバイ バケットが導入されています。 アプリ スタンバイ バケットは、システムがアプリの優先順位を決定するのに役立ちます。リソースに対してリクエストを実行し、 アプリの利用日や使用頻度を確認できますアプリの使用状況に基づく 各アプリは 5 つの優先度バケットのいずれかに分類されます。システムは、各アプリが入っているバケットに基づいて、そのアプリで使用できるデバイス リソースを制限します。
5 つのバケットは、次の特性に基づいてアプリをグループに優先順位付けします。
- 有効
ユーザーが現在アプリを使用している場合、アプリはアクティブ バケットに入ります。 例:
- アプリがアクティビティを開始した
- アプリがフォアグラウンド サービスを実行している
- アプリには、コンテンツ プロバイダに関連付けられた同期アダプターがあり、 フォアグラウンド アプリ
- ユーザーがアプリからの通知をクリックする
アプリがアクティブ バケット内にある場合、システムは アプリのジョブ、アラーム、FCM メッセージに対してのみです。
- ワーキング セット
頻繁に実行されているアプリが現在ではない場合、アプリはワーキング セット バケットに入ります。 アクティブです。たとえば、ユーザーがほとんどの日に起動するソーシャル メディア アプリは、 ワーキングセットに入る可能性が 高くなりますアプリが間接的に使用される場合も、ワーキング セット バケットに昇格されます。
アプリがワーキング セット内にある場合、システムはジョブの実行とアラームのトリガーの機能に緩やかな制限を加えます。詳しくは、電源管理の制限をご覧ください。
- 高頻度
アプリが毎日ではないが定期的に使用される場合、高頻度バケットに入ります。たとえば、ユーザーがジムで実行するワークアウト記録アプリは、高頻度バケットに入っている可能性があります。
アプリが高頻度バケット内にある場合、システムはジョブの実行とアラームのトリガーの機能により強い制限を加えます。また、優先度の高い FCM メッセージにも上限を与えます。詳しくは、 電源管理に関する制限
- 低頻度
アプリがあまり使用されない場合、低頻度バケットに入ります。たとえば、ホテルのアプリは そのホテルの滞在中にしか実行しない 可能性は低いかもしれません あります。
アプリが低頻度バケット内にある場合、システムは、ジョブの実行、アラームのトリガー、優先度の高い FCM メッセージの受信の機能に強い制限を加えます。また、アプリのインターネットに接続する機能も制限します。対象 詳しくは、電源管理に関する制限をご覧ください。
- 思わない
インストールされているが、実行されていないアプリは、「なし」バケットに割り当てられます。 システムはこうしたアプリに厳しい制限を課しています。
システムは各アプリを優先度バケットに動的に割り当て、そのアプリを できます。マシンを使用するプリロード アプリが 各ユーザーが予測を行う確率を 適切なバケットにアプリを割り当てます。このシステムアプリがデバイスに存在しない場合、デフォルトでは最終利用時刻に基づいてアプリを並べ替えます。アプリは、アクティブになるほど高い優先度を与えるバケットに割り当てられ、多くのシステム リソースを利用できるようになります。特に、このバケットによって、アプリのジョブが実行される頻度、アプリがアラームをトリガーする頻度、アプリが高優先度の Firebase Cloud Messaging (FCM)メッセージを受信する頻度が決まります。こうした制限は、デバイスが電池で動作している間にのみ適用されます。デバイスの充電中は、どの制限も適用されません。
どのメーカーも、アクティブでないアプリをバケットに割り当てる方法について独自の基準を設定できます。アプリがどのバケットに割り当てられるかに影響を与えようとしないでください。その代わりに、どのような環境でもアプリが適切に動作することを
決定しますアプリは新しいメソッド UsageStatsManager.getAppStandbyBucket()
を呼び出すことで、現在どのバケットにあるかを確認できます。
おすすめの方法
アプリがすでにDoze とアプリ スタンバイのおすすめの方法に従っている場合、新しい電源管理機能の処理は難しくないはずです。ただし、以前は正常に機能していたアプリの動作に、問題が発生する場合があります。
- システムを操作してアプリを 1 つのバケットに入れたり、 別のものです。システムがバケットに振り分ける方法は変更される可能があり、すべてのデバイス メーカーが独自のアルゴリズムで独自のバケットアプリを作成することもできます。そのようなことはせず、アプリはどのバケット内にあっても適切に動作することが重要です。
- アプリにランチャー アクティビティがない場合、 作成します。アプリを再設計して、ランチャー アクティビティを持たせることをおすすめします。
- アプリの通知が操作できない場合は、ユーザーはトリガーできません。 通知を操作してアプリをアクティブ バケットに昇格させることができます。イン そのような場合は、通知機能を再設計して、 返すことができます。ガイドラインについては、マテリアル デザインの通知のデザイン パターンをご覧ください。
同様に、優先度の高い FCM メッセージを受信してもアプリに通知が表示されない場合、アプリを操作してアクティブ バケットに昇格する機会がユーザーに与えられません。実際、優先度の高い FCM メッセージの用途は、 このような状況は発生しません。もし トリガーされない場合に FCM メッセージを高優先度として不適切としてマークする その他の好ましくない結果を引き起こす可能性がある。たとえば、 アプリがその割り当てを使い切って 通常の優先度として処理される FCM メッセージ。
注: ユーザーが通知を繰り返し閉じると、システムはその通知を今後ブロックするかどうかをユーザーに選択させます。アプリをアクティブ バケットに留めるためだけに、ユーザーに不要な通知を送らないでください。
アプリが複数のパッケージに分割されている場合、それらのパッケージは アクセス レベルも異なります。必ず さまざまなバケットに割り当てられたパッケージを使用してそのようなアプリをテストし、 確認する必要があります。
バッテリー セーバーの改善
Android 9 ではバッテリー セーバー モードにいくつかの改良が行われています。適用される具体的な制限はデバイス メーカーが決定します。たとえば、AOSP ビルドの場合、システムは以下の制限を適用します。
- システムは、アプリがアイドル状態になるのを待つのではなく、積極的にアプリをアプリ スタンバイ モードにします。
- バックグラウンド実行の制限は、ターゲット API に関係なく、すべてのアプリに適用されます できます。
- 画面がオフになると、位置情報サービスが無効化される場合があります。
- バックグラウンド アプリは、ネットワークにアクセスできません。
これ以外にも、デバイス固有の電力最適化があります。フル 詳しくは、電源管理について説明しているページを 制限します。
通常どおり、バッテリー セーバーがアクティブな状態でアプリをテストすることをおすすめします。マイページ バッテリー セーバーは、デバイスの [設定] >バッテリー セーバー画面。
テストとトラブルシューティング
新しい電源管理機能は、 アプリが Android 9 を対象としているかどうか。このようなデバイス上でアプリが正しく動作するか必ず確認してください。
さまざまな条件下でアプリの主なユースケースをテストして、電源管理機能の相互作用を確認してください。Android Debug Bridge コマンドを使用すると、 オフにすることもできます。
Android Debug Bridge コマンド
Android Debug Bridge のシェルコマンドを使用できます。 いくつかの電源管理機能をテストします。
ADB を使用してデバイスを Doze モードにする方法については、Doze とアプリ スタンバイを使用してテストするをご覧ください。
アプリ スタンバイ バケット
ADB を使用すると、アプリをいずれかのアプリ スタンバイ バケットに手動で割り当てることができます。アプリのバケットを変更するには、次のコマンドを使用します。
$ adb shell am set-standby-bucket packagename active|working_set|frequent|rare
このコマンドを使用して、複数のパッケージを一度に設定することもできます。
$ adb shell am set-standby-bucket package1 bucket1 package2 bucket2...
アプリが所属しているバケットを確認するには、次のコマンドを実行します。
$ adb shell am get-standby-bucket [packagename]
このコマンドで、packagename パラメータを渡さなかった場合、すべてのアプリのバケットがリストアップされます。また、
新しいメソッド
UsageStatsManager.getAppStandbyBucket()
。
バッテリー セーバー
低消費電力状態でアプリがどのように動作するかテストするコマンドがいくつか用意されています。
デバイスの電源を取り外すシミュレーションを行うには、次のコマンドを使用します。
$ adb shell dumpsys battery unplug
低消費電力状態でデバイスがどのように動作するかテストするには、次のコマンドを使用します。
$ adb shell settings put global low_power 1
テストが完了したら、手動のデバイス設定を元に戻す 以下のコマンドを使用します。
$ adb shell dumpsys battery reset