From a0d58ae574a3a69145512e0cd92e7842f0fbf83d Mon Sep 17 00:00:00 2001 From: Jorim Jaggi Date: Wed, 3 Jun 2015 11:48:13 -0700 Subject: [PATCH] Use ashmem backed bitmaps for passing around notifications Avoids many copies during IPC and duplicate Java heap consumption in system_server, SystemUI, etc. Bug: 18386420 Change-Id: Id5ac9406062d472f7848009d65f12131f5f4dac9 --- core/java/android/app/Notification.java | 21 ++++++++++++++++++- .../java/android/graphics/drawable/Icon.java | 16 +++++++++++++- 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java index 5a0d246afc648..af9decc5c5a2f 100644 --- a/core/java/android/app/Notification.java +++ b/core/java/android/app/Notification.java @@ -3586,12 +3586,19 @@ public class Notification implements Parcelable * object. */ public Notification build() { + if (mSmallIcon != null) { + mSmallIcon.convertToAshmem(); + } + if (mLargeIcon != null) { + mLargeIcon.convertToAshmem(); + } mOriginatingUserId = mContext.getUserId(); mHasThreeLines = hasThreeLines(); Notification n = buildUnstyled(); if (mStyle != null) { + mStyle.purgeResources(); n = mStyle.buildStyled(n); } @@ -3790,6 +3797,8 @@ public class Notification implements Parcelable return wip; } + public void purgeResources() {} + // The following methods are split out so we can re-create notification partially. /** * @hide @@ -3901,8 +3910,18 @@ public class Notification implements Parcelable return this; } - private RemoteViews makeBigContentView() { + @Override + public void purgeResources() { + super.purgeResources(); + if (mPicture != null && mPicture.isMutable()) { + mPicture = mPicture.createAshmemBitmap(); + } + if (mBigLargeIcon != null) { + mBigLargeIcon.convertToAshmem(); + } + } + private RemoteViews makeBigContentView() { // Replace mLargeIcon with mBigLargeIcon if mBigLargeIconSet // This covers the following cases: // 1. mBigLargeIconSet -> mBigLargeIcon (null or non-null) applies, overrides diff --git a/graphics/java/android/graphics/drawable/Icon.java b/graphics/java/android/graphics/drawable/Icon.java index 85db6a1e006ef..09386c037b0aa 100644 --- a/graphics/java/android/graphics/drawable/Icon.java +++ b/graphics/java/android/graphics/drawable/Icon.java @@ -109,6 +109,10 @@ public final class Icon implements Parcelable { return (Bitmap) mObj1; } + private void setBitmap(Bitmap b) { + mObj1 = b; + } + /** * @return The length of the compressed bitmap byte array held by this {@link #TYPE_DATA} Icon. * @hide @@ -346,6 +350,16 @@ public final class Icon implements Parcelable { return loadDrawable(context); } + /** + * Puts the memory used by this instance into Ashmem memory, if possible. + * @hide + */ + public void convertToAshmem() { + if (mType == TYPE_BITMAP && getBitmap().isMutable()) { + setBitmap(getBitmap().createAshmemBitmap()); + } + } + /** * Writes a serialized version of an Icon to the specified stream. * @@ -466,7 +480,7 @@ public final class Icon implements Parcelable { throw new IllegalArgumentException("Bitmap must not be null."); } final Icon rep = new Icon(TYPE_BITMAP); - rep.mObj1 = bits; + rep.setBitmap(bits); return rep; }