【问题标题】:LeakCanary report leak in InputMethodManagerLeakCanary 报告 InputMethodManager 中的泄漏
【发布时间】:2016-01-06 11:17:01
【问题描述】:

我正在尝试找出我的应用程序中的泄漏,但我不确定这是来自哪里。

LeakCanary 告诉我可以忽略它。对吗?

01-06 12:04:56.580 6935-9159/com.mypackage D/LeakCanary: * LEAK CAN BE IGNORED.
01-06 12:04:56.580 6935-9159/com.mypackage D/LeakCanary: * com.mypackage.ui.map.MapComponentFragment has leaked:
01-06 12:04:56.580 6935-9159/com.mypackage D/LeakCanary: * GC ROOT android.view.inputmethod.InputMethodManager$1.this$0 (anonymous class extends com.android.internal.view.IInputMethodClient$Stub)
01-06 12:04:56.580 6935-9159/com.mypackage D/LeakCanary: * references android.view.inputmethod.InputMethodManager.mCurRootView
01-06 12:04:56.580 6935-9159/com.mypackage D/LeakCanary: * references com.android.internal.policy.impl.PhoneWindow$DecorView.mContext
01-06 12:04:56.580 6935-9159/com.mypackage D/LeakCanary: * references com.mypackage.ui.MainActivity.mFragments
01-06 12:04:56.580 6935-9159/com.mypackage D/LeakCanary: * references android.app.FragmentManagerImpl.mAdded
01-06 12:04:56.580 6935-9159/com.mypackage D/LeakCanary: * references java.util.ArrayList.array
01-06 12:04:56.580 6935-9159/com.mypackage D/LeakCanary: * references array java.lang.Object[].[0]
01-06 12:04:56.580 6935-9159/com.mypackage D/LeakCanary: * leaks com.mypackage.ui.map.MapComponentFragment instance
01-06 12:04:56.580 6935-9159/com.mypackage D/LeakCanary: * Reference Key: 0790f013-1c87-4d5f-8c10-db277187e3ce
01-06 12:04:56.580 6935-9159/com.mypackage D/LeakCanary: * Device: samsung samsung SM-N910C treltexx
01-06 12:04:56.580 6935-9159/com.mypackage D/LeakCanary: * Android Version: 5.1.1 API: 22 LeakCanary: 1.4-SNAPSHOT 2714152
01-06 12:04:56.580 6935-9159/com.mypackage D/LeakCanary: * Durations: watch=5085ms, gc=149ms, heap dump=2562ms, analysis=10313ms

这个片段导致了几个泄漏,但我修复了它们。这个我不能让它消失。

有什么线索吗?

编辑

还有一件事,如果我想忽略它应该就足够了吗?

.instanceField("android.view.inputmethod.InputMethodManager", "mCurRootView")

但仍出现在 LeakCanary 中

显然,此泄漏在 AndroidExcludeRef 中,但仍在报告中。 https://github.com/square/leakcanary/issues/322

【问题讨论】:

标签: android leakcanary


【解决方案1】:

是的,你可以忽略这个泄漏。

检查例如这个问题:https://github.com/square/leakcanary/issues/256

【讨论】:

  • 奇怪的是,当我忽略其他人时,我会遇到这样的情况。总是来自这个片段
  • 这是来自 Android 框架的错误,可能已经报告(并在 Android 的下一版本中修复)。所以你不能对这个问题做点什么,所以你应该忽略它。
  • 我明白这一点,但我仍然觉得奇怪的是,当我忽略这个时,我会通过按钮从听众那里得到一个新的......
  • 那有标签LEAK CAN BE IGNORED.?
  • 我找到了其他人的原因,但我不能忽视这一点。即使在此活动被销毁后,PhoneWindows 仍保留对活动的引用的接缝。怎样才能避免得到这个泄漏。 (请参阅我的更新问题)
【解决方案2】:
/**
 * call this method in activity onDestroy() method.
*/
public static void fixInputMethod(Context context) {
    if (context == null) {
        return;
    }
    InputMethodManager inputMethodManager = null;
    try {
        inputMethodManager = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
    } catch (Throwable th) {
        th.printStackTrace();
    }
    if (inputMethodManager == null) {
        return;
    }
    Field[] declaredFields = inputMethodManager.getClass().getDeclaredFields();
    for (Field declaredField : declaredFields) {
        try {
            if (!declaredField.isAccessible()) {
                declaredField.setAccessible(true);
            }
            Object obj = declaredField.get(inputMethodManager);
            if (obj == null || !(obj instanceof View)) {
                continue;
            }
            View view = (View) obj;
            if (view.getContext() == context) {
                declaredField.set(inputMethodManager, null);
            } else {
                continue;
            }
        } catch (Throwable th) {
            th.printStackTrace();
        }
    }
}

【讨论】:

    【解决方案3】:

    是的,您可以忽略此泄漏。解决上述泄漏的 hacky 解决方案适用于所有版本是 here


    2022 年 4 月编辑:-

    中等故事的作者删除了它但the solution was around using a transparent activity as an exit activity.

    【讨论】:

    • 但是,当按下“最近使用的应用程序”按钮时,此解决方案的副作用是会弄乱应用程序的“屏幕截图”。您的应用屏幕截图将显示为空白的黑色(或白色)屏幕,而不是显示实际的屏幕内容。尽管 DummyActivity 是完全透明的。
    • 404 - “作者删除了这个 Medium 故事”
    • 据我所知,解决方案是创建一个虚拟透明活动并将其用作退出活动.....
    • 链接说它已删除...
    • @humble_wolf 多么“优雅”的解决方案,现在我明白为什么文章被删除了 ;)
    【解决方案4】:

    LeakCanary 已经将此泄漏视为 Android 操作系统故障。但仍然发生,这让我很恼火。如果有人遇到此问题并想修复它,则有一种解决方法。

    https://gist.github.com/pyricau/4df64341cc978a7de414

    只需调用 Activity 的 onCreate 这个

    IMMLeaks.fixFocusedViewLeak(getApplication());
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-25
      相关资源
      最近更新 更多