Hibernacja aplikacji

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 wyłączenie aplikacji, których użytkownik nie używa od kilku miesięcy, podobnie jak automatyczne anulowanie 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 nakładać.

Dokument CDD zawiera nowy zestaw wymagań dotyczących zmian wprowadzanych na podstawie sposobu korzystania z aplikacji, podobnych do wymagań z obecnego punktu 3.5.1. Tryb hibernacji aplikacji podlega tym wymaganiom.

Kod platformy znajduje się w tych miejscach:

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, gdy hibernujemy aplikację,

  • 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 nową miarę 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 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ą 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 wyjątkiem automatycznego unieważnienia uprawnień.

Zgodność wsteczna

Funkcje związane z hibernacją są dostępne od Androida 12. Ta funkcja nie działa w wersjach starszych, ponieważ brakuje 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 powiadomieniaUstawieniach 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 tylko 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 kierowanych 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 przeznaczone do optymalizacji baterii w ramach znacznie krótszego okresu, co może 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.