AccessibilityService 的滥用检测,现在的限制有多严
AccessibilityService 的滥用检测,现在的限制有多严
前阵子给一个内部工具做 Android 14 适配,核心功能依赖 AccessibilityService 遍历节点做自动化点击。代码在 Android 13 上跑得还算顺利,升级到 14 之后,同样逻辑的 findAccessibilityNodeInfosByViewId 开始频繁返回空列表。起初以为是目标应用改了布局结构,折腾两天才发现,很多节点的 text 和 contentDescription 被系统直接置空了。查文档才知道 Android 14 引入了一个叫 android:accessibilityDataSensitive 的属性,这只是一个开始。顺着这个口子往下摸,我发现 Google 在系统层、政策层、运行时三个维度上对 AccessibilityService 做了一套极其严密的包围网。现在的限制,远比大多数开发者想象的要严。
Android 14 的节点隐身衣:accessibilityDataSensitive
Android 14(API 34)的 View 系统里新增了 android:accessibilityDataSensitive 属性,官方文档的解释很简短:标记包含敏感用户数据的视图,限制非受信任的无障碍服务访问。但真正落地到 AOSP 源码里,这个限制非常硬。
| 在 `AccessibilityInteractionController` 的 `findAccessibilityNodeInfoByAccessibilityId` 路径中,系统会调用 `node.getFlags()` 检查 `FLAG_ACCESSIBILITY_DATA_SENSITIVE`。如果目标 View 标记了 `true`,且调用方的 AccessibilityService 没有 `REQUEST_ACCESSIBILITY_DATA_SENSITIVE` 权限——而这个权限的 protectionLevel 是 `signature | privileged`,意味着第三方应用根本不可能拿到——那么系统在 Parcel 数据返回之前就会把 `text`、`hintText`、`stateDescription` 等字段抹掉。你拿到的 `AccessibilityNodeInfo` |
|---|