1

AppCompatActivity如果没有实现任何与 SPen 相关的 SDK 库,扩展类会发生内存泄漏。以下事件序列通常会触发内存泄漏:

  1. 用户按下侧面按钮,激活 Air Command 工具。
  2. 无需单击任何 Air Command 工具的图标,再次单击侧边按钮。
  3. 屏幕旋转,在这种情况下会导致 Activity 被销毁并重新启动。
  4. 通过 Android Studio 执行 Java 堆转储会发现被破坏的 Activity 存在内存泄漏。
  5. 分析器表明活动 mContext 变量被包类引用:com.samsung.android.smartclip.SpenGestureManager。这很可能导致活动内存泄漏。

有什么方法可以清除对 SpenGestureManager 类持有的 mContext 变量的引用吗?这应该有望让垃圾收集器清除被破坏的活动。

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

  • 型号:SM-N9002
  • 安卓版本:4.4.2(奇巧)
  • 基带版本:N9002ZNUFNK1
  • ROM版本:SVA ROM SM-N9002 v9.0

在三星 Galaxy Note 10.1 设备上测试了相同的应用程序,该设备似乎没有此内存泄漏问题。

4

1 回答 1

1

LeakCanary 的资料中可以看出,这是众所周知的内存泄漏。

SpenGestureManager有一个静态mContext字段泄漏对活动的引用。是的,一个STATIC mContext字段。

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


    // 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);

于 2017-09-04T14:06:50.850 回答