Android 11 QPR3 以降では、キャッシュ保存済みアプリ フリーザーがサポートされます。この機能は、キャッシュに保存されているプロセスの実行を停止し、キャッシュに保存されているときに動作しようとするアプリの誤動作によるリソースの使用を削減します。フレームワークは、アプリのプロセスを凍結された cgroup に移行することにより、キャッシュに保存されているアプリを凍結します。これにより、キャッシュに保存されているアクティブなアプリが存在する場合に、アクティブな CPU とアイドル状態の CPU の消費量が削減されます。アプリ フリーザーは、システム構成フラグまたは開発者向けオプションを使用して有効にできます。
アプリ フリーザーを実装する
キャッシュ保存済みアプリ フリーザーは、カーネルの cgroup v2 フリーザーを利用します。互換性のあるカーネルを搭載したデバイスでは、必要に応じてこれを有効にできます。そのためには、開発者向けオプションの [キャッシュに保存されたアプリの実行を停止] を有効にするか、デバイス設定フラグ activity_manager_native_boot use_freezer
を true
に設定します。次に例を示します。
adb shell device_config put activity_manager_native_boot use_freezer true && adb reboot
フラグ use_freezer
が false に設定されているか、開発者向けオプションが無効になっている場合、フリーザーは無効になります。この設定を切り替えるには、ソフトウェア リリースまたはアップデートでデバイス設定を変更します。
アプリ フリーザーは正式な API を公開しません(リファレンス実装クライアントもありません)が、非表示のシステム API setProcessFrozen
および enableFreezer
を使用します。これらの API について詳しくは、ActivityManager の Process.java
と ActivityManagerService API を参照してください。デベロッパーは、ActivityManager
のテスト用クライアント コードも参照できます。
カスタム機能を処理する
一般的に、キャッシュに保存されているプロセスが作業を実行することは想定されませんが、一部のアプリには、キャッシュ保存中の実行が想定されるプロセスがサポートするカスタム機能が含まれています。そのようなアプリを実行するデバイスでアプリ フリーザーを有効にすると、キャッシュに保存されたプロセスが凍結され、カスタム機能の動作を妨げる可能性があります。
回避策として、キャッシュ保存中にアクティビティを実行する必要があるプロセスがアプリに含まれている場合は、アプリをアクティブな状態に保つために、プロセスのステータスをキャッシュに保存されていない状態(Bound ForeGround Service(BFGS)やフォアグラウンドなど)に変更してからプロセスを実行するようにします。
アプリ フリーザーをテストする
アプリ フリーザーが意図どおりに機能することを確認するには、以下のリソースを使用します。
adb shell dumpsys activity
コマンドを使用して凍結されたプロセスのリストを確認し、Apps frozen:
を grep します。/sys/fs/cgroup/uid_0/cgroup.freeze
ファイルの有無をチェックします。logcat を確認します。logcat には、プロセスがアプリ フリーザーを出入りするたびに、凍結されているエントリと凍結されていないエントリが表示されます。次に例を示します。
adb logcat | grep -i "\(freezing\|froze\)"