Fixing HardwareBuffer leak when creating a bitmap

Callers are supposed to close the hardware buffer themselves. Creating
a utility method around this

Bug: 123874711
Test: No more leak warning on device
Change-Id: I2cf215f0646222f63e564a58edab1ffffa396ff3
This commit is contained in:
Sunny Goyal
2019-04-10 12:28:47 -07:00
parent b5258351ea
commit 62915b28e0
7 changed files with 18 additions and 20 deletions

View File

@@ -33,7 +33,6 @@ import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.GraphicBuffer;
import android.graphics.Rect;
import android.hardware.HardwareBuffer;
import android.os.Bundle;
import android.os.Handler;
import android.os.IRemoteCallback;
@@ -925,8 +924,7 @@ public class ActivityOptions {
// Unpackage the GraphicBuffer from the parceled thumbnail
final GraphicBuffer buffer = opts.getParcelable(KEY_ANIM_THUMBNAIL);
if (buffer != null) {
mThumbnail = Bitmap.wrapHardwareBuffer(
HardwareBuffer.createFromGraphicBuffer(buffer), null);
mThumbnail = Bitmap.wrapHardwareBuffer(buffer, null);
}
mStartX = opts.getInt(KEY_ANIM_START_X, 0);
mStartY = opts.getInt(KEY_ANIM_START_Y, 0);

View File

@@ -31,7 +31,6 @@ import android.app.contentsuggestions.SelectionsRequest;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.GraphicBuffer;
import android.hardware.HardwareBuffer;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
@@ -67,8 +66,7 @@ public abstract class ContentSuggestionsService extends Service {
Bitmap wrappedBuffer = null;
if (contextImage != null) {
wrappedBuffer = Bitmap.wrapHardwareBuffer(
HardwareBuffer.createFromGraphicBuffer(contextImage), null);
wrappedBuffer = Bitmap.wrapHardwareBuffer(contextImage, null);
}
mHandler.sendMessage(

View File

@@ -41,7 +41,6 @@ import android.graphics.PixelFormat;
import android.graphics.Point;
import android.graphics.Rect;
import android.graphics.Region;
import android.hardware.HardwareBuffer;
import android.hardware.display.DisplayedContentSample;
import android.hardware.display.DisplayedContentSamplingAttributes;
import android.os.Build;
@@ -1917,9 +1916,7 @@ public final class SurfaceControl implements Parcelable {
Log.w(TAG, "Failed to take screenshot");
return null;
}
return Bitmap.wrapHardwareBuffer(
HardwareBuffer.createFromGraphicBuffer(buffer.getGraphicBuffer()),
buffer.getColorSpace());
return Bitmap.wrapHardwareBuffer(buffer.getGraphicBuffer(), buffer.getColorSpace());
}
/**

View File

@@ -762,6 +762,18 @@ public final class Bitmap implements Parcelable {
return nativeWrapHardwareBufferBitmap(hardwareBuffer, colorSpace.getNativeInstance());
}
/**
* Utility method to create a hardware backed bitmap using the graphics buffer.
* @hide
*/
@Nullable
public static Bitmap wrapHardwareBuffer(@NonNull GraphicBuffer graphicBuffer,
@Nullable ColorSpace colorSpace) {
try (HardwareBuffer hb = HardwareBuffer.createFromGraphicBuffer(graphicBuffer)) {
return wrapHardwareBuffer(hb, colorSpace);
}
}
/**
* Creates a new bitmap, scaled from an existing bitmap, when possible. If the
* specified width and height are the same as the current width and height of

View File

@@ -23,7 +23,6 @@ import static com.android.systemui.shared.system.WindowManagerWrapper.WINDOWING_
import android.app.ActivityManager.TaskSnapshot;
import android.graphics.Bitmap;
import android.graphics.Rect;
import android.hardware.HardwareBuffer;
/**
* Data for a single thumbnail.
@@ -53,9 +52,7 @@ public class ThumbnailData {
}
public ThumbnailData(TaskSnapshot snapshot) {
thumbnail = Bitmap.wrapHardwareBuffer(
HardwareBuffer.createFromGraphicBuffer(snapshot.getSnapshot()),
snapshot.getColorSpace());
thumbnail = Bitmap.wrapHardwareBuffer(snapshot.getSnapshot(), snapshot.getColorSpace());
insets = new Rect(snapshot.getContentInsets());
orientation = snapshot.getOrientation();
reducedResolution = snapshot.isReducedResolution();

View File

@@ -26,7 +26,6 @@ import android.app.ActivityManager;
import android.app.ActivityManager.TaskSnapshot;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.hardware.HardwareBuffer;
import android.os.Process;
import android.os.SystemClock;
import android.util.ArraySet;
@@ -363,8 +362,7 @@ class TaskSnapshotPersister {
// TODO(b/116112787) TaskSnapshot needs bookkeep the ColorSpace of the
// hardware bitmap when created.
final Bitmap bitmap = Bitmap.wrapHardwareBuffer(
HardwareBuffer.createFromGraphicBuffer(mSnapshot.getSnapshot()),
mSnapshot.getColorSpace());
mSnapshot.getSnapshot(), mSnapshot.getColorSpace());
if (bitmap == null) {
Slog.e(TAG, "Invalid task snapshot hw bitmap");
return false;

View File

@@ -35,7 +35,6 @@ import static com.android.server.wm.WindowManagerService.H.WALLPAPER_DRAW_PENDIN
import android.graphics.Bitmap;
import android.graphics.Rect;
import android.hardware.HardwareBuffer;
import android.os.Bundle;
import android.os.Debug;
import android.os.IBinder;
@@ -744,8 +743,7 @@ class WallpaperController {
return null;
}
return Bitmap.wrapHardwareBuffer(
HardwareBuffer.createFromGraphicBuffer(wallpaperBuffer.getGraphicBuffer()),
wallpaperBuffer.getColorSpace());
wallpaperBuffer.getGraphicBuffer(), wallpaperBuffer.getColorSpace());
}
private WindowState getTopVisibleWallpaper() {