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.
Funkcja hibernacji aplikacji powoduje przejście aplikacji w stan hibernacji, jeśli użytkownik nie używa ich od kilku miesięcy. Działa to podobnie do automatycznego anulowania uprawnień. Spowoduje to wymuszenie zatrzymania aplikacji i przejście w stan, w którym optymalizujemy miejsce na dane zamiast wydajności. Automatyczne odwoływanie uprawnień jest również dostępne w tym stanie i ma te same ustawienia wyjątku 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, aplikacja wyjdzie z hibernacji i znów będzie działać normalnie. 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 wdrożeniem 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.
- Własny mechanizm ograniczeń OEM podobny do hibernacji aplikacji może spełniać podobny cel. Oba mogą występować jednocześnie, ale mogą też na siebie zachodzić.
Dokument CDD zawiera nowy zestaw wymagań dotyczących zmian wprowadzanych na podstawie sposobu korzystania z aplikacji, podobnych do wymagań określonych w obecnym punkcie 3.5.1. Tryb hibernacji aplikacji podlega tym wymaganiom.
Kod platformy znajduje się w tych miejscach:
- repozytorium: platform/frameworks/base
- katalog: services/core/java/com/android/server/apphibernation
Logika zasad znajduje się w tych miejscach:
- repo: platform/packages/modules/Permission
- katalog: PermissionController/src/com/android/permissioncontroller/hibernation
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ąć te 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ą do stanu przed przymusowym zatrzymaniem i w zwykły sposób 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 hibernowanego pakietu
Nowa usługa systemowa AppHibernationService
i usługa zadania AppHibernationJobService,
w PermissionController
to elementy, które kontrolują ogólną logikę i proces podejmowania decyzji.
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 znajduje się w PermissionController
, aby umożliwić nam dynamiczne aktualizowanie za pomocą Mainline. Planujemy też dodanie nowego sygnału, czyli użycia komponentu, aby rejestrować użycie komponentów pakietu (np. usług, dostawców treści) jako nowy rodzaj danych w 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 lub niższym.
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ą uśpione, i może przejść bezpośrednio do ustawień, aby otworzyć aplikację i wyjść z uśpienia lub w razie potrzeby usunąć nieużywaną aplikację.
Nadal wspieramy intencję dewelopera polegającą na prośbie o wyłączenie hibernacji z dotychczasowym zamiarem automatycznego wycofania uprawnień.
Zgodność wsteczna
Funkcje związane z hibernacją są dostępne od Androida 12. Ta funkcja nie działała w poprzednich wersjach, ponieważ brakowało w nich komponentów platformy (np. nowej usługi systemowej). Automatyczne odwoływanie nadal działa tak samo jak w poprzednich wersjach systemu operacyjnego.
Aby zapewnić zgodność wsteczną, w Androidzie 12 na stronie aplikacji w sekcji Aplikacje i powiadomienia w Ustawieniach dodano przełącznik trybu 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. Partnerzy mogą zamiast tego stosować podobne funkcje, o ile spełniają wymagania dotyczące zgodności danych.
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ń. Chociaż samo ustawienie może być włączone, hibernacja aplikacji może być inaczej implementowana w przypadku aplikacji przeznaczonych na Androida 11 i Androida 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ń.
Dodatkowo producenci urządzeń mogą wdrażać podobne funkcje. Te funkcje są jednak ukierunkowane na znacznie krótszy czas optymalizacji baterii, który może być zależny od producenta. 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