Aufgaben-Snapshots

Task Snapshots ist eine in Android 8.0 eingeführte Infrastruktur, die Screenshots für aktuelle Miniaturansichten und gespeicherte Oberflächen aus dem Window Manager kombiniert. Aktuelle Miniaturansichten stellen den letzten Status einer Aufgabe in der Ansicht „Letzte“ dar.

Wenn eine Aktivität in einen gestoppten Zustand wechselte, zerstörte Window Manager die Oberflächen der Aktivität nicht, solange sich diese Aktivität an der Spitze der Aufgabe befand. Wenn diese Aktivität erneut angezeigt werden musste, konnte Window Manager die Animation starten, ohne darauf warten zu müssen, dass die Aktivität mit dem Zeichnen ihres ersten Frames fertig war, da diese gespeicherte Oberfläche verwendet werden konnte.

Die Architektur

Die beiden Konzepte „Zuletzt verwendete Miniaturansichten“ und „Gespeicherte Oberflächen“ werden mit Aufgaben-Snapshots vereinheitlicht. Wenn eine Aufgabe in den Hintergrund geht, platziert Window Manager einen Screenshot dieser Aufgabe in einem GraphicBuffer. Solange die Anwendung der obersten Aktivität der Aufgabe im Speicher verbleibt, bleibt dieser GraphicBuffer im Speicher erhalten. Wenn nun dieselbe Aktivität wieder in den Vordergrund gerückt wird, erstellt Window Manager ein Startfenster (TaskSnapshotSurface) und hängt den GraphicBuffer an, ohne Speicher in die Pufferwarteschlange des Startfensters zu kopieren. Sobald die Aktivität ihren ersten Frame gezeichnet hat, wird das Startfenster des Aufgaben-Snapshots sanft ausgeblendet, wie normale Begrüßungsbildschirme.

Derselbe GraphicBuffer wird auch über Binder an SystemUI gesendet, um zum Zeichnen des Vorschaustatus einer Aufgabe in der Ansicht „Letzte“ verwendet zu werden. Da es sich lediglich um einen Verweis auf einen Puffer handelt, verbraucht das Senden über den Binder nur wenige Ressourcen. Wenn der GraphicBuffer bei SystemUI ankommt, wird er in eine Hardware-Bitmap verpackt und dann auf den 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, entsteht eine schöne Überblendung zwischen dem Snapshot und dem echten Inhalt.
  • Wenn der Aufgaben-Snapshot in SystemUI gezeichnet wird, kann dies ohne Kopieren erfolgen. Zuvor musste die Bitmap in Ashmem und dann in den Grafikspeicher kopiert werden. Da diese Methode den Schnappschuss direkt im Grafikspeicher speichert, ist kein Kopieren erforderlich.
  • Der Status, den Sie unter „Zuletzt verwendet“ sehen, stimmt immer mit dem Status überein, der beim erneuten Öffnen der App zuerst angezeigt wird. Der gleiche Puffer spart hier auch viel Speicher. Aus diesem Grund ist Recents jetzt in der Lage, diese Bilder in voller Auflösung anzuzeigen. Zuvor wurde das Sample um 64 % heruntergerechnet, um Speicherplatz zu sparen.

Implementierung

Diese Funktion ist vollständig in der Android-Plattform vorhanden. Es ist keine Integration erforderlich und eine Anpassung wird nicht unterstützt. Gerätehersteller können die Funktion „Aufgaben-Snapshots“ jedoch vollständig deaktivieren.

Um diese Funktion zu deaktivieren, ändern Sie diese Funktion:

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

Beachten Sie, dass bei deaktivierter Funktion in der Ansicht „Zuletzt verwendet“ überhaupt keine Miniaturansichten angezeigt werden.

Schnappschüsse mit hoher und niedriger Auflösung

Aufgaben-Snapshots werden in zwei Maßstäben auf die Festplatte geschrieben. Beim Wiederherstellen eines Aufgaben-Snapshots von der Festplatte werden zuerst Snapshots mit niedriger Auflösung gelesen und dann durch ihr Gegenstück mit hoher Auflösung ersetzt. Diese Optimierung verbessert die Ladezeiten von Bildern. Andernfalls könnte es beim Lesen der Snapshot-Datei von der Festplatte zu einer leichten Verzögerung kommen und dem Benutzer würde eine leere Aufgabenkarte angezeigt, bis das Image verfügbar wäre. 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 auf 1,0 bzw. 0,5 eingestellt. Deaktivieren Sie Snapshots mit niedriger Auflösung, indem Sie config_lowResTaskSnapshotScale auf 0,0 setzen.

Beispiele und Quelle

Den Rest des Codes für diese Funktion finden Sie in den TaskSnapshot*-Dateien unter:

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