2017-07-28 4 views
13

私はWebViewを含むアプリケーションをビルドしています。これにはJavaScriptコードがいくつかあります。そのJavaScriptコードは非常に重い割り当てであり、多くのメモリを必要とする可能性があります。WebViewの利用可能なメモリを検出します

必要なメモリ量が、JavaScriptが必要とする量を超え、WebViewのChromiumプロセスがクラッシュしてアプリケーションがクラッシュすることがあります。

私のアプリケーションではonMemoryTrimを聞いていますが、メモリが1GBを超えるデバイスではこのシナリオでは決して呼び出されません。 (TRIM_MEMORY_RUNNING_LOWでさえも)。

私のWebViewのメモリが不足していることを検出する方法がありますか?それを殺すか知らせる(メモリを解放することができます)?

ポーリングを試みましたが、performance.memoryが機能しませんでした。その中で実行された場合、次のスクリプトは、WebViewのをクラッシュ:

var a = []; 

var kek =() => { 
    var b = []; 
    for(var i = 0; i < 1024 * 1024 * 2; i++) b.push(Math.random()); 
    return b; 
} 

var ival = setInterval(() => { 
    let m = performance.memory; 
    if(m.jsHeapSizeLimit - m.usedJSHeapSize < 1e5) { 
    console.log("Memory limited") 
    } else { 
    a.push(kek()); 
    } 
}); 

は、メモリを検出する方法は、私はアプリがクラッシュすることなく優雅にそれを扱うことができなくなっしようとしているがありますか?

+0

'onTrimMemory()'は、ライフサイクル全体のイベントと空きシステムRAM *の量に基づいて呼び出されます。あなたの問題は、ある種のプロセス制限(標準的なアプリケーションのヒープ限界など)に縛られているように見えます。このようなシナリオでは 'onTrimMemory()'は呼び出されません。 – CommonsWare

+0

@CommonsWareありがとう、私はこれらがシステム全体でトリガーされたフックであることを認識していませんでした。 ChromeのJavaScriptの制限は、ここでは問題になっているようです。完全に率直になるためには、これは[Chromeが漏れている](https://bugs.chromium.org/p/chromium/issues/detail?id=749482)、ある程度の限界に達するとクラッシュする(アプリで)。このXY問題の私のXはクラッシュではなく、クラッシュしたり、アプリでキャッチしてクラッシュさせたりする方法はありませんが、純粋に興味のあるPoCからメモリ使用量を測定する方法にも興味があります。 –

+0

@CommonsWareと明らかに8.0ではXから回復する方法が導入されています - https://developer.android.com/preview/features/managing-webview.html#termination-handle –

答えて

6

私はChromiumチームとAndroidチームでこれについて議論しており、現時点では(彼らは思っていて信じています)これは不可能です

場合によっては、JavaScriptが必要とするメモリ量を超えて、WebViewのChromiumプロセスがクラッシュしてアプリケーションがクラッシュすることがあります。

しかし、Android 8.0以降では、the new termination handle APIを使用してメモリクラッシュをキャッチできます。だから、これは私の問題の周りの最初の場所で必要な使用可能なメモリをチェックする必要はありませんので動作します。

onRenderProcessGoneを上書きすることで、バグを見つけてWebViewを再作成します。

関連する問題