为何uiautomator2可获取更多控件(含电池/WiFi图标)?求原理
为什么UiAutomator2能获取更多控件?
核心实现原理
突破原生权限限制
原生UiAutomator依赖系统的AccessibilityService,但状态栏的电池、WiFi这类控件属于SystemUI系统进程,原生工具默认没法跨进程读取这些受保护的控件信息。而UiAutomator2会在设备上安装一个自定义代理服务APK,这个服务拥有更高的系统权限,能直接和SystemUI进程交互,绕过了原生工具的跨进程访问限制。扩展控件扫描范围
原生UiAutomator的扫描逻辑只覆盖普通应用的UI层级,UiAutomator2修改了底层的UiAutomatorBridge,增加了对系统全局UI(包括状态栏、导航栏)的扫描支持。它会主动遍历设备上所有可见窗口的视图树,包括SystemUI的窗口,自然就能捕捉到电池、WiFi这类系统级小控件。优化无障碍服务配置
UiAutomator2会自动开启一些原生UiAutomator默认关闭的无障碍服务参数,比如FLAG_INCLUDE_NOT_IMPORTANT_VIEWS和FLAG_REQUEST_ENHANCED_WEB_ACCESSIBILITY,这些参数能让服务获取到原生工具默认忽略的“不重要”控件——状态栏图标这类小控件刚好属于这一类。进程注入增强(部分版本)
有些UiAutomator2的实现会用类似Xposed的注入技术,把代码直接注入到SystemUI进程里,直接读取控件的属性信息,这种方式完全绕开了无障碍服务的限制,能拿到更底层的控件数据。
内容的提问来源于stack exchange,提问作者Shan Zhijun
相关产品推荐
相关产品推荐

