Migawki zadań

Migawki zadań to infrastruktura wprowadzona w systemie Android 8.0, która łączy zrzuty ekranu dla miniatur ostatnich i zapisanych powierzchni z Menedżera okien. Miniatury ostatnich reprezentują ostatni stan zadania w widoku Ostatnie.

Kiedy działanie przeszło w stan zatrzymania, Menedżer okien nie niszczył powierzchni działania, o ile działanie to znajdowało się na szczycie zadania. Jeśli czynność ta miała zostać pokazana ponownie, Menedżer okien mógł rozpocząć animację bez czekania, aż czynność zakończy rysowanie pierwszej klatki, ponieważ mógł wykorzystać zapisaną powierzchnię.

Architektura

Dwie koncepcje Miniatur ostatnich i Zapisanych powierzchni są ujednolicone w Migawkach zadań. Kiedy zadanie przechodzi w tło, Menedżer okien umieszcza zrzut ekranu tego zadania w GraphicBuffer. Tak długo, jak zastosowanie najwyższej aktywności zadania pozostanie w pamięci, ten GraphicBuffer zostanie zachowany w pamięci. Teraz, gdy ta sama czynność zostanie ponownie wysunięta na pierwszy plan, Menedżer okien utworzy okno startowe (TaskSnapshotSurface) i dołączy GraphicBuffer bez kopiowania jakiejkolwiek pamięci do kolejki buforów okna startowego. Gdy tylko aktywność wyświetli pierwszą klatkę, okno początkowe Migawki zadania zniknie płynnie, jak zwykłe ekrany powitalne.

Ten sam bufor graficzny jest również wysyłany przez Binder do SystemUI w celu użycia go do narysowania stanu podglądu zadania w widoku Ostatnie. Ponieważ jest to tylko odniesienie do bufora, przesłanie go za pomocą segregatora zużywa niewiele zasobów. Kiedy GraphicBuffer dociera do SystemUI, jest pakowany w sprzętową bitmapę, a następnie rysowany na ekranie bez przesyłania pamięci do pamięci graficznej.

Korzyści

Ta nowa architektura ma trzy główne zalety:

  • Jeśli migawka zadania jest używana jako okno początkowe, pomiędzy migawką a rzeczywistą zawartością występuje ładne przejście.
  • Po narysowaniu migawki zadania w SystemUI można to zrobić bez kopiowania. Wcześniej bitmapę trzeba było kopiować do Ashmem, a następnie do pamięci graficznej. Ponieważ ta metoda przechowuje migawkę bezpośrednio w pamięci graficznej, nie jest potrzebne kopiowanie.
  • Stan widoczny w Ostatnich zawsze odpowiada stanowi, który zobaczysz po raz pierwszy po ponownym otwarciu aplikacji. Posiadanie tego samego bufora pozwala również zaoszczędzić dużo pamięci. Dlatego w aplikacji Ostatnie można teraz wyświetlać te obrazy w pełnej rozdzielczości. Poprzednio próbkowanie było zmniejszone o 64%, aby zaoszczędzić pamięć.

Realizacja

Ta funkcja istnieje w całości na platformie Android. Nie jest wymagana integracja i 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, widok Ostatnie nie będzie wyświetlał żadnych miniatur.

Migawki w wysokiej i niskiej rozdzielczości

Migawki zadań są zapisywane na dysku w dwóch skalach. Podczas przywracania migawki zadania z dysku najpierw odczytywane są migawki w niskiej rozdzielczości, a następnie zastępowane przez ich odpowiedniki w wysokiej rozdzielczości. Ta optymalizacja skraca czas ładowania obrazu. W przeciwnym razie może wystąpić niewielkie opóźnienie podczas odczytywania pliku migawki z dysku, a użytkownik będzie widział pustą kartę zadań do czasu udostępnienia obrazu. Możesz skonfigurować skale w pliku konfiguracyjnym nakładki urządzenia overlay/frameworks/base/core/res/res/values/config.xml ustawiając config_highResTaskSnapshotScale i config_lowResTaskSnapshotScale . Domyślnie są one ustawione odpowiednio na 1,0 i 0,5. Wyłącz migawki w niskiej rozdzielczości, ustawiając config_lowResTaskSnapshotScale na 0.0.

Przykłady i źródło

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

frameworks/base/+/main/services/core/java/com/android/server/wm/