Przeciętny użytkownik Androida instaluje na swoich urządzeniach ponad 50 aplikacji (liczba ta rośnie wraz z poziomem pamięci RAM urządzenia). Jednak znaczna część tych aplikacji nie jest używana przez użytkownika przez długi czas.
Hibernacja aplikacji powoduje hibernację aplikacji, których użytkownik nie używa przez kilka miesięcy, podobnie jak w przypadku automatycznego wycofywania uprawnień. Spowoduje to wymuszenie zatrzymania aplikacji i przejście w stan, w którym optymalizujemy miejsce na dane zamiast wydajności. Z tym stanem jest też pakiet automatyczne wycofywanie uprawnień i wspólne ustawienie wykluczenia w Ustawieniach. Aplikacja zatrzymana przymusowo nie wykonuje zadań ani nie wysyła alertów w tle i nie może wysyłać powiadomień push. Gdy użytkownik ponownie użyje aplikacji, wyjdzie ze stanu hibernacji, a zadania/alerty/powiadomienia będą działać tak jak zwykle. Wszystkie zadania, alerty i powiadomienia zaplanowane przed przejściem aplikacji w stan hibernacji, muszą zostać ponownie zaplanowane.
Modyfikacje platformy przez producentów OEM mogą powodować konflikt z implementacją hibernacji aplikacji. Na przykład
- Modyfikowanie definicji użycia aplikacji lub wprowadzanie sposobów jej budzenia, które nie są dostępne w AOSP, może zakłócać dokładność hibernacji aplikacji.
- Zastrzeżony mechanizm ograniczania ryzyka oferowany przez OEM, podobny do hibernacji aplikacji, może pełnić podobny cel. Oba mogą występować jednocześnie, ale mogą też na siebie nakładać.
CDD określa nowy zestaw wymagań dotyczących zmian opartych na użyciu aplikacji, podobnie jak w obecnym wymaganiu 3.5.1. Tryb uśpienia aplikacji podlega tym wymaganiom.
Kod platformy znajduje się w:
- repozytorium: platforma/frameworks/base
- katalog: services/core/java/com/android/server/apphibernation
Logika zasad znajduje się w tych miejscach:
- repozytorium: platforma/pakiety/moduły/uprawnienia
- Katalog: PermissionController/src/com/android/permissioncontroller/hibertions
Architektura ogólna
Usługa systemu hibernacji aplikacji optymalizuje miejsce na dane w przypadku rzadko używanych aplikacji użytkownika i zapobiega ich działaniu w tle. Aby osiągnąć takie wyniki, podczas hibernacji aplikacji:
- Automatyczne odwoływanie uprawnień
- Wymuś zatrzymanie aplikacji.
- Usuń pliki ODEX i VDEX
- Wyczyść pamięć podręczną aplikacji
Naszym celem jest wdrożenie hibernacji jako odwracalnego działania, aby aplikacja była nadal dostępna dla użytkownika w Menu i na innych platformach, a dane aplikacji pozostały nienaruszone. Po uruchomieniu aplikacji przywrócimy ją ze stanu wymuszania i kontynuujemy tworzenie plików ODEX i VDEX.
Planowany projekt skupia się na 2 głównych elementach:
- Określanie, kiedy pakiet powinien przejść w stan hibernacji
- Optymalizacja pakietu do hibernacji
Nowa usługa systemowa (AppHibernationService
) i usługa zadania (AppHibernationJobService,
w PermissionController
) to klej, który kontroluje ogólne procesy decyzyjne i logikę.
Określanie, kiedy pakiet powinien przejść w stan hibernacji, jest realizowane głównie przez UsageStatsService
i zarządzane przez AppHibernationJobService
w PermissionController
. Ta logika zasad działa w PermissionController
, dzięki czemu możemy dynamicznie aktualizować je przez Mainline. Dodatkowo planujemy dodać nowy sygnał – użycie komponentów, aby rejestrować wykorzystanie komponentów pakietu (np. usług lub dostawców treści) jako nowych danych w usłudze UsageStatsService
.
Optymalizacja pakietu to proces, w którym zachodzą wszystkie rzeczywiste oszczędności i optymalizacje. AppHibernationService
komunikuje się z różnymi częściami systemu, aby zatrzymać pakiet, usunąć dane z pamięci podręcznej, usunąć artefakty ART itp.
Odwołanie uprawnień jest inicjowane bezpośrednio z poziomu AppHibernationJobService
, aby zachować funkcję automatycznego odwoływania na urządzeniach z Androidem 11 i starszych.
Interfejs użytkownika
Użytkownik otrzymuje informacje o tym, które aplikacje mogą być przełączane w stan hibernacji, oraz ma nad nimi kontrolę.
Podobnie jak w przypadku automatycznego odwoływania, użytkownik otrzymuje powiadomienie o tym, które aplikacje są w trybie hibernacji, i może bezpośrednio z powiadomienia przejść do ustawień, aby otworzyć aplikację i wyprowadzić ją z trybu hibernacji lub w razie potrzeby usunąć nieużywaną aplikację.
Nadal wspieramy intencję dewelopera polegającą na prośbie o wyłączenie hibernacji przez użytkownika przy użyciu istniejących uprawnień do automatycznego odwoływania uprawnień.
Zgodność wsteczna
Funkcje dotyczące hibernacji są dostępne od Androida 12. Ta funkcja nie mogła działać we wcześniejszych wersjach, ponieważ nie ma komponentów platformy (takich jak nowa usługa systemowa). Funkcja automatycznego anulowania w dalszym ciągu działa tak, jak została wdrożona we wcześniejszych wersjach systemu operacyjnego.
Aby zapewnić zgodność wsteczną, w Androidzie 12 na stronie aplikacji w sekcji Aplikacje i powiadomienia w Ustawieniach dodano przełącznik hibernacji, zachowując jednocześnie oryginalny przełącznik automatycznego odwoływania w menu Uprawnienia. Ten przełącznik umożliwia wyłączenie hibernacji aplikacji w ogóle.
Dostosowywanie
Część implementacji jest częścią modułowego komponentu systemu, dlatego partnerzy nie powinni modyfikować tej funkcji. Zamiast tego partnerzy mogą wdrożyć podobne funkcje, o ile spełniają wymagania CDD.
Tryb hibernacji aplikacji powinien być domyślnie włączony we wszystkich aplikacjach kierowanych na Androida 11 lub nowszego. To samo dotyczy automatycznego odwoływania uprawnień. To ustawienie może być włączone, ale implementacja hibernacji aplikacji może się różnić w przypadku aplikacji kierowanych na Androida 11 i 12. Dokładniej rzecz biorąc, hibernacja aplikacji działa tylko w przypadku aplikacji kierowanych na Androida 11, podczas gdy w przypadku aplikacji kierowanych na Androida 12 jest to właściwie tylko automatyczne cofnięcie uprawnień.
Producenci OEM mogą też wdrażać podobne funkcje. Te funkcje są jednak ukierunkowane na znacznie krótsze okresy optymalizacji baterii, które mogą być związane z OEM. Wszelkie podobne funkcje ograniczania dostępu do aplikacji opracowane przez producentów OEM mogą współistnieć z systemem hibernacji aplikacji, o ile spełniają istniejące kryteria określone w CDD.
Testowanie
Tryb hibernacji aplikacji jest objęty testami CTS i testami jednostkowymi, aby mieć pewność, że działa prawidłowo.
AutoRevokeTest
AppHibernationIntegrationTest