Im Grafikstapel befindet sich zwischen Composer HAL und SurfaceFlinger ein Puffercache pro Ebene, um den Overhead zu reduzieren, der mit dem Senden von Dateideskriptoren über IPC verbunden ist. Vor Android 14 wurde dieser Puffercache nicht geleert, wenn ein GraphicBufferProducer
die Verbindung zu einem SurfaceFlinger GraphicBufferConsumer
trennt, beispielsweise wenn ein MediaCodec von einem SurfaceView getrennt wird. Ab Android 14 können Sie diesen Puffer-Cache zwangsweise leeren, um den Grafikspeicherverbrauch zu reduzieren.
Wählen Sie eine der beiden folgenden Optionen:
- Für Geräte, die mit Android 14 und höher starten, müssen Sie die neue Composer HAL API Version 3.2 implementieren. Diese Option ist standardmäßig aktiviert und spart am meisten Speicher. Geräte, die auf Version 14 und höher upgraden, können diese Option ebenfalls nutzen, um die vollen Speichervorteile zu nutzen.
- Für Geräte, die auf Android 14 aktualisieren und für die Sie die Composer HAL 3.2-API nicht implementieren möchten, können Sie die Option „Abwärtskompatibilität“ aktivieren. Diese Option spart fast genauso viel Speicher wie die vorherige Option.
In den folgenden beiden Abschnitten wird erläutert, wie die einzelnen Optionen implementiert werden.
Implementieren Sie die Composer HAL 3.2-API
Um die vollen Vorteile des Grafikpufferspeichers zu nutzen, müssen Sie:
- Aktualisieren Sie Ihre Composer-HAL-Implementierung auf Version 3.2.
- Verarbeiten Sie
LayerCommand::bufferSlotsToClear
, indem Sie Puffer-Cache-Einträge löschen, die durch die in der Liste gefundenen Steckplatznummern angegeben sind.
Die Composer HAL 3.2-APIs für den Grafikpufferspeicher, einschließlich LayerCommand:bufferSlotsToClear
, befinden sich in LayerCommand.aidl-
.
Aktivieren Sie die Option „Abwärtskompatibilität“.
Die abwärtskompatible Speicherreduzierungsoption ersetzt einen echten Puffer im Cache-Steckplatz durch einen 1x1-Platzhalterpuffer, was zu Speichereinsparungen für alle gelöschten Steckplätze führt, mit Ausnahme des aktuell aktiven Puffersteckplatzes. Um teilweise Speichereinsparungen zu erzielen, aktivieren Sie die abwärtskompatible Option, indem Sie das surface_flinger.clear_slots_with_set_layer_buffer
sysprop auf true
setzen. Dieses Sysprop befindet sich in der Datei property_contexts
.
Das Festlegen dieses Sysprop erfordert, dass Ihre Composer-HAL-Implementierung mehrere setLayerBuffer
Befehle für dieselbe Ebene in einem einzigen aktuellen Zyklus korrekt verarbeitet.
Die Aktivierung der Abwärtskompatibilitätsoption hat folgende Auswirkungen:
Für AIDL-HALs: SurfaceFlinger sendet mehrere
LayerCommand
Instanzen für eine einzelne Ebene, jeweils mit einem einzelnenBufferCommand
. JederBufferCommand
enthält ein 1x1-Platzhalter-Pufferhandle und eine Steckplatznummer für den Cache-Puffersteckplatz, der geleert werden muss.Für HIDL-HALs: SurfaceFlinger sendet mehrere
SELECT_DISPLAY
,SELECT_LAYER
undSET_BUFFER
Befehle. Diese Befehle enthalten ein 1x1-Platzhalter-Pufferhandle und eine Steckplatznummer für den Cache-Puffersteckplatz, der geleert werden muss.
Die abwärtskompatible Option kann auf einigen Geräten zum Absturz der Composer-HAL führen. Möglicherweise können Sie Ihre Composer-HAL ändern, um dieses Problem zu lösen. Den Code, der dieses Verhalten steuert, finden Sie hier:
Testen Sie den Speicherverbrauch des Grafikpuffer-Cache
Tests können nicht überprüfen, ob die Cache-Slots durch HAL-Implementierungen gelöscht werden. Sie können jedoch Ihre Debugging-Tools verwenden, um die Nutzung des Grafikpuffers zu überwachen. Bei der Überwachung sollten Sie feststellen, dass es in Szenarien, in denen mehrere verschiedene Videos auf YouTube schnell hintereinander gestoppt und gestartet werden, weniger zu Speichermangelfehlern kommt.
Es sind VTS-Tests verfügbar, die überprüfen, ob die HAL-Implementierung funktional in der Lage ist, die neuen API-Aufrufe (HAL-Version 3.2+) oder mehrere setLayerBuffer
Befehle für die abwärtskompatible Implementierung zu empfangen. Dies sollte jedoch nicht als ausreichender Test für die ordnungsgemäße Funktionalität angesehen werden, da einige Geräte diese VTS-Tests bestehen, in realen Anwendungsfällen jedoch versagen.
Navigieren Sie für neue VTS-Tests zu den folgenden Links:
HIDL-kompatibel:
GraphicsComposerHidlCommandTest::SET_LAYER_BUFFER_multipleTimes
AIDL 3.1-kompatibel:
GraphicsComposerAidlCommandTest::SetLayerBufferMultipleTimes
AIDL 3.2:
GraphicsComposerAidlCommandV2Test::SetLayerBufferSlotsToClear