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