专栏首页Android必知必会遍历 AccessibilityNodeInfo 报 StackOverflowError

遍历 AccessibilityNodeInfo 报 StackOverflowError

如果移动端访问不佳,请使用 ==> Github Pages 版。

在使用 AccessibilityService 遍历包含 WebView 的 AccessibilityNodeInfo 时会在某些情况下必现 StackOverflowError 的错误,导致应用崩溃。

0x00 异常

最近使用 Android 的 AccessibilityService 做一些自动化操作时发现,在部分机器上遍历包含 WebView 页面的 AccessibilityNodeInfo 时,某些页面必定会引起 StackOverflowError 错误,经过一番查证,定位到主要与系统所使用的 Android System WebView 版本有关,属于 WebView 的 Bug。

相关说明可以参考 Android: Infinite loop of FrameLayouts in accessibility tree 的讨论。

查看 Android System WebView 版本(以下2种方法任一均可):

  1. 应用程序
    1. 菜单:显示系统应用程序
    2. 点击列表中的:Android System WebView
    3. 详情页内包含版本
  2. 开发者选项
    1. 开启「开发者选项」
    2. 开发者选项 -> WebView 实现

0x01 解决

方法有2种:

  1. 一个是尝试在 Google Play Store 中升级 Android System WebView 到最新版;
  2. 一个是使用递归遍历 AccessibilityNodeInfo 时限制遍历的最大深度,这个深度根据情况大致在 40~70之间即可,既要基本保证能遍历完正常的 NodeTree 内的 Node,又要不引起 StackOverflowError 导致应用崩溃。

当然,方法2更具有可控性和兼容性,某些情况下我们并不能左右用户手机上 Android System WebView 的版本。

0x02 总结

此类情况发生在特定的 Android System WebView 和 Android 版本上,建议使用了相关功能的应用加上 Bug 上报的功能。

如果有什么建议或者问题可以随时联系我,共同探讨学习:

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Android开发指南--0 总览

    无意间发现一个网站,主打IOS方面的教程,然而作为一个Android开发者,我就找了下网站里有没有Android的教程,还真有,这里就翻译一下。

    他叫自己MR.张
  • Android:Field can be converted to a local varible.

    版权声明:本文为[他叫自己Mr.张]的原创文章,转载请注明出...

    他叫自己MR.张
  • Android 项目开发填坑记 - NoSuchMethodError:(java.lang.System.arraycopy)

    版权声明:本文为[他叫自己Mr.张]的原创文章,转载请...

    他叫自己MR.张
  • 写给 Android 开发者的 I/O 18 大会精华导读

    Google 发布了 Android Jetpack,帮助开发者加快应用开发速度。

    HyperAI超神经
  • Android技能树

    请叫我大苏
  • 网站架构演化过程

    网站的架构通常都是逐渐演化完善的,下面就是一个常规的成长过程 (1)初识阶段 一台服务器 最初的架构,应用程序、数据库、文件都部署在一台服务器上 ? (2)...

    dys
  • Android进阶解密:探访AMS家族

    资深开发工程师,Android进阶二部曲《Android进阶之光》《Android进阶解密》的作者,公众号“刘望舒”的作者,CSDN人气博主。他在博客中构建了“...

    用户1682855
  • 【典型案例】用 PyTorch 实现图像识别

    PyTorch 是一个开源的深度学习框架,对深度学习算法进行训练和优化,它被广泛应用在人工智能领域。更多详细介绍可参考 PyTorch 官网。

    腾讯智能钛AI开发者
  • [数据可视化]绘制持仓榜单的“棒棒糖图”

    图中线的两端是圆点或者菱形,旁边都有标注持仓证券商和相对应的持多仓数或持空仓数,且左右线颜色不同。画图思路大体就是:先画水平线图,再用 scatter 散点图画...

    Crossin先生
  • leetcode 11

    题目大意,给n个点,在一个数轴上。每个点对x轴作垂线,找出由两条垂线和X轴组成的一个“容器”的装的水面积最大。就是两条垂线较小的高度*两垂线高度的面积最大...

    flytam

扫码关注云+社区

领取腾讯云代金券