Samsung Note 3:Activity 按下 SPen 侧面按钮后内存泄漏
Samsung Note 3: Activity Memory Leak after pressing SPen side button
在未实施任何与 SPen 相关的 SDK 库的情况下,AppCompatActivity
扩展 class 上发生内存泄漏。
以下事件序列通常会触发内存泄漏:
- 用户按下侧面按钮,激活空中指挥工具。
- 没有点击空中指挥工具的任何图标,再次点击侧面按钮。
- 屏幕旋转,在这种情况下会导致 Activity 被销毁并重新启动。
- 通过 Android Studio 执行 Java 堆转储显示被破坏的 activity.
存在内存泄漏
- 分析器指示 activity mContext 变量被包 class: com.samsung.android.smartclip.SpenGestureManager 引用。这很可能导致 activity 内存泄漏。
是否有任何方法可以清除对 SpenGestureManager class 持有的 mContext 变量的引用?这应该有望让垃圾收集器清除被破坏的 activity.
在以下 device/Android 版本 (Samsung Galaxy Note 3 Duos) 上检测到此问题:
- 型号:SM-N9002
- Android版本:4.4.2(奇巧)
- 基带版本:N9002ZNUFNK1
- ROM版本:SVA ROM SM-N9002 v9.0
同一应用程序在 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);
在未实施任何与 SPen 相关的 SDK 库的情况下,AppCompatActivity
扩展 class 上发生内存泄漏。
以下事件序列通常会触发内存泄漏:
- 用户按下侧面按钮,激活空中指挥工具。
- 没有点击空中指挥工具的任何图标,再次点击侧面按钮。
- 屏幕旋转,在这种情况下会导致 Activity 被销毁并重新启动。
- 通过 Android Studio 执行 Java 堆转储显示被破坏的 activity. 存在内存泄漏
- 分析器指示 activity mContext 变量被包 class: com.samsung.android.smartclip.SpenGestureManager 引用。这很可能导致 activity 内存泄漏。
是否有任何方法可以清除对 SpenGestureManager class 持有的 mContext 变量的引用?这应该有望让垃圾收集器清除被破坏的 activity.
在以下 device/Android 版本 (Samsung Galaxy Note 3 Duos) 上检测到此问题:
- 型号:SM-N9002
- Android版本:4.4.2(奇巧)
- 基带版本:N9002ZNUFNK1
- ROM版本:SVA ROM SM-N9002 v9.0
同一应用程序在 Samsung Galaxy Note 10.1 设备上进行了测试,该设备似乎没有此内存泄漏问题。
正如您从 LeakCanary's sources 中看到的那样,这是众所周知的内存泄漏。
SpenGestureManager
has a staticmContext
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);