Przeciętny użytkownik Androida instaluje na swoich urządzeniach ponad 50 aplikacji (liczba ta rośnie wraz z ilością pamięci RAM w urządzeniach). Jednak znaczna liczba 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 automatyczne cofanie uprawnień. Wymusza to zatrzymanie aplikacji i przełącza ją w stan, w którym optymalizujemy ją pod kątem miejsca na dane, a nie wydajności. Automatyczne cofanie uprawnień jest również powiązane z tym stanem i korzysta z tego samego ustawienia wykluczenia w sekcji Ustawienia. Wymuszone zatrzymanie aplikacji uniemożliwia jej wykonywanie zadań i wysyłanie alertów w tle oraz wysyłanie powiadomień push. Gdy użytkownik ponownie użyje aplikacji, zostanie ona wybudzona z hibernacji, a zadania, alerty i powiadomienia będą działać jak zwykle. Wszystkie zadania, alerty i powiadomienia zaplanowane przed przejściem aplikacji w stan hibernacji trzeba zaplanować ponownie.
Modyfikacje platformy wprowadzane przez producentów OEM mogą powodować konflikty z implementacją hibernacji aplikacji. Przykład:
- Modyfikowanie definicji użycia aplikacji lub wprowadzanie sposobów wybudzania aplikacji, które nie są dostępne w AOSP, może zakłócić dokładność hibernacji aplikacji.
- Mechanizm ograniczeń zastrzeżony przez producenta OEM, podobny do hibernacji aplikacji, może pełnić podobną funkcję. Oba mechanizmy mogą współistnieć, ale mogą się częściowo pokrywać.
Dokument CDD zawiera nowy zestaw wymagań dotyczących zmian opartych na użyciu aplikacji, podobnych do obecnego 3.5.1 wymagania. Hibernacja aplikacji jest zgodna z tymi wymaganiami.
Kod platformy znajduje się w tych lokalizacjach:
- repo: platform/frameworks/base
- directory: services/core/java/com/android/server/apphibernation
Logika zasad znajduje się w tych lokalizacjach:
- repo: platform/packages/modules/Permission
- directory: PermissionController/src/com/android/permissioncontroller/hibernation
Architektura wysokiego poziomu
Usługa systemowa hibernacji aplikacji optymalizuje rzadko używane aplikacje użytkownika pod kątem miejsca na dane i uniemożliwia im działanie w tle. Aby osiągnąć te wyniki, gdy hibernujemy aplikację, wykonujemy te czynności:
- Automatycznie cofamy uprawnienia.
- Wymuszamy zatrzymanie aplikacji.
- Usuwamy pliki ODEX i VDEX.
- Usuwamy pamięć podręczną aplikacji.
Naszym celem jest wdrożenie hibernacji jako działania odwracalnego, aby aplikacja była nadal dostępna dla użytkownika w Launcherze i innych miejscach z nienaruszonymi danymi aplikacji. Po uruchomieniu aplikacji przywrócimy ją ze stanu wymuszonego zatrzymania i będziemy kontynuować tworzenie plików ODEX i VDEX jak zwykle.
Planowany projekt opiera się na 2 głównych częściach:
- Określanie, kiedy pakiet powinien przejść w stan hibernacji.
- Optymalizowanie hibernującego pakietu.
Nowa usługa systemowa,
AppHibernationService, i usługa zadań, AppHibernationJobService,
wPermissionController to elementy, które kontrolują ogólne podejmowanie decyzji
i logikę.
Określanie, kiedy pakiet powinien przejść w stan hibernacji, opiera się głównie na usłudze UsageStatsService i jest zarządzane przez usługę AppHibernationJobService w PermissionController. Ta logika zasad znajduje się w PermissionController, aby umożliwić nam dynamiczne aktualizowanie jej za pomocą Mainline. Dodatkowo planujemy dodanie nowego sygnału, użycia komponentu, aby rejestrować użycie komponentów pakietu (np. usług, dostawców treści) jako nowej wartości w UsageStatsService.
Optymalizacja pakietu to miejsce, w którym następuje rzeczywiste oszczędzanie i optymalizacja. AppHibernationService komunikuje się z różnymi częściami systemu, aby zatrzymać pakiet, usunąć dane z pamięci podręcznej, usunąć artefakty ART itp.
Cofanie uprawnień jest inicjowane bezpośrednio z AppHibernationJobService, aby zachować funkcję automatycznego cofania uprawnień na urządzeniach z Androidem 11 i starszymi wersjami.
Wrażenia użytkownika
Użytkownik ma dostęp do informacji i elementów sterujących, które pozwalają mu określić, które aplikacje mogą być hibernowane.
Podobnie jak w przypadku automatycznego cofania uprawnień użytkownik otrzymuje powiadomienie o tym, które aplikacje są hibernowane, i ma możliwość przejścia do Ustawień bezpośrednio z powiadomienia, aby otworzyć aplikację i wybudzić ją z hibernacji lub usunąć nieużywaną aplikację, jeśli jest to wymagane.
Nadal obsługujemy intencję dewelopera, aby poprosić użytkownika o wyłączenie hibernacji, za pomocą obecnej intencji wyłączenia automatycznego cofania uprawnień.
Zgodność wsteczna
Funkcje związane z hibernacją są dostępne od Androida 12. Ta funkcja nie działa w starszych wersjach, ponieważ nie ma w nich komponentów platformy (np. nowej usługi systemowej). Automatyczne cofanie uprawnień nadal działa tak, jak zostało zaimplementowane w starszych wersjach systemu operacyjnego.
Aby zapewnić zgodność wsteczną, w Androidzie 12 dodaliśmy przełącznik hibernacji na stronie aplikacji w sekcji Aplikacje i powiadomienia w Ustawieniach, zachowując oryginalny przełącznik automatycznego cofania uprawnień w podmenu Uprawnienia. Ten przełącznik kontroluje ogólne wyłączenie hibernacji aplikacji w systemie.
Dostosowywanie
Część implementacji jest częścią modułowego komponentu systemu, dlatego odradzamy partnerom modyfikowanie tej funkcji. Partnerzy mogą zamiast tego wdrożyć podobne funkcje, o ile będą one zgodne z wymaganiami CDD.
Hibernacja aplikacji powinna być domyślnie włączona w przypadku wszystkich aplikacji kierowanych na Androida 11 lub nowszego. Jest to takie samo ustawienie jak automatyczne cofanie uprawnień. Chociaż samo ustawienie może być włączone, implementacja hibernacji aplikacji może się różnić w zależności od tego, czy aplikacja jest kierowana na Androida 11 czy Androida 12. Hibernacja aplikacji działa tylko w przypadku aplikacji kierowanych na Androida 11, natomiast w przypadku aplikacji kierowanych na Androida 12 jest to w zasadzie tylko automatyczne cofanie uprawnień.
Producenci OEM mogą też wdrażać podobną funkcję. Te funkcje są jednak ukierunkowane na znacznie krótszy czas optymalizacji baterii, który może być specyficzny dla producenta OEM. Wszystkie podobne funkcje ograniczania aplikacji opracowane przez producentów OEM mogą współistnieć z systemem hibernacji aplikacji o ile spełniają obecne kryteria określone w CDD.
Testowanie
Hibernacja aplikacji ma testy CTS i testy jednostkowe, które zapewniają jej prawidłowe działanie.
AutoRevokeTestAppHibernationIntegrationTest