Zrzuty zadań

Migawki zadań to infrastruktura wprowadzona w Androidzie 8.0, która łączy zrzuty ekranu na potrzeby miniatur ostatnich aplikacji oraz zapisanych powierzchni z Menedżera okien. Miniatury w sekcji Ostatnie przedstawiają ostatni stan zadania w widoku Ostatnie.

Gdy aktywność przechodziła w stan zatrzymania, Menedżer okien nie niszczył powierzchni aktywności, dopóki była ona na górze zadania. Gdyby ta aktywność musiała zostać ponownie wyświetlona, Menedżer okien mógłby rozpocząć animację bez czekania na zakończenie rysowania pierwszej klatki, ponieważ mógłby użyć zapisanej powierzchni.

Architektura

Dwa pojęcia dotyczące miniatur ostatnich i zapisanych powierzchni są ujednolicone w postaci migawek zadań. Gdy zadanie przechodzi w tryb działania w tle, Menedżer okien umieszcza zrzut ekranu tego zadania w obszarze GraphicBuffer. Dopóki aplikacja z najwyższą aktywnością w ramach zadania pozostaje w pamięci, ten bufor GraphicBuffer będzie przechowywany w pamięci. Gdy ta sama aktywność zostanie ponownie przeniesiona na pierwszy plan, WindowManager utworzy okno początkowe (TaskSnapshotSurface) i dołączy do niego GraphicBuffer bez kopiowania pamięci do kolejki buforów okna początkowego. Gdy tylko aktywność narysuje pierwszą klatkę, okno początkowe migawki zadania zniknie płynnie, tak jak zwykłe ekrany powitalne.

Ten sam bufor GraphicBuffer jest też wysyłany przez Binder do SystemUI, aby można było go użyć do narysowania stanu podglądu zadania w widoku Ostatnie. Ponieważ jest to tylko odwołanie do bufora, wysłanie go przez binder wymaga niewielu zasobów. Gdy GraphicBuffer dotrze do SystemUI, zostanie opakowany w bitmapę sprzętową, a następnie narysowany na ekranie bez przesyłania pamięci do pamięci graficznej.

Zalety

Ta nowa architektura ma 3 główne zalety:

  • Jeśli zrzut zadania jest używany jako okno początkowe, następuje płynne przejście między zrzutem a rzeczywistą treścią.
  • Gdy migawka zadania jest rysowana w interfejsie SystemUI, można to zrobić bez kopiowania. Wcześniej bitmapę trzeba było skopiować do pamięci Ashmem, a potem do pamięci graficznej. Ponieważ ta metoda zapisuje migawkę bezpośrednio w pamięci graficznej, nie jest wymagane kopiowanie.
  • Stan, który widzisz w sekcji Ostatnie, zawsze odpowiada stanowi, który zobaczysz po ponownym otwarciu aplikacji. Ten sam bufor oszczędza też dużo pamięci. Dlatego sekcja Ostatnie może teraz wyświetlać te obrazy w pełnej rozdzielczości. Wcześniej była ona próbkowana w dół o 64% w celu zaoszczędzenia pamięci.

Implementacja

Ta funkcja jest dostępna tylko na platformie Android. Nie wymaga integracji, a dostosowywanie nie jest obsługiwane. Producenci urządzeń mogą jednak całkowicie wyłączyć funkcję migawek zadań.

Aby wyłączyć tę funkcję, zmodyfikuj tę funkcję:

frameworks/base/services/core/java/com/android/server/wm/TaskSnapshotController.java#215

Pamiętaj, że jeśli ta funkcja jest wyłączona, w widoku Ostatnie nie będą wyświetlane żadne miniatury.

Zrzuty w wysokiej i niskiej rozdzielczości

Zrzuty zadań są zapisywane na dysku w 2 skalach. Podczas przywracania zrzutu zadania z dysku najpierw odczytywane są zrzuty o niskiej rozdzielczości, a następnie zastępowane zrzutami o wysokiej rozdzielczości. Ta optymalizacja przyspiesza wczytywanie obrazów. W przeciwnym razie odczytanie pliku stanu z dysku może się nieco opóźnić, a użytkownik zobaczy pustą kartę zadania, dopóki obraz nie będzie dostępny. Skale możesz skonfigurować w pliku konfiguracyjnym nakładki urządzeniaoverlay/frameworks/base/core/res/res/values/config.xml, ustawiającconfig_highResTaskSnapshotScaleconfig_lowResTaskSnapshotScale. Domyślnie są one ustawione odpowiednio na 1,0 i 0,5. Wyłącz migawki o niskiej rozdzielczości, ustawiając wartość parametru config_lowResTaskSnapshotScale na 0,0.

Przykłady i źródło

Pozostałą część kodu tej funkcji znajdziesz w plikach TaskSnapshot* w tym folderze:

frameworks/base/+/android16-release/services/core/java/com/android/server/wm/