Android 泄漏InputMethodManager中的Canary报告泄漏

Android 泄漏InputMethodManager中的Canary报告泄漏,android,leakcanary,Android,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

我正试图找出我的应用程序中的漏洞,但我不确定这是否来自

金丝雀告诉我我可以忽略它。是这样吗

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")
但仍然出现在金丝雀

显然这次泄漏是在AndroidExcludeRef,但仍在报告中。
是的,你可以忽略这个漏洞


例如检查此问题:

LeakCanary已将此漏洞视为Android操作系统故障。但还是发生了,这让我很恼火。如果有人卷入其中并想要修复它,那么有一个解决方法

只需在本周调用活动的onCreate

IMMLeaks.fixFocusedViewLeak(getApplication());

是的,您可以忽略此泄漏,但毕竟,泄漏是一种不受欢迎的情况,我们应该尝试使用任何黑客或伎俩来修复


对于上述泄漏,一个适用于所有版本的优雅解决方案是

,奇怪的是,当我忽略其他版本时,我会得到这样的结果。总是来自这个片段这是一个来自Android框架的bug,可能已经被报道过(并在Android的下一个版本中修复)。所以你不能对这个问题做些什么,所以你应该忽略它。我理解这一点,但还是觉得奇怪,当我忽略这个问题时,我从一个按钮中的侦听器那里得到了一个新的问题…并且有标签
泄漏可以忽略。
?我找到了其他人的原因,但我不能忽略这个。这意味着即使在该活动被销毁后,PhoneWindows仍保留对该活动的引用。怎样才能避免泄漏。(请参阅我的更新问题)但此解决方案有一个副作用,即按下“最近使用的应用程序”按钮时,会弄乱应用程序的“屏幕截图”。您的应用程序屏幕截图将显示为空白的黑色(或白色)屏幕,而不是显示实际的屏幕内容。尽管DummyActivity是完全透明的。404-“作者删除了这个中间故事”据我所知,解决方案是创建一个虚拟透明活动,并将其用作退出活动……有各种解决方案或解决方法:
/**
 * 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();
        }
    }
}