From 4082aa2e199ce059b9d6903f3d4aff6144ec296e Mon Sep 17 00:00:00 2001 From: Jacky Kao Date: Thu, 27 Feb 2020 10:37:20 +0800 Subject: [PATCH] Drop the hardware buffer Closing the hardware buffer after sending over to the requesting app, and adding the document that the app developer has to close the buffer ASAP. Bug: 150174095 Test: atest AccessibilityTakeScreenshotTest Change-Id: I8e759a7d83c0a9adfd1b37d0bbf515c9babde7a4 --- .../AccessibilityService.java | 4 +++ ...bstractAccessibilityServiceConnection.java | 25 +++++++++++-------- 2 files changed, 18 insertions(+), 11 deletions(-) diff --git a/core/java/android/accessibilityservice/AccessibilityService.java b/core/java/android/accessibilityservice/AccessibilityService.java index 23cbdcdad00a3..a7129561c7548 100644 --- a/core/java/android/accessibilityservice/AccessibilityService.java +++ b/core/java/android/accessibilityservice/AccessibilityService.java @@ -2400,6 +2400,10 @@ public abstract class AccessibilityService extends Service { /** * Gets the {@link HardwareBuffer} representing a memory buffer of the screenshot. + *

+ * Note: The application should call {@link HardwareBuffer#close()} when + * the buffer is no longer needed to free the underlying resources. + *

* * @return the hardware buffer */ diff --git a/services/accessibility/java/com/android/server/accessibility/AbstractAccessibilityServiceConnection.java b/services/accessibility/java/com/android/server/accessibility/AbstractAccessibilityServiceConnection.java index b905a39d15940..4052942626cb8 100644 --- a/services/accessibility/java/com/android/server/accessibility/AbstractAccessibilityServiceConnection.java +++ b/services/accessibility/java/com/android/server/accessibility/AbstractAccessibilityServiceConnection.java @@ -1023,18 +1023,21 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ displaySize.x, displaySize.y, false, rotation); final GraphicBuffer graphicBuffer = screenshotBuffer.getGraphicBuffer(); - final HardwareBuffer hardwareBuffer = - HardwareBuffer.createFromGraphicBuffer(graphicBuffer); - final ParcelableColorSpace colorSpace = - new ParcelableColorSpace(screenshotBuffer.getColorSpace()); + try (HardwareBuffer hardwareBuffer = + HardwareBuffer.createFromGraphicBuffer(graphicBuffer)) { + final ParcelableColorSpace colorSpace = + new ParcelableColorSpace(screenshotBuffer.getColorSpace()); - // Send back the result. - final Bundle payload = new Bundle(); - payload.putParcelable(KEY_ACCESSIBILITY_SCREENSHOT_HARDWAREBUFFER, - hardwareBuffer); - payload.putParcelable(KEY_ACCESSIBILITY_SCREENSHOT_COLORSPACE, colorSpace); - payload.putLong(KEY_ACCESSIBILITY_SCREENSHOT_TIMESTAMP, SystemClock.uptimeMillis()); - callback.sendResult(payload); + // Send back the result. + final Bundle payload = new Bundle(); + payload.putParcelable(KEY_ACCESSIBILITY_SCREENSHOT_HARDWAREBUFFER, + hardwareBuffer); + payload.putParcelable(KEY_ACCESSIBILITY_SCREENSHOT_COLORSPACE, colorSpace); + payload.putLong(KEY_ACCESSIBILITY_SCREENSHOT_TIMESTAMP, + SystemClock.uptimeMillis()); + callback.sendResult(payload); + hardwareBuffer.close(); + } }, null).recycleOnUse()); } finally { Binder.restoreCallingIdentity(identity);