Подтвердить что ты не робот

Обнаружить доступную память внутри WebView

Я создаю приложение, содержащее WebView, которое запускает некоторый код JavaScript. Этот код JavaScript довольно тяжелый и может потребовать много памяти.

Иногда количество требуемой памяти превышает количество, которое может потребоваться JavaScript, и сбой Chromium-процесса WebView, который разбивает мое приложение.

Я слушаю onMemoryTrim в своем приложении, но он никогда не вызывается в этом сценарии на устройствах с объемом памяти более 1 ГБ. (Даже с TRIM_MEMORY_RUNNING_LOW).

Можно ли каким-либо образом обнаружить, что мой WebView работает на низкой памяти, и либо убить его, либо сообщить ему (чтобы он мог освободить память)?

Я опробовал опрос performance.memory, но это не сработало. Следующий script сбой 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());
  }
});

Есть ли способ обнаружить, что память вот-вот закончится, чтобы я мог обработать ее изящно без сбоя приложения?

4b9b3361

Ответ 1

Я обсуждал это с командой Chromium и командой Android и на данный момент (они думают, и я верю им), что это невозможно.

Иногда количество требуемой памяти превышает количество, которое может потребоваться JavaScript, и сбой Chromium-процесса WebView, который разбивает мое приложение.

Тем не менее, вы можете избежать сбоев памяти в Android 8.0+, используя новый API дескриптора завершения. Таким образом, это работает вокруг моей проблемы, не имея необходимости проверять доступную память, требуемую в первую очередь.

Перевернув onRenderProcessGone - мы поймаем ошибку и заново создадим WebView.