Android 11 QPR3 lub nowszy obsługuje funkcję zamrażania aplikacji w pamięci podręcznej. Ta funkcja przerywa wykonywanie procesów z pamięci podręcznej i ogranicza wykorzystanie zasobów przez nieprawidłowo działające aplikacje, które mogą próbować działać w pamięci podręcznej. Framework zamraża aplikacje w pamięci podręcznej, przenosząc ich procesy do zamrożonego cgroup. Dzięki temu zmniejsza się aktywne i pozostańcze zużycie procesora w przypadku aktywnych aplikacji w pamięci podręcznej. Funkcję zamrażania aplikacji można włączyć za pomocą flagi konfiguracji systemu lub opcji dewelopera.
Wdrożenie zamrażarki aplikacji
Blokowanie aplikacji w pamięci podręcznej korzysta z blokowania cgroup v2 w jądrze. Urządzenia z kompatybilnym jądrem mogą (opcjonalnie) włączyć tę funkcję. Aby to zrobić, włącz opcję dla programistów „Wstrzymaj wykonywanie aplikacji w pamięci podręcznej” lub ustaw flagę konfiguracji urządzenia activity_manager_native_boot use_freezer
na true
. Przykład:
adb shell device_config put activity_manager_native_boot use_freezer true && adb reboot
Funkcja zamrażania jest wyłączona, gdy flaga use_freezer
ma wartość Fałsz lub opcja dla programistów jest wyłączona. Możesz zmienić to ustawienie, zmieniając konfigurację urządzenia w ramach wydania lub aktualizacji oprogramowania.
Aplikacja apps freezer nie udostępnia oficjalnych interfejsów API (nie ma też referencyjnego klienta implementacji), ale korzysta z ukrytych interfejsów API systemu setProcessFrozen
i enableFreezer
. Szczegółowe informacje o tych interfejsach API znajdziesz w interfejsie ActivityManagerProcess.java
i interfejsie ActivityManagerService API. Programiści mogą też korzystać z kodu klienta w pliku ActivityManager
, aby przeprowadzać eksperymenty.
Obsługa funkcji niestandardowych
Zazwyczaj procesy nie powinny wykonywać żadnych działań w pamięci podręcznej, ale niektóre aplikacje mogą mieć funkcje niestandardowe obsługiwane przez procesy, które powinny działać w pamięci podręcznej. Gdy na urządzeniu z taką aplikacją włączona jest funkcja zamrażania aplikacji, procesy w pamięci podręcznej są zamrażane i mogą uniemożliwić działanie funkcji niestandardowych.
Jeśli aplikacja ma proces, który musi wykonywać czynności podczas buforowania, jako obejście zmień stan procesu na niebuforowany (np. związana usługa na pierwszym planie lub usługa na pierwszym planie), zanim proces będzie musiał wykonać jakąkolwiek pracę, aby aplikacja pozostała aktywna.
Testowanie funkcji zamrażania aplikacji
Aby sprawdzić, czy zamrażarka aplikacji działa zgodnie z oczekiwaniami, skorzystaj z tych materiałów:
Sprawdź listę zablokowanych procesów, używając polecenia
adb shell dumpsys activity
i grepApps frozen:
.Sprawdź, czy istnieje plik
/sys/fs/cgroup/uid_0/cgroup.freeze
.Wyświetlać logcat, który pokazuje wpisy zamrożone i odmrożone za każdym razem, gdy proces przechodzi do zamrażarki lub z niej wychodzi. Przykład:
adb logcat | grep -i "\(freezing\|froze\)"