由于android.widget.BubblePopupHelper而导致的内存泄漏

Netimen

我正在使用MemoryAnalyzer工具在我的Android应用程序中查找内存泄漏。因此,我运行我的应用程序,访问所有活动,然后按回去直到进入桌面。然后,我使用DDMS进行内存转储(多次按下原因GC)。

然后,我使用OQL查询select * from instanceof android.app.Activity查找泄漏的活动,然后按合并GC根的最短路径->排除泄漏对象上的所有幻像/弱/软/等引用这是这张图片:

在此处输入图片说明

因此,似乎在系统中的某个位置存在一个静态对象BubblePopupHelper.sHelper,该对象保留了EditText我的活动视图的引用,从而导致整个活动泄漏!但是,这是什么BubblePopupHelper我在官方文档中找不到有关此类的任何信息以及如何防止由于此奇怪对象引用我的活动而将其保留在内存中?

我正在运行API19的LG L40设备上进行测试

皮埃尔·伊夫·里考

我的泄漏检测工具定期报告相同的泄漏,仅来自LG手机:

object com.squareup.SomeActivity
`-mContext of object android.widget.EditText
  `-mView of object android.widget.BubblePopupHelper
    `-sHelper of class android.widget.BubblePopupHelper

制造商喜欢在后台更改Android SDK的私有API。这是LG引入的内存泄漏。

据我所知,重点突出的EditText使用了BubblePopupHelper,可能显示了一些复制/粘贴弹出窗口或文本句柄。由于一次只能有一个重点突出的编辑文本,因此他们使助手变成单例,并且它始终引用最新重点突出的编辑文本。

因此,这意味着整个活动及其整个视图层次结构都将泄漏,直到另一个编辑文本成为焦点为止。

您该如何解决?可悲的是,这是SDK代码,因此尽管在LG的将来版本中可能会修复此问题,但始终会有一些用户遇到该错误。

尽管此错误当然不是您的错,但它仍然是内存泄漏,可能会泄漏到增加的内存不足错误。因此,值得尝试修复它,

有办法,但不是很漂亮。活动被破坏后,可以使用反射清除泄漏。例如,一种方法可能是清除sHelper字段,或者另一种方法是清除辅助程序上的mView字段。无论哪种方式,您都应该在设备上尝试一下(我现在没有),然后看看它是否有效。

private static final Executor backgroundExecutor =
    newCachedThreadPool(backgroundThreadFactory("android-leaks"));

public static void fixLGBubblePopupHelper(final Application application) {
  backgroundExecutor.execute(new Runnable() {
    @Override public void run() {
      final Field sHelperField;
      try {
        Class<?> bubbleClass = Class.forName("android.widget.BubblePopupHelper");
        sHelperField = bubbleClass.getDeclaredField("sHelper");
        sHelperField.setAccessible(true);
      } catch (Exception ignored) {
        // We have no guarantee that this class / field exists.
        return;
      }
      application.registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacksAdapter() {
        @Override public void onActivityDestroyed(Activity activity) {
          try {
            sHelperField.set(null, null);
          } catch (IllegalAccessException ignored) {
          }
        }
      });
    }
  });
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Android:由于成员变量导致内存泄漏?

来自分类Dev

Android runOnUiThread导致内存泄漏

来自分类Dev

Android runOnUiThread导致内存泄漏

来自分类Dev

由于Spring单例导致内存泄漏

来自分类Dev

由于OnItemKeyChanged事件导致Codefluent内存泄漏

来自分类Dev

Android:由于活动和上下文存储为对象属性而导致内存泄漏?

来自分类Dev

由于Window.EfectiveValues保留而导致的内存泄漏

来自分类Dev

Android幻灯片显示导致内存泄漏

来自分类Dev

静态变量会导致android中的内存泄漏吗?

来自分类Dev

由于PrivateQueueConcurrencyType,CoreData内存泄漏

来自分类Dev

Tomcat抱怨由于JDBC驱动程序关闭后打开连接导致内存泄漏

来自分类Dev

WPF 4.5:如何删除由于绑定到对象而导致的弱引用以避免内存泄漏

来自分类Dev

由于读取多个大小不同的文件时struct.unpack()的内存泄漏而导致的MemoryError

来自分类Dev

Eclipse MAT显示由于Volley NetworkDispatcher和CacheDispatcher而导致的内存泄漏

来自分类Dev

Android动画内存泄漏

来自分类Dev

C ++机器人,作业分配-由于内存泄漏而导致valgrind错误。确实需要一些提示

来自分类Dev

由于图片Android Studio内存不足

来自分类Dev

QProcess导致内存泄漏

来自分类Dev

ZDecompressStream()导致内存泄漏

来自分类Dev

IOPSCopyPowerSourcesInfo()导致的内存泄漏

来自分类Dev

NSRunAlertPanel导致内存泄漏

来自分类Dev

fork() 导致内存泄漏

来自分类Dev

如何在AndroidStudio 4中模拟由于内存不足而导致的Android Killing应用

来自分类Dev

内存不足错误-可能是由于内存泄漏?

来自分类Dev

Android Widget:大图像可滚动-内存不足

来自分类Dev

Android Fragment Webview内存泄漏

来自分类Dev

Android WebView发生内存泄漏

来自分类Dev

防止Android中的内存泄漏

来自分类Dev

Android WeakReference处理内存泄漏

Related 相关文章

  1. 1

    Android:由于成员变量导致内存泄漏?

  2. 2

    Android runOnUiThread导致内存泄漏

  3. 3

    Android runOnUiThread导致内存泄漏

  4. 4

    由于Spring单例导致内存泄漏

  5. 5

    由于OnItemKeyChanged事件导致Codefluent内存泄漏

  6. 6

    Android:由于活动和上下文存储为对象属性而导致内存泄漏?

  7. 7

    由于Window.EfectiveValues保留而导致的内存泄漏

  8. 8

    Android幻灯片显示导致内存泄漏

  9. 9

    静态变量会导致android中的内存泄漏吗?

  10. 10

    由于PrivateQueueConcurrencyType,CoreData内存泄漏

  11. 11

    Tomcat抱怨由于JDBC驱动程序关闭后打开连接导致内存泄漏

  12. 12

    WPF 4.5:如何删除由于绑定到对象而导致的弱引用以避免内存泄漏

  13. 13

    由于读取多个大小不同的文件时struct.unpack()的内存泄漏而导致的MemoryError

  14. 14

    Eclipse MAT显示由于Volley NetworkDispatcher和CacheDispatcher而导致的内存泄漏

  15. 15

    Android动画内存泄漏

  16. 16

    C ++机器人,作业分配-由于内存泄漏而导致valgrind错误。确实需要一些提示

  17. 17

    由于图片Android Studio内存不足

  18. 18

    QProcess导致内存泄漏

  19. 19

    ZDecompressStream()导致内存泄漏

  20. 20

    IOPSCopyPowerSourcesInfo()导致的内存泄漏

  21. 21

    NSRunAlertPanel导致内存泄漏

  22. 22

    fork() 导致内存泄漏

  23. 23

    如何在AndroidStudio 4中模拟由于内存不足而导致的Android Killing应用

  24. 24

    内存不足错误-可能是由于内存泄漏?

  25. 25

    Android Widget:大图像可滚动-内存不足

  26. 26

    Android Fragment Webview内存泄漏

  27. 27

    Android WebView发生内存泄漏

  28. 28

    防止Android中的内存泄漏

  29. 29

    Android WeakReference处理内存泄漏

热门标签

归档