Zrzuty zadań

Migawek zadań to infrastruktura wprowadzona w Androidzie 8.0, która łączy zrzuty ekranu na potrzeby Miniatur ostatnio używanych aplikacji oraz Zapisanych powierzchni z Menedżera okien. Miniatury ostatnio używanych aplikacji przedstawiają ostatni stan zadania w widoku Ostatnio używane.

Gdy aktywność przechodziła w stan zatrzymania, Menedżer okien nie niszczył powierzchni aktywności, dopóki ta aktywność znajdowała się na wierzchu zadania. Jeśli ta aktywność miała być ponownie wyświetlona, Menedżer okien mógł rozpocząć animację bez czekania, aż aktywność zakończy rysowanie pierwszej klatki, ponieważ mógł użyć tej zapisanej powierzchni.

Architektura

Dwie koncepcje – miniatury ostatnio używanych aplikacji i zapisane powierzchnie – są ujednolicone w migawkach zadań. Gdy zadanie przechodzi w stan działania w tle, Menedżer okien umieszcza zrzut ekranu tego zadania w GraphicBuffer. Dopóki aplikacja z aktywnością na wierzchu zadania pozostaje w pamięci, ten GraphicBuffer będzie przechowywany w pamięci. Gdy ta sama aktywność zostanie ponownie przeniesiona na pierwszy plan, Menedżer okien 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 będzie się płynnie wygaszać, tak jak zwykłe ekrany powitalne.

Ten sam GraphicBuffer jest też wysyłany przez Binder do SystemUI, aby można go było użyć do narysowania stanu podglądu zadania w widoku Ostatnio używane. Ponieważ jest to tylko odniesienie do bufora, wysłanie go przez Binder zużywa niewiele 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.

Korzyści

Ta nowa architektura ma 3 główne zalety:

  • Jeśli migawka zadania jest używana jako okno początkowe, następuje płynne przejście między migawką a rzeczywistą treścią.
  • Gdy migawka zadania jest rysowana w SystemUI, można to zrobić bez kopiowania. Wcześniej bitmapę trzeba było skopiować do Ashmem, a potem do pamięci graficznej. Ponieważ ta metoda zapisuje migawkę bezpośrednio w pamięci karty graficznej, nie jest potrzebne kopiowanie.
  • Stan, który widzisz w widoku Ostatnio używane, zawsze odpowiada stanowi, który zobaczysz po ponownym otwarciu aplikacji. Używanie tego samego bufora pozwala też zaoszczędzić dużo pamięci. Dlatego widok Ostatnio używane może teraz wyświetlać te obrazy w pełnej rozdzielczości. Wcześniej, aby zaoszczędzić pamięć, rozdzielczość była zmniejszana o 64%.

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 Ostatnio używane nie będą wyświetlane żadne miniatury.

Migawki w wysokiej i niskiej rozdzielczości

Migawki zadań są zapisywane na dysku w 2 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 przyspiesza wczytywanie obrazów. W przeciwnym razie podczas odczytywania pliku migawki z dysku może wystąpić niewielkie opóźnienie, a użytkownik będzie widzieć pustą kartę zadania, dopóki obraz nie będzie dostępny. Skale możesz skonfigurować w pliku konfiguracyjnym nakładki urządzenia overlay/frameworks/base/core/res/res/values/config.xml, ustawiając wartości config_highResTaskSnapshotScale i config_lowResTaskSnapshotScale. Domyślnie są one ustawione odpowiednio na 1.0 i 0.5. Aby wyłączyć migawki w niskiej rozdzielczości, ustaw wartość config_lowResTaskSnapshotScale na 0.0.

Przykłady i źródło

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

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