我正在开发质量检查自动化解决方案,该解决方案可以在Android上记录/回放质量检查测试。一个关键的业务要求是在回放记录的测试时不依赖于连接的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);
}
}
答案 0 :(得分:1)
请参见signature protection level - clarifying ...除非该软件包已被Google的发行密钥列入白名单,否则您将无法获得必要的许可。这是一项安全/完整性功能,旨在限制恶意软件的行为-您打算在此处进行的操作是典型的恶意软件行为-无论其实际意图是什么;对系统进行工作无济于事。
唯一可以想象的方法是直接从终端仿真器或测试应用程序运行命令-针对AOSP的自定义版本,以便可以将android:protectionLevel="signature"
添加到{{1 }},然后要求Manifest.xml
。但是使用库存ROM,绝对没有机会这样做。不是,这“不可能”,但是构建自定义ROM意味着要付出很多努力才能到达那里。至少对于android.permission.INTERACT_ACROSS_USERS_FULL
和Nexus
设备,所需的驱动程序可用here;对于其他设备,您甚至必须在设备的供应商处找到它们。
诀窍是使用与应用程序相同的密钥来注销ROM-只有获得Pixel
级权限-而对于普通ROM,您(理论上)则需要Google的发行密钥来进行签名打开包装。如here所述,一个人可以强制执行一个用户,而这也仅适用于系统应用程序。