Task Snapshots ist eine in Android 8.0 eingeführte Infrastruktur, die Screenshots für Recents Thumbnails (Miniaturansichten für „Letzte Apps“) und Saved Surfaces (gespeicherte Oberflächen) aus dem Window Manager kombiniert. Miniaturansichten unter „Letzte“ stellen den letzten Status einer Aufgabe in der Ansicht „Letzte“ dar.
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 Window Manager die Animation starten, ohne darauf zu warten, dass die Aktivität ihren ersten Frame zeichnet, da sie diese gespeicherte Oberfläche verwenden konnte.
Architektur
Die beiden Konzepte „Miniaturansichten der letzten Inhalte“ und „Gespeicherte Oberflächen“ werden mit Task-Snapshots vereinheitlicht. Wenn eine Aufgabe in den Hintergrund wechselt, platziert der Window Manager einen Screenshot dieser Aufgabe in einem GraphicBuffer. Solange die App der Top-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 der 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 wesentliche Vorteile:
- Wenn der Aufgaben-Snapshot als Startfenster verwendet wird, gibt es einen schönen Crossfade-Effekt zwischen dem Snapshot und dem eigentlichen Inhalt.
- Wenn der Aufgaben-Snapshot in der SystemUI gezeichnet 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 den gleichen Puffer 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 Aufgaben-Snapshots von der Festplatte werden zuerst Snapshots mit niedriger Auflösung gelesen und dann durch das entsprechende Gegenstück mit hoher Auflösung ersetzt. Durch diese Optimierung werden die Ladezeiten von Bildern verkürzt. 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-Konfigurationsdateioverlay/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/+/android16-release/services/core/java/com/android/server/wm/