2017-08-31 162 views
1

未执行任何与SPen相关的SDK库,内存泄漏发生在AppCompatActivity扩展类上。 以下事件序列通常会触发内存泄漏:Samsung Note 3:按下SPen侧按钮后活动内存泄漏

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

会不会有什么办法可以清除参考由SpenGestureManager类举行的mContext变量的存在?这应该有望让垃圾收集器清除已销毁的活动。

以下设备/ Android版本中检测到这个问题(三星Galaxy Note 3个二重奏):

  • 型号:SM-N9002
  • 的Android版本:4.4.2(奇巧)
  • 基带版本:N9002ZNUFNK1
  • ROM版本:SVA ROM SM-N9002 9.0

同样的申请于三星Galax的测试y注意10.1设备,它似乎没有此内存泄漏问题。

回答

1

正如你可以从LeakCanary's sources看到的那样,这是一个众所周知的内存泄漏。

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); 
 
+1

虽然:'getDeclaredField(“modifiers”)'似乎会抛出'NoSuchFieldException',你的方法似乎工作得很好。不过,我从手机的framework2.jar包中反编译了SpenGestureManager.java,并且mContext出现,好像它没有被声明为final。所以我用'mContext.setAccessible(true)'将setFinalStatic()调用替换为直接调用'mContext.set(null,null)'。内存泄漏现在似乎已经消失。 – Tjaart

+0

@Tjaart,很好,更新了答案。 – azizbekian