Hibernacja aplikacji

Przeciętny użytkownik Androida instaluje na swoich urządzeniach ponad 50 aplikacji (liczba ta rośnie wraz ze wzrostem poziomu pamięci RAM urządzeń). Jednak znaczna liczba tych aplikacji pozostaje nieuż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 wprowadzenie jej w stan, w którym optymalizujemy pod kątem przechowywania, a nie wydajności. Automatyczne cofanie uprawnień jest również powiązane z tym stanem i ma takie samo ustawienie wyjątków w Ustawieniach . Wymuszone zatrzymanie aplikacji nie uruchamia zadań ani alertów w tle i nie może wysyłać powiadomień push. Gdy użytkownik ponownie użyje aplikacji, aplikacja wyjdzie ze stanu hibernacji, a zadania/alerty/powiadomienia zostaną uruchomione ponownie w zwykły sposób. Wszelkie zadania/alerty/powiadomienia zaplanowane przed przejściem aplikacji w stan hibernacji należy zaplanować ponownie.

Producenci OEM modyfikujący platformę mogą powodować konflikty z implementacją hibernacji aplikacji. Na przykład

  • Modyfikowanie definicji użycia aplikacji lub wprowadzenie sposobów wybudzania aplikacji, która nie znajduje się w AOSP, może zakłócić dokładność hibernacji aplikacji
  • Zastrzeżony mechanizm ograniczeń producenta OEM, podobny do hibernacji aplikacji, może mieć podobny cel. Chociaż oba mogą istnieć, mogą w pewnym stopniu się pokrywać.

CDD przedstawia nowy zestaw wymagań dotyczących zmian opartych na użyciu aplikacji, podobny do istniejącego wymagania 3.5.1 . Hibernacja aplikacji spełnia te wymagania.

Kod frameworka znajduje się w:

Logika polityki żyje w:

  • repo: platforma/pakiety/moduły/Pozwolenie
  • katalog: PermissionController/src/com/android/permissioncontroller/hibernation

Architektura na wysokim poziomie

Usługa systemowa App Hibernation optymalizuje rzadko używane aplikacje użytkownika pod kątem przechowywania i zapobiega działaniu tych aplikacji w tle. Aby osiągnąć te wyniki, hibernując aplikację, w szczególności:

  • Automatyczne cofanie uprawnień
  • Wymuś zatrzymanie aplikacji
  • Usuń pliki ODEX i VDEX
  • Usuń pamięć podręczną aplikacji

Naszym celem jest wdrożenie hibernacji jako działania odwracalnego, aby aplikacja była nadal dostępna dla użytkownika za pośrednictwem Launchera i innych platform z nienaruszonymi danymi aplikacji. Po uruchomieniu aplikacji przywrócimy ją ze stanu wymuszonego zatrzymania i będziemy kontynuować tworzenie plików ODEX i VDEX w zwykły sposób.

Planowany projekt skupia się wokół dwóch głównych części:

  • określanie, kiedy pakiet powinien przejść w stan hibernacji
  • optymalizacja pakietu hibernującego

Nowa usługa systemowa AppHibernationService i usługa zadań AppHibernationJobService, w PermissionController to spoiwo kontrolujące ogólny proces podejmowania decyzji i logikę.

Określanie, kiedy pakiet powinien przejść w stan hibernacji, jest głównie obsługiwane przez UsageStatsService i zarządzane przez AppHibernationJobService w PermissionController . Ta logika zasad znajduje się w PermissionController , aby umożliwić nam dynamiczną aktualizację za pośrednictwem Mainline. Ponadto planujemy dodać nowy sygnał, użycie komponentów, aby uchwycić wykorzystanie komponentów pakietu (na przykład usługi, dostawcy treści) jako nową metrykę w UsageStatsService .

Optymalizacja pakietu to miejsce, w którym mają miejsce wszystkie rzeczywiste oszczędności/optymalizacje. AppHibernationService komunikuje się z różnymi częściami systemu, aby zatrzymać pakiet, usunąć dane z pamięci podręcznej, usunąć artefakty ART i tak dalej. Cofanie uprawnień jest inicjowane bezpośrednio z AppHibernationJobService , aby zachować funkcję automatycznego cofania uprawnień na urządzeniach z Androidem 11 i starszymi.

Doświadczenie użytkownika

Użytkownik otrzymuje zarówno informacje, jak i kontrolę nad tym, które aplikacje można hibernować.

Podobnie jak w przypadku automatycznego unieważniania, użytkownik otrzymuje powiadomienie o tym, które aplikacje są w stanie hibernacji i ma możliwość przejścia do Ustawień bezpośrednio z poziomu powiadomienia, aby otworzyć aplikację i wyprowadzić ją ze stanu hibernacji lub w razie potrzeby usunąć nieużywaną aplikację.

Nadal popieramy zamiar dewelopera polegający na poproszeniu użytkownika o zwolnienie ze stanu hibernacji za pomocą istniejącego zamiaru zwolnienia polegającego na automatycznym cofaniu uprawnień.

Kompatybilność wsteczna

Funkcje specyficzne dla hibernacji są dostępne począwszy od Androida 12. Te funkcje nie mogły działać we wcześniejszych wersjach, ponieważ nie ma komponentów platformy (takich jak nowa usługa systemowa). Automatyczne unieważnianie nadal działa tak, jak zostało to obecnie zaimplementowane we wcześniejszych wersjach systemu operacyjnego.

Począwszy od Androida 12, aby zapewnić kompatybilność wsteczną, na stronie aplikacji w sekcji Aplikacje i powiadomienia w Ustawieniach dodano przełącznik hibernacji, zachowując jednocześnie oryginalny przełącznik automatycznego unieważniania w podmenu Uprawnienia . Ten przełącznik kontroluje ogólne wyłączenie aplikacji z systemu hibernacji aplikacji.

Dostosowywanie

Ponieważ część implementacji stanowi część modułowego komponentu systemu, odradza się partnerom modyfikowanie tej funkcji. Partnerzy mogą zamiast tego wdrożyć podobne funkcje/funkcjonalność, o ile przestrzegają wymagań CDD.

Hibernacja aplikacji powinna być domyślnie włączona dla wszystkich aplikacji przeznaczonych dla systemu Android 11 lub nowszego. Działa to tak samo, jak automatyczne cofanie uprawnień. Chociaż samo ustawienie może być włączone, implementacja hibernacji aplikacji może różnić się w przypadku aplikacji przeznaczonych na Androida 11 i Androida 12. Mówiąc dokładniej, hibernacja aplikacji działa tylko w przypadku aplikacji przeznaczonych na Androida 11, podczas gdy w zasadzie jest to po prostu automatyczne unieważnianie w przypadku aplikacji przeznaczonych na Androida 12.

Ponadto producenci OEM mogą wdrażać podobną funkcję. Jednak funkcje te są ukierunkowane na znacznie krótsze ramy czasowe w przypadku optymalizacji baterii, które mogą być specyficzne dla OEM. Wszelkie podobne funkcje ograniczeń 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

Hibernacja aplikacji ma CTS i testy jednostkowe, aby upewnić się, że działa poprawnie.