如果执行的JavaScript代码被无限循环捕获,则Android WebView小部件似乎进入不可恢复的状态。
例如,此网页会导致问题:
<html>
<head>
<title>FAIL</title>
<script type="text/javascript">
function test() {
while (true);
}
</script>
</head>
<body onload="test();">
Failure Test
</body>
只需使用WebView在任何Android浏览器中输入以下URL:
javascript:while(true);
一旦遇到这样的无限循环,一个CPU核心将以最大值运行。 WebView似乎永远不会关闭。这当然会迅速耗尽电池并使设备变慢。只有终止包含的应用程序似乎才能解决此问题。
以下似乎无效:
以下是有效的:
值得注意的是,Android浏览器(不是Chrome)也存在这个问题。虽然Chrome没有问题,但在使用Android 4.4中附带的基于Chromium的WebView时仍然会出现这种情况。
一旦WebView进入此状态,应用程序将无法将任何URL加载到任何其他WebView中。
如果有人对终止WebView有任何建议,我们将不胜感激。我无法控制加载到WebView中的内容,因为它被用于通用浏览器。否则,我的默认解决方案是尝试检测方案并在遇到问题时警告用户,提供强制终止应用程序以防止电池耗尽的选项。
感谢您的任何想法!
答案 0 :(得分:1)
我认为你不能做太多。因为WebView是单个进程(对于4.4 WebView也是如此)并且渲染器在您的应用程序进程中运行,行为不当的网页可能会导致您的进程因分配大量内存而被OOM杀死。
Chrome不会遇到此问题,因为它在一个可以被杀死的单独进程中运行渲染器。可以修改WebView以杀死正在进行JavaScript执行的线程,但这会导致内存泄漏(因为操作系统不会像在单独的进程中那样为您清理)并且如上所述 - 这样做并不能真正保护您免受恶意网页分配内存的侵害。
我认为您显示“该页面没有响应的解决方案。杀死应用程序?”使用WebView可以最好地为用户弹出窗口。另一种方法是根据Chromium代码创建自己的多进程浏览器,但这可能需要更多的努力。