Ab dem 27. März 2025 empfehlen wir, android-latest-release
anstelle von aosp-main
zu verwenden, um AOSP zu erstellen und Beiträge dazu zu leisten. Weitere Informationen finden Sie unter Änderungen am AOSP.
Client-Framebuffer-Verwaltung
Mit Sammlungen den Überblick behalten
Sie können Inhalte basierend auf Ihren Einstellungen speichern und kategorisieren.
Ab Android 13 werden neue Framebuffer, die bei der Clientkomposition verwendet werden, immer dann zugewiesen, wenn sich die Displayauflösung ändert. Diese Zuordnung wird von SurfaceFlinger im nächsten invalidate-Zyklus nach einer Auflösungsänderung durchgeführt.
Framebuffer-Verwaltung bei Auflösungswechseln
Änderungen der Auflösung treten in einem der folgenden beiden Szenarien auf:
Ein Hotplug-Ereignis, das vom Hardware Composer (HWC) initiiert wird, wenn ein externes Display gegen ein anderes mit einer anderen Standardauflösung ausgetauscht wird.
Bei einem Hotplug-Ereignis werden die Handles zu den alten Framebuffern freigegeben, wenn die alten Displaydaten deallociert werden.
Ein von SurfaceFlinger initiierter Wechsel des Anzeigemodus, der auftritt, wenn der Nutzer die Auflösung über die Nutzereinstellungen ändert oder eine App die Auflösung über preferredDisplayModeId
ändert.
Während eines Displaymoduswechsels werden die Handles zu vorhandenen Client-Framebuffern von SurfaceFlinger freigegeben, bevor setActiveConfig
oder setActiveConfigWithConstraints
aufgerufen wird.
Um katastrophale Probleme wie Speicherfragmentierung auf Geräten zu vermeiden, die nicht genügend Speicher für die alten und neuen Framebuffer reservieren, ist es wichtig, dass HWC die alten Framebuffer nicht mehr verwendet und alle Handles für diese Framebuffer freigibt, wie in den folgenden Fällen gezeigt:
Durch das Freigeben der Handles kann der Framebuffer-Speicher vollständig deallociert werden, bevor neue Framebuffer zugewiesen werden, die SurfaceFlinger während des nächsten invalidate-Zyklus ausführt.
Empfehlungen für die Framebufferverwaltung
Wenn HWC die Handles zu alten Framebuffern nicht rechtzeitig freigibt, erfolgt die neue Framebufferzuweisung vor der Deaktivierung des alten Framebuffers. Dies kann zu katastrophalen Problemen führen, wenn die neue Zuweisung aufgrund von Fragmentierung oder anderen Problemen fehlschlägt. Schlimmer noch: Wenn HWC diese Handles überhaupt nicht freigibt, kann es zu einem Speicherleck kommen.
Folgen Sie diesen Empfehlungen, um schwerwiegende Zuweisungsfehler zu vermeiden:
Wenn HWC die alten Client-Framebuffer weiterhin verwenden muss, bis die neuen Client-Framebuffer bereitgestellt werden, ist es wichtig, sowohl für die alten als auch für die neuen Framebuffer genügend Arbeitsspeicher zu reservieren und gegebenenfalls Defragmentierungsalgorithmen auf dem Framebuffer-Speicherplatz auszuführen.
Weisen Sie den Framebuffern einen separaten Speicherpool zu, der vom Rest des Grafikbuffer-Speichers getrennt ist. Das ist wichtig, weil zwischen der Dealokation und der Neuzuweisung der Framebuffer ein Drittanbieterprozess versuchen kann, Grafikspeicher zuzuweisen. Wenn derselbe Grafikspeicherpool vom Framebuffer verwendet wird und der Grafikspeicher voll ist, kann der Drittanbieterprozess den Grafikspeicher belegen, der zuvor einem Framebuffer zugewiesen wurde. Dadurch bleibt nicht genügend Arbeitsspeicher für die Neuzuweisung des Framebuffers übrig oder der Arbeitsspeicher wird möglicherweise fragmentiert.
Framebuffer-Verwaltung testen
OEMs wird empfohlen, die ordnungsgemäße Verwaltung des Client-Framebuffer-Speichers bei Auflösungswechseln für ihr Gerät zu testen. Dazu ist Folgendes zu beachten:
Für Hotplug-Ereignisse ziehen Sie einfach zwei verschiedene Displays mit unterschiedlichen Auflösungen ab und schließen Sie sie wieder an.
Verwenden Sie für Moduswechsel den ModeSwitchingTestActivity
CTS-Verifier-Test, um einen Moduswechsel zum Testen des Framebuffer-Speicherverhaltens auszulösen.
Mit diesem Test können Probleme visuell erkannt werden, die sich programmatisch nur schwer erkennen lassen.
Alle Inhalte und Codebeispiele auf dieser Seite unterliegen den Lizenzen wie im Abschnitt Inhaltslizenz beschrieben. Java und OpenJDK sind Marken oder eingetragene Marken von Oracle und/oder seinen Tochtergesellschaften.
Zuletzt aktualisiert: 2025-07-27 (UTC).
[[["Leicht verständlich","easyToUnderstand","thumb-up"],["Mein Problem wurde gelöst","solvedMyProblem","thumb-up"],["Sonstiges","otherUp","thumb-up"]],[["Benötigte Informationen nicht gefunden","missingTheInformationINeed","thumb-down"],["Zu umständlich/zu viele Schritte","tooComplicatedTooManySteps","thumb-down"],["Nicht mehr aktuell","outOfDate","thumb-down"],["Problem mit der Übersetzung","translationIssue","thumb-down"],["Problem mit Beispielen/Code","samplesCodeIssue","thumb-down"],["Sonstiges","otherDown","thumb-down"]],["Zuletzt aktualisiert: 2025-07-27 (UTC)."],[],[],null,["# Client framebuffer management\n\nStarting with Android 13, new framebuffers, used during\n[client](https://android.googlesource.com/platform/hardware/interfaces/+/refs/heads/android16-release/graphics/composer/aidl/android/hardware/graphics/composer3/DisplayCommand.aidl#113)\ncomposition, are allocated whenever the display resolution changes. This\nallocation is performed by SurfaceFlinger on the next *invalidate* cycle\nafter a resolution change.\n\nFramebuffer management during resolution switches\n-------------------------------------------------\n\nResolution changes occur due to one of the following\ntwo scenarios:\n\n- A [hotplug event](https://android.googlesource.com/platform/hardware/interfaces/+/refs/heads/android16-release/graphics/composer/aidl/android/hardware/graphics/composer3/IComposerCallback.aidl#41),\n initiated by Hardware Composer (HWC), which occurs when swapping from one external\n display to a different external display that has a different default resolution.\n\n During a hotplug event, the handles to the old framebuffers are released\n when the old display data is deallocated.\n- A display mode switch initiated by SurfaceFlinger, which occurs when the\n user changes the resolution with [user settings](https://android.googlesource.com/platform/frameworks/base/+/refs/heads/android16-release/core/java/android/hardware/display/DisplayManager.java#1209),\n or an app changes the resolution with [`preferredDisplayModeId`](https://developer.android.com/reference/android/view/WindowManager.LayoutParams#preferredDisplayModeId).\n\n During a display mode switch, the handles to existing client framebuffers\n are released by SurfaceFlinger before calling [`setActiveConfig`](https://android.googlesource.com/platform/hardware/interfaces/+/refs/heads/android16-release/graphics/composer/aidl/android/hardware/graphics/composer3/IComposerClient.aidl#550)\n or [`setActiveConfigWithConstraints`](https://android.googlesource.com/platform/hardware/interfaces/+/refs/heads/android16-release/graphics/composer/aidl/android/hardware/graphics/composer3/IComposerClient.aidl#577).\n\nTo avoid catastrophic problems, such as memory fragmentation, on devices that\ndon't reserve enough memory for the old and new framebuffers, it's critical\nthat HWC ceases to use the old framebuffers and releases any\nhandles to these framebuffers as shown in the following cases:\n\n- For hotplug events, immediately before calling [`onHotplug`](https://android.googlesource.com/platform/hardware/interfaces/+/refs/heads/android16-release/graphics/composer/aidl/android/hardware/graphics/composer3/IComposerCallback.aidl#41).\n\n- For mode switches, immediately after the call to [`setActiveConfig`](https://android.googlesource.com/platform/hardware/interfaces/+/refs/heads/android16-release/graphics/composer/aidl/android/hardware/graphics/composer3/IComposerClient.aidl#550)\n or [`setActiveConfigWithConstraints`](https://android.googlesource.com/platform/hardware/interfaces/+/refs/heads/android16-release/graphics/composer/aidl/android/hardware/graphics/composer3/IComposerClient.aidl#577).\n\nReleasing the handles allows the framebuffer memory to be fully deallocated\nprior to the allocation of new framebuffers that SurfaceFlinger performs\nduring the next *invalidate* cycle.\n\n### Recommendations for framebuffer management\n\nIf HWC doesn't release handles to old framebuffers in time,\nthe new framebuffer allocation takes place before the old framebuffer\ndeallocation. This can cause catastrophic problems when the new allocation fails\ndue to fragmentation or other issues. Even worse, if\nHWC doesn't release these handles at all, a memory leak can\noccur.\n\nTo avoid catastrophic allocation failures, follow these recommendations:\n\n- If HWC needs to continue using the old client framebuffers until the new\n client framebuffers are provided, then it's critical to reserve enough memory\n for both the old and new framebuffers, and possibly run defragmentation\n algorithms on the framebuffer memory space.\n\n- Allocate a dedicated memory pool for the framebuffers that's separate from\n the rest of the graphic buffer memory. This is important because between\n deallocation and reallocation of the framebuffers, a third-party process can\n attempt to allocate graphics memory. If the same graphics memory pool is\n used by the framebuffer and if the graphics memory is full, the third-party\n process can occupy the graphics memory previously allocated by a framebuffer,\n thus leaving insufficient memory for the framebuffer reallocation or, possibly\n fragmenting the memory space.\n\nTest framebuffer management\n---------------------------\n\nOEMs are advised to test for proper client framebuffer memory management across\nresolution switches for their device, described as follows:\n\n- For hotplug events, simply unplug and reconnect two different displays with\n different resolutions.\n\n- For mode switches, use the [`ModeSwitchingTestActivity`](https://cs.android.com/android/platform/superproject/+/android-latest-release:cts/apps/CtsVerifier/src/com/android/cts/verifier/tv/display/ModeSwitchingTestActivity.java;l=47-53;drc=c80d948aff1e7df5c2dc0ddba0d1cd63a90e4d9c) CTS\n Verifier test to initiate a mode switch for testing framebuffer memory behavior.\n This test can visually identify problems that are hard to detect\n programmatically."]]