Task Snapshots ist eine Infrastruktur, die in Android 8.0 eingeführt wurde und Screenshots für Thumbnails der letzten Aktivitäten sowie gespeicherte Oberflächen aus dem Fenstermanager kombiniert. Die Miniaturansichten in der Ansicht „Letzte“ geben den letzten Status einer Aufgabe an.
Wenn eine Aktivität in den angehaltenen Zustand versetzt wurde, zerstörte der Window Manager die Oberflächen der Aktivität nicht, solange diese Aktivität an oberster Stelle der Aufgabe stand. Wenn diese Aktivität noch einmal angezeigt werden musste, konnte der Window Manager die Animation starten, ohne zu warten, bis die Aktivität den ersten Frame fertig gezeichnet hatte, da er diese gespeicherte Oberfläche verwenden konnte.
Architektur
Die beiden Konzepte „Letzte Miniaturansichten“ und „Gespeicherte Oberflächen“ werden mit Aufgaben-Snapshots vereint. Wenn eine Aufgabe in den Hintergrund wechselt, platziert der Window Manager einen Screenshot dieser Aufgabe in einem GraphicBuffer. Solange die App der aktiven Aufgabe im Arbeitsspeicher verbleibt, bleibt auch dieser GraphicBuffer im Arbeitsspeicher. Wenn dieselbe Aktivität wieder in den Vordergrund gebracht wird, erstellt der Window Manager ein Startfenster (TaskSnapshotSurface) und fügt den GraphicBuffer hinzu, ohne Speicher in die Pufferwarteschlange des Startfensters zu kopieren. Sobald der erste Frame der Aktivität gezeichnet wurde, wird das Startfenster des Task-Snapshots wie bei normalen Startbildschirmen langsam ausgeblendet.
Derselbe GraphicBuffer wird auch über Binder an SystemUI gesendet, um den Vorschaustatus einer Aufgabe in der Ansicht „Letzte“ zu zeichnen. Da es sich dabei nur um eine Referenz 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 dargestellt, ohne dass Daten in den Grafikspeicher hochgeladen werden.
Vorteile
Diese neue Architektur bietet drei Hauptvorteile:
- Wenn der Aufgaben-Snapshot als Startfenster verwendet wird, entsteht ein schöner Übergang zwischen dem Snapshot und den tatsächlichen Inhalten.
- 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, der in „Letzte“ angezeigt wird, entspricht immer dem Status, der beim erneuten Öffnen der App angezeigt wird. Durch denselben Puffer wird außerdem viel Speicher gespart. Deshalb können diese Bilder jetzt in der vollständigen Auflösung in „Letzte“ 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 „Aufgaben-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 „Letzte“ keine Miniaturansichten angezeigt.
Snapshots in hoher und niedriger Auflösung
Aufgaben-Snapshots werden in zwei Skalen auf das Laufwerk geschrieben. Wenn Sie einen Aufgaben-Snapshot von der Festplatte wiederherstellen, werden zuerst Snapshots mit niedriger Auflösung gelesen und dann durch ihre High-Res-Entsprechung ersetzt. Dadurch werden die Ladezeiten von Bildern verkürzt. Andernfalls kann es beim Lesen der Snapshot-Datei vom Laufwerk zu einer kurzen Verzögerung kommen. Der Nutzer sieht dann eine leere Aufgabenkarte, bis das Bild verfügbar ist. Sie können die Skalen in der Konfigurationsdatei für das Geräte-Overlayoverlay/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 Rest des Codes für diese Funktion finden Sie in den TaskSnapshot*-Dateien unter:
frameworks/base/+/main/services/core/java/com/android/server/wm/