OSDN Git Service

Clear native shader when Paint shader changes
authorJohn Reck <jreck@google.com>
Tue, 6 Jun 2017 19:14:04 +0000 (12:14 -0700)
committerandroid-build-team Robot <android-build-team-robot@google.com>
Wed, 7 Jun 2017 20:11:33 +0000 (20:11 +0000)
Since Recents never goes away that means TaskViewThumbnail
never goes away which in turn means mDrawPaint never goes away.

mDrawPaint has a setShader(null) called on it to release
the BitmapShader it was previously drawn with, but that
change didn't push down to native until the next time the
paint was used. As a result, the Paint held on to a
reference to the bitmap.

The fix is simple, when the shader is changed simply
push down an immediate clear of the native shader. Since
the bitmap of a BitmapShader isn't changeable we don't
need to worry about clearing references for shader mutation,
merely when Paint#setShader() happens.

Bug: 38258699
Test: Open & close recents, observe EGL memory immediately returns
to sub-5MB.

Change-Id: I6742efa8ae8dfca76b62a06bc1a1a00646feba64
(cherry picked from commit fbff7117abac7a335c6bc2e2f8b927a8dac5753e)

graphics/java/android/graphics/Paint.java

index e3b4740..f931d21 100644 (file)
@@ -1036,6 +1036,8 @@ public class Paint {
         // old shader's pointer may be reused by another shader allocation later
         if (mShader != shader) {
             mNativeShader = -1;
+            // Release any native references to the old shader content
+            nSetShader(mNativePaint, 0);
         }
         // Defer setting the shader natively until getNativeInstance() is called
         mShader = shader;