20

我正在开发一个 QA 自动化解决方案,可以在 Android 上记录/回放 QA 测试。一个关键的业务要求是在回放记录的测试时不依赖连接的 PC。为此,我正在尝试在没有连接 PC 的情况下运行仪器测试。(特别是 Appium UiAutomator2 测试)。

我目前的方法是尝试从我的应用程序以编程方式运行测试。如果我在连接的 PC 上正常运行测试,我会使用命令adb shell am instrument -w. 我尝试从我的应用程序访问 ADB Shell 并运行am instrument -w,但这会产生一个错误,我缺少 INTERACT_ACROSS_USERS_FULL 权限。

为了解决这个问题,我尝试使用startInstrumentation运行测试。这样就成功开始了测试。但是,测试立即崩溃。经过进一步调查,我将崩溃追溯到 NPE:测试正在尝试检索InstrumentationRegistry.getInstrumentation.getUiAutomation(0),但这会返回 null。

如何以编程方式运行测试并为其提供对所需 UiAutomation 实例的访问权限?

这就是我开始测试的方式:

public void runTest() {
    final String pm = getPackageName().replaceFirst(".test$", "");
    final InstrumentationInfo info = getInstrumentationInfo(pm);
    if (info != null) {

        final ComponentName cn = new ComponentName(info.packageName,
                info.name);

        Bundle arguments = new Bundle();
        arguments.putString("class", "io.testim.appiumwrapper.test.AppiumUiAutomator2Server");
        //cn = {io.extension.test/android.support.test.runner.AndroidJUnitRunner}
        startInstrumentation(cn, null, arguments);

    } 
}
4

1 回答 1

1

请参阅签名保护级别 - 澄清...除非将包列入 Google 发布密钥的白名单,否则您将无法获得必要的许可。这是一个安全/完整性功能,目的是限制恶意软件能够做什么——以及你打算在那里做什么,是典型的恶意软件行为——无论它的实际意图是什么;与系统作对是无济于事的。

我可以成像的唯一方法是直接从终端仿真器或测试应用程序运行命令 - 针对AOSP的自定义构建,以便您可以添加android:protectionLevel="signature"Manifest.xml然后 require android.permission.INTERACT_ACROSS_USERS_FULL。但是使用库存ROM,绝对没有机会这样做。不是,这将是“不可能的”,但构建自定义 ROM 需要付出相当多的努力才能实现。至少对于NexusPixel设备,所需的驱动程序都可以在此处获得;对于其他设备,您必须在设备供应商处找到它们,如果它们甚至可用的话。

诀窍是使用与应用程序相同的密钥签署 ROM - 只有这样signature才能获得级别权限 - 而对于库存 ROM,您(理论上)需要 Google 的发布密钥来签署包。可以强制执行单个用户,如此所述,而这也仅适用于系统应用程序。

于 2018-09-04T08:10:47.650 回答