UiAutomation vs AccessibilityService

问题描述

doc's中,它说了关于UiAutomation

用于通过模拟用户操作与设备UI进行交互的类 屏幕内容的自省。它依赖平台 可访问性API,以对屏幕进行内部检查并执行一些操作 远程视图树上的操作。它还允许注入任意 原始输入事件,模拟用户键盘和触摸的交互 设备。可以将UiAutomation视为一种特殊的 AccessibilityService,不提供使用寿命挂钩 循环并公开其他对UI测试自动化有用的API。

此类公开的API是低级的,以最大程度地提高灵活性 在开发UI测试自动化工具和库时。通常, UiAutomation客户端应使用更高级别的库或 实施高级功能。例如,在 屏幕需要构造和上下触摸 必须通过调用将事件传送到系统 injectInputEvent(android.view.InputEvent,boolean)。

此类公开的API在各种应用程序之间运行,从而实现了 客户编写覆盖多个用例的测试 应用程序。例如,转到设置应用程序进行更改 设置,然后与其行为的另一个应用程序进行交互 取决于该设置。

UiAutomation与常规AccessibilityService的区别是什么,因为它不在source code中继承。

public final class UiAutomation {
    private static final String LOG_TAG = UiAutomation.class.getSimpleName();
    // omitted the rest...

解决方法

无障碍服务:

仅应用于协助残障用户使用Android 设备和应用。它们在后台运行,并接收AccessibilityEvents [...]。这样的事件表示一些 用户界面中的状态转换,例如,焦点具有 更改,已单击按钮等。此类服务可以选择 请求具有查询活动窗口内容的功能。

这是一个功能强大的工具,可让您基本上访问手机上发生的所有事情,因此用户需要在手机设置中明确启用此类服务​​(通常在“辅助功能/已安装的服务”下)。

UiAutomation:

您基本上引用了问题中的描述,但是这里有一个更详细的描述:

UiAutomation以某种方式充当修饰的AccessibilityService(decorator design pattern。)。您可以通过读取方法getServiceInfo和setServiceInfo的源代码来对其进行验证,该方法在内部使用连接的服务副本(请检查导入以快速查看)。

这是一个包装器,它添加了一些功能,例如,它使您可以导航视图层次结构等,而无需每次首次运行测试时都在电话设置中启用辅助功能。这是借助android.app.Instumentation类和其他测试框架组件来实现的。系统可以安全地授予所需的权限,因为检测can only be started through adb or from within a System App

这实际上不是AccessibilityService(甚至不是真正的服务),但为了简单起见并引起人们对底层环境的注意,它可能被称为这种方式。