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:
@@ -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);
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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() {
|
||||
|
||||
Reference in New Issue
Block a user