Samsung Note 3:Activity 按下 SPen 侧面按钮后内存泄漏

Samsung Note 3: Activity Memory Leak after pressing SPen side button

在未实施任何与 SPen 相关的 SDK 库的情况下,AppCompatActivity 扩展 class 上发生内存泄漏。 以下事件序列通常会触发内存泄漏:

  1. 用户按下侧面按钮,激活空中指挥工具。
  2. 没有点击空中指挥工具的任何图标,再次点击侧面按钮。
  3. 屏幕旋转,在这种情况下会导致 Activity 被销毁并重新启动。
  4. 通过 Android Studio 执行 Java 堆转储显示被破坏的 activity.
  5. 存在内存泄漏
  6. 分析器指示 activity mContext 变量被包 class: com.samsung.android.smartclip.SpenGestureManager 引用。这很可能导致 activity 内存泄漏。

是否有任何方法可以清除对 SpenGestureManager class 持有的 mContext 变量的引用?这应该有望让垃圾收集器清除被破坏的 activity.

在以下 device/Android 版本 (Samsung Galaxy Note 3 Duos) 上检测到此问题:

同一应用程序在 Samsung Galaxy Note 10.1 设备上进行了测试,该设备似乎没有此内存泄漏问题。

正如您从 LeakCanary's sources 中看到的那样,这是众所周知的内存泄漏。

SpenGestureManager has a static mContext field that leaks a reference to the activity. Yes, a STATIC mContext field.

我认为可以使用反射来解决。这是一段应该有效的代码:


    // Perform an if-check to see whether this is a Samsung device
    Class clazz = Class.forName("com.samsung.android.smartclip.SpenGestureManager");
    Field mContext = clazz.getDeclaredField("mContext");
    mContext.setAccessible(true);
    mContext.set(null, null);