Aufgaben-Snapshots

Task Snapshots ist eine in Android 8.0 eingeführte Infrastruktur, die Screenshots für Thumbnails für zuletzt verwendete Apps sowie Gespeicherte Oberflächen aus dem Window Manager kombiniert. Die Miniaturansichten auf dem Tab „Letzte“ zeigen den letzten Status einer Aufgabe an.

Wenn eine Aktivität in den Status „Beendet“ wechselte, hat Window Manager die Oberflächen der Aktivität nicht zerstört, solange sich die Aktivität oben im Task befand. Wenn diese Aktivität noch einmal angezeigt werden musste, konnte der Window Manager die Animation starten, ohne darauf zu warten, dass die Aktivität ihren ersten Frame zeichnet, da er diese gespeicherte Oberfläche verwenden konnte.

Architektur

Die beiden Konzepte „Miniaturansichten der letzten Elemente“ und „Gespeicherte Oberflächen“ werden mit Task-Snapshots zusammengeführt. Wenn eine Aufgabe in den Hintergrund wechselt, speichert der Window Manager einen Screenshot dieser Aufgabe in einem GraphicBuffer. Solange die App der wichtigsten Aktivität der Aufgabe im Arbeitsspeicher verbleibt, wird dieser GraphicBuffer im Arbeitsspeicher beibehalten. Wenn dieselbe Aktivität wieder in den Vordergrund gerückt wird, erstellt WindowManager ein Startfenster (TaskSnapshotSurface) und hängt den GraphicBuffer an, ohne Speicher in die Pufferwarteschlange des Startfensters zu kopieren. Sobald die Aktivität den ersten Frame gezeichnet hat, wird das Startfenster für die Aufgabenübersicht wie bei regulären Startbildschirmen ausgeblendet.

Derselbe GraphicBuffer wird auch über Binder an SystemUI gesendet, um den Vorschaustatus einer Aufgabe in der Ansicht „Letzte Apps“ zu zeichnen. Da es sich nur um einen Verweis auf einen Puffer handelt, werden beim Senden über Binder nur wenige Ressourcen verbraucht. Wenn der GraphicBuffer in SystemUI ankommt, wird er in eine Hardware-Bitmap verpackt und dann auf dem Bildschirm gezeichnet, ohne dass Speicher in den Grafikspeicher hochgeladen wird.

Vorteile

Diese neue Architektur bietet drei Hauptvorteile:

  • Wenn der Aufgaben-Snapshot als Startfenster verwendet wird, gibt es einen schönen Crossfade-Effekt zwischen dem Snapshot und dem tatsächlichen Inhalt.
  • Wenn der Aufgaben-Snapshot in der SystemUI gerendert wird, kann dies ohne Kopieren erfolgen. Bisher musste die Bitmap in Ashmem und dann in den Grafikspeicher kopiert werden. Da bei dieser Methode der Snapshot direkt im Grafikspeicher gespeichert wird, ist kein Kopieren erforderlich.
  • Der Status, den Sie unter „Zuletzt verwendet“ sehen, entspricht immer dem Status, der beim erneuten Öffnen der App zuerst angezeigt wird. Durch die Verwendung desselben Puffers wird auch viel Speicherplatz gespart. Deshalb können diese Bilder jetzt in „Letzte“ in voller Auflösung angezeigt werden. Zuvor wurde die Auflösung um 64% reduziert, um Speicherplatz zu sparen.

Implementierung

Diese Funktion ist ausschließlich auf der Android-Plattform verfügbar. Es ist keine Integration erforderlich und Anpassungen werden nicht unterstützt. Gerätehersteller können die Funktion „Task-Snapshots“ jedoch vollständig deaktivieren.

So deaktivieren Sie diese Funktion:

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

Wenn die Funktion deaktiviert ist, werden in der Ansicht „Zuletzt verwendet“ keine Thumbnails angezeigt.

Hoch- und niedrigauflösende Snapshots

Aufgaben-Snapshots werden in zwei Größen auf die Festplatte geschrieben. Beim Wiederherstellen eines Task-Snapshots von der Festplatte werden zuerst Snapshots mit niedriger Auflösung gelesen und dann durch das entsprechende Bild mit hoher Auflösung ersetzt. Diese Optimierung verkürzt die Ladezeiten für Bilder. Andernfalls kann es zu einer leichten Verzögerung beim Lesen der Snapshot-Datei von der Festplatte kommen und der Nutzer sieht eine leere Aufgabenkarte, bis das Bild verfügbar ist. Sie können die Skalierungen in der Geräte-Overlay-Konfigurationsdatei overlay/frameworks/base/core/res/res/values/config.xml konfigurieren, indem Sie config_highResTaskSnapshotScale und config_lowResTaskSnapshotScale festlegen. Standardmäßig sind diese Werte auf 1,0 bzw. 0,5 festgelegt. Deaktivieren Sie Snapshots mit niedriger Auflösung, indem Sie config_lowResTaskSnapshotScale auf 0,0 setzen.

Beispiele und Quelle

Den restlichen Code für diese Funktion finden Sie in den TaskSnapshot*-Dateien unter:

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