如果执行的 JavaScript 进入无限循环,Android WebView 将进入不可恢复状态

2024-01-29

如果执行的 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 似乎永远不会关闭。这当然会快速耗尽电池并降低设备速度。只有终止包含的应用程序似乎才能解决此问题。

以下似乎无效:

  • 禁用 JavaScript:webView.getSettings().setJavaScriptEnabled(false);
  • 停止页面加载:webView.stopLoading();
  • 暂停所有 JS 计时器:webView.pauseTimers();
  • 加载备用 URL:webView.loadUrl("about:blank");
  • 从小部件层次结构中删除 WebView:parent.removeView(browserView);
  • 在 WebView 上调用 destroy:webView.destroy();
  • 结束活动:activity.finish();
  • 从 WebChromeClient.onJsTimeout() 返回 false; (此方法在 API 17 中已弃用,并且似乎从未被调用)。

以下是有效的:

  • 终止虚拟机:System.exit(0); (这是一个永远不应该在 Android 上调用的方法。)

值得注意的是,原生 Android 浏览器(不是 Chrome)也存在这个问题。尽管 Chrome 没有这个问题,但在使用 Android 4.4 中附带的基于 Chromium 的 WebView 时,它似乎仍然会出现。

一旦一个 WebView 进入此状态,应用程序将无法将任何 URL 加载到任何其他 WebView 中。

如果有人对终止 WebView 有任何建议,我们将不胜感激。我无法控制加载到 WebView 中的内容,因为它用于通用浏览器。否则,我的默认解决方案将是尝试检测该情况并在遇到该情况时警告用户,提供强制终止应用程序以防止电池耗尽的选项。

谢谢您的任何想法!


我认为你对此无能为力。因为 WebView 是单个进程(这对于 4.4 WebView 也是如此)并且渲染器在应用程序的进程中运行,行为不当的网页可能会导致您的进程因分配大量内存而被 OOM 终止。

Chrome 不会遇到这个问题,因为它在一个可以终止的单独进程中运行渲染器。可以修改 WebView 以杀死正在执行 JavaScript 的线程,但这会导致内存泄漏(因为操作系统不会像在单独进程的情况下那样为您清理),就像我上面所说的- 这样做并不能真正保护您免受分配内存的恶意网页的侵害。

我认为你的解决方案是显示“页面没有响应。杀死应用程序?”向用户弹出是使用 WebView 可以做的最好的事情。另一种方法是基于 Chromium 代码创建您自己的多进程浏览器,但这可能需要付出更多的努力。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如果执行的 JavaScript 进入无限循环,Android WebView 将进入不可恢复状态 的相关文章

  • 服务中的膨胀视图显示视图,但不显示布局内的 ImageView

    我已经成功地在服务中扩展了我的布局 但是它没有显示ImageView在 的里面Inflated Layout我不知道为什么 我设置了一个onClickListener在图像视图上 它工作得很好 当我单击绿色方块时记录并停止服务 唯一的问题是
  • 在 Android 10 上使用 RNFetchBlob 的下载管理器 React Native 下载文件

    我需要使用 React Native 应用程序将文件下载到用户的下载目录rn 获取 blob https www npmjs com package rn fetch blob 但似乎与 Android 10 不兼容 因为我收到错误 首先我
  • 将美元金额动态转换为文本以包含“美元”和“美分”一词

    我需要将输入字段中输入的美元金额动态转换为文本 我能找到的最接近的解决方案几乎可以满足我的需求 但是 我希望结果文本包含 美元 一词 并删除句子末尾带有 美分 的 点 一词 这是起始原型和当前结果 function amountToWord
  • 检测“文件下载”弹出窗口何时关闭

    我有一个网页 用 JSF 制作 其中一些链接允许用户获取 PDF 文件 当用户点击这样的链接时 会显示一个等待弹出窗口 它是一个模式面板 因为 PDF 的生成可能很长 并且一旦创建文件 IE 就会显示 文件下载 弹出窗口 建议 打开 保存
  • 玩笑测试因 refs 和 Form 失败

    我有一个搜索栏组件 如下所示 render const onChangeTextInput this props return
  • 从字符串中提取所有链接

    我有一个 javascript 变量 其中包含页面的 HTML 源代码 不是当前页面的源代码 我需要从该变量中提取所有链接 关于什么是最好的方法的任何线索 是否可以为变量中的 HTML 创建一个 DOM 然后遍历它 我不知道这是否是推荐的方
  • Android EditText:在触摸时选择所有文本,并在用户开始输入时清除。

    我的应用程序中有一个编辑文本 当用户触摸编辑文本时 应选择整个文本 而当他开始输入文本时 应清除文本 一个例子是浏览器地址栏 有什么办法可以做到这一点吗 请帮助我 您可以使用以下方法选择 EditText 中的所有文本 android se
  • JQuery 从 Div 中抓取文本减去子元素[重复]

    这个问题在这里已经有答案了 有没有一种简单的方法可以从这个 div 中获取文本而不获取任何子元素 div strong Title Text Unwanted strong This is the text I need div 我知道我可
  • 检测 Android 中 OSM Mapview 是否仍在加载

    我已将 Open Street Maps 包含在我的 Android 应用程序中 在地图视图中 用户应该能够在地图完全加载后捕获屏幕 但目前 即使地图视图仍在加载 用户也可以捕获图像 有人可以告诉我如何检测地图视图何时完全加载吗 下面是我加
  • Ember JS 过渡到嵌套路由,其中​​所有路由都是视图中的动态段

    我们正在使用 EmberJS 编写一个应用程序 然而 我们对这个框架仍然陌生 我们很难解决一些看似简单的问题 模型非常简单 有 3 个模型 Queue Task 和 Image 我们对所有路由使用动态 URI 段 并且这些模型的路由嵌套在以
  • 为什么 JavaScript 原型属性在新对象上未定义?

    我对 JavaScript 原型概念还很陌生 考虑以下代码 var x function func x prototype log function console log 1 var b new x 据我了解 b log 应该返回 1 因
  • Marshmallow 中的手电筒控制

    我对最新 Marshmallow 版本中的相机 更具体地说是手电筒 有疑问 在任何棉花糖之前的版本上 我需要执行以下操作来打开 关闭闪光灯 private void turnFlashOn final Camera camera int f
  • 尝试初始化 AudioRecord 时出现“无法获取记录源 1 的音频输入”

    当尝试初始化 AudioRecord 对象并尝试使用 Eclipse 使用模拟器录制声音时 我不断收到此错误 我尝试过各种位采样率 8000 是唯一有效的 但错误仍然出现 我尝试过各种版本的sdk 1 5 1 6 2 2 2和2 3 1 以
  • Redux Spread 运算符与 Map

    我有一个数组中的对象状态 在我的 ReduxReducer 中 const initialState items id 1 dish General Chicken price 12 1 quantity 0 id 2 dish Chick
  • emberjs 对一条路线使用多个路径/url

    在 Ember 中我可以使用这个 App Router map function this route accomodations 因此 如果访问 accomodations 它将加载该视图 我还可以补充 App Router map fu
  • 在每个 Activity 上调用工具栏

    我的应用程序有一个工具栏 应该出现在每个视图上 目前 我在我的onCreate 我有每个活动的方法 Toolbar toolbar Toolbar findViewById R id toolbar setSupportActionBar
  • 规范注册 ID 和消息 ID 格式

    我的理解有问题Canonical Registration Id并让谷歌返回它 我特意注册了两次我的Android应用程序 以测试Canonical Registration Id 但是当我尝试向两者推送消息时Registration Id
  • 进度对话框未显示在屏幕上

    我根据亲爱的 Mayank answer 编辑了我的代码 但它没有显示在方法开始之前在 displayMsg 方法中作为输入发送的任何消息 我应该说 MethodTest 是通过 nfc 和 onNewIntent Intent Inten
  • 如何跟踪用户在我的 Android 应用程序上花费了多少时间?

    我想跟踪用户在我的 Android 应用程序上花费了多少时间 当用户在应用程序上处于活动状态时 我可以获取以小时为单位的时间吗 它会自动跟踪 Note 应用程序不在 Google Play 上 此代码将帮助您获取应用程序使用时间 long
  • Android 列表视图布局 类似于 Google play

    我想实现一个类似于 Google Play 的列表布局 其中每个行都有菜单 请帮助我创建这个 我是否需要创建一个弹出菜单或者有任何选项可以实现此目的 Thanks 看起来您正在尝试完全按照图中所示的方式进行操作 我只是举一个例子来说明我如何

随机推荐