Zrzuty zadań

Zrzuty ekranu zadań to infrastruktura wprowadzona w Androidzie 8.0, która łączy zrzuty ekranu Najnowsze miniatury oraz Zapisane powierzchnie z Menedżera okien. Miniatury ostatnich elementów przedstawiają ostatni stan zadania w widoku Ostatnie.

Gdy aktywność weszła w stan zatrzymania, menedżer okien nie niszczył powierzchni tej aktywności, dopóki była ona na szczycie zadania. Jeśli ta aktywność musiała zostać wyświetlona ponownie, Menedżer okien mógł rozpocząć animację bez oczekiwania na zakończenie rysowania pierwszego kadru, ponieważ mógł użyć tej zapisanej powierzchni.

Architektura

Oba te pojęcia (miniatury ostatnio używanych aplikacji i zapisane powierzchnie) są zjednoczone z migawkami zadań. Gdy zadanie przechodzi na drugi plan, menedżer okien umieszcza zrzut ekranu tego zadania w buforze graficznym. Dopóki aplikacja z największą aktywnością zadania pozostaje w pamięci, ten bufor graficzny będzie w niej zatrzymywany. Gdy to samo działanie zostanie ponownie przywrócone do przodu, WindowManager utworzy okno startowe (TaskSnapshotSurface) i dołączy do niego GraphicBuffer bez kopiowania jakiejkolwiek pamięci do kolejki buforów okna startowego. Gdy tylko aktywność wyświetli pierwszy kadr, okno początkowe migawki zadania będzie płynnie znikać, tak jak zwykłe ekrany powitalne.

Ta sama pętla graficzna jest również wysyłana przez Binder do SystemUI, aby służyć do wyświetlania stanu podglądu zadania w widoku Ostatnie. Ponieważ jest to tylko odniesienie do bufora, wysyłanie go przez binder zużywa niewiele zasobów. Gdy dane GraphicBuffer dotrą do SystemUI, zostaną zapakowane w ramkę Bitmap i wyświetlone na ekranie bez przesyłania do pamięci graficznej.

Zalety

Ta nowa architektura ma 3 główne zalety:

  • Jeśli zrzut ekranu zadania jest używany jako okno początkowe, następuje płynne przejście między zrzutem ekranu a rzeczywistymi treściami.
  • Gdy zrzut ekranu zadania jest tworzony w 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 przechowuje migawkę bezpośrednio w pamięci graficznej, nie jest wymagane kopiowanie.
  • Stan widoczny w sekcji Ostatnie zawsze odpowiada temu, który zobaczysz po ponownym otwarciu aplikacji. Dzięki temu, że używamy tego samego bufora, oszczędzamy też dużo pamięci. Dlatego w sekcji Ostatnie można teraz wyświetlać te obrazy w pełnej rozdzielczości. Wcześniej próbkowanie było zmniejszane o 64%, aby oszczędzać pamięć.

Implementacja

Ta funkcja jest dostępna tylko na platformie Android. Nie jest wymagana integracja, a niestandardowe rozwiązania nie są obsługiwane. Producenci urządzeń mogą jednak całkowicie wyłączyć funkcję zrzutów ekranu.

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

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 stanu 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 przez ich odpowiedniki o wysokiej rozdzielczości. Ta optymalizacja przyspiesza wczytywanie obrazów. W przeciwnym razie może wystąpić niewielkie opóźnienie podczas odczytu pliku migawki z dysku, a użytkownik zobaczy pustą kartę zadania do czasu, aż obraz będzie dostępny. Skale możesz skonfigurować w pliku konfiguracji nakładki urządzenia overlay/frameworks/base/core/res/res/values/config.xml, ustawiając wartości config_highResTaskSnapshotScaleconfig_lowResTaskSnapshotScale. Domyślnie te wartości wynoszą odpowiednio 1,0 i 0,5. Aby wyłączyć zrzuty 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 tych miejscach:

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