7

Я использовал инструмент leakcanary, чтобы обнаружить утечки памяти в моем приложении. Кажется, мой WebViewActivity протекает каждый раз.LeakCanary пятна Android WebView утечка памяти

Я создал простое приложение для проверки утечек. Я запускаю Activity с WebView внутри xml-файла макета/раздуваются с контекстом активности. Js выключен. Все по умолчанию ожидают, что простой webViewClient сохранит перенаправление в WebView. Он протекает каждый раз.

Я провел много исследований, единственный способ предотвратить это - запустить WebViewActivity с другим процессом и убить его внутри onDestroy. Но этот метод имеет свои недостатки.

Утечка происходит каждый раз на всех моих устройствах, работающих под управлением 5.0+, не проверяется с 4.3 и ниже.

Течь Информация наклеена ниже:

В com.example.webviewmemoryleaktest: 1,0: 1. * com.example.webviewmemoryleaktest.WebViewActivity просочились: * GC ROOT android.os.ResultReceiver $ MyResultReceiver.this $ 0 * ссылка org.chromium.content.browser.ContentViewCore $ 2 $ 1.эта $ 1 (анонимный класс расширяет android.os .ResultReceiver) * ссылка org.chromium.content.browser.ContentViewCore $ 2.эты $ 0 * ссылка org.chromium.content.browser.ContentViewCore.mContext * ссылка com.android.webview.chromium.ResourcesContextWrapperFactory $ WebViewContextWrapper.mBase * утечки экземпляру com.example.webviewmemoryleaktest.WebViewActivity

  • Reference Key: 9a0346cf-6ad9-4b07-9329-A97 5d8fa3cbe
  • Прибор: LGE Google Nexus 4 Оккама
  • Android Версия: 5.1 API: 22
  • Длительность: смотреть = 5139ms, Gc = 188ms, дамп кучи = 2822ms, анализ = 30918ms

Цените, если кто-нибудь может помочь. Благодаря!

+0

https://github.com/square/leakcanary/issues/92#issuecomment-102181372 - у них есть документально подтвержденная процедура для устранения утечек на основе кода Android. Это также рассматривается [в документации LeakCanary] (https://github.com/square/leakcanary#my-leak-is-caused-by-and-android-sdk-implementation). – CommonsWare

+0

Вы вызываете 'WebView.destroy()' [doc] (http://developer.android.com/reference/android/webkit/WebView.html#destroy()), когда вам больше не нужен WebView и удалили его из иерархия представлений? –

+0

Да, я сделал mWebView.destroy()/mWebView = null/mWebView.load (около: пусто), ни один из них не работает для меня. –

ответ

0
private ResultReceiver mResultReceiver = new ResultReceiver(new Handler()) { 
    @Override 
    public void onReceiveResult(int resultCode, Bundle resultData) { 
     getContentViewClient().onImeStateChangeRequested(
       resultCode == InputMethodManager.RESULT_SHOWN 
       || resultCode == InputMethodManager.RESULT_UNCHANGED_SHOWN); 
     if (resultCode == InputMethodManager.RESULT_SHOWN) { 
      // If OSK is newly shown, delay the form focus until 
      // the onSizeChanged (in order to adjust relative to the 
      // new size). 
      // TODO(jdduke): We should not assume that onSizeChanged will 
      // always be called, crbug.com/294908. 
      getContainerView().getWindowVisibleDisplayFrame(
        mFocusPreOSKViewportRect); 
     } else if (hasFocus() && resultCode 
       == InputMethodManager.RESULT_UNCHANGED_SHOWN) { 
      // If the OSK was already there, focus the form immediately. 
      assert mWebContents != null; 
      mWebContents.scrollFocusedEditableNodeIntoView(); 
     } 
    } 
}; 

@Override 
public ResultReceiver getNewShowKeyboardReceiver() { 
    return mResultReceiver; 
} 

сделать mResultReceiver частным.