Android 11 QPR3 以上版本支援快取應用程式凍結器。這項功能會停止執行快取程序,並造成應用程式嘗試在快取時正常運作,藉此減少資源用量。此架構會將快取應用程式的程序遷移至已凍結的 cgroup,藉此減少在有活躍快取應用程式時的 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
指令和 grep 檢查Apps frozen:
的凍結程序清單。檢查
/sys/fs/cgroup/uid_0/cgroup.freeze
檔案是否存在。查看 Logcat,每次程序從冷凍庫遷移進出時,這項工具都會顯示已凍結和未凍結的項目。例如:
adb logcat | grep -i "\(freezing\|froze\)"