我正在开发一个 QA 自动化解决方案,可以在 Android 上记录/回放 QA 测试。一个关键的业务要求是在回放录制的测试时不依赖于连接的 PC。为此,我尝试在没有连接电脑的情况下运行仪器测试。 (具体来说,Appium UiAutomator2 测试)。
我当前的方法是尝试从我的应用程序以编程方式运行测试。如果我从连接的 PC 上正常运行测试,我会使用以下命令adb shell am instrument -w
。我尝试从我的应用程序访问 ADB Shell 并运行am instrument -w
,但这会产生一个错误,即我缺少 INTERACT_ACROSS_USERS_FULL 权限。
为了解决这个问题,我尝试使用运行测试开始检测 https://developer.android.com/reference/android/content/Context.html#startInstrumentation(android.content.ComponentName,%20java.lang.String,%20android.os.Bundle)。这样就成功开始测试了。然而,测试立即崩溃。经过进一步调查,我将崩溃追溯到 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);
}
}
see 签名保护级别 - 澄清 https://stackoverflow.com/questions/21438129/signature-protection-level-clarifying...除非该软件包被 Google 的发布密钥列入白名单,否则您将无法获得必要的权限。这是一项安全/完整性功能,旨在限制恶意软件能够执行的操作 - 以及您打算执行的操作是典型的恶意软件行为 - 无论其实际意图如何;违背体制是没有结果的。
我可以成像的唯一方法是直接从终端模拟器或测试应用程序运行命令 - 针对自定义构建AOSP https://source.android.com/setup/,这样你就可以添加android:protectionLevel="signature"
to the Manifest.xml
然后要求android.permission.INTERACT_ACROSS_USERS_FULL
。但对于普通ROM来说,绝对没有机会这样做。这并不是说“不可能”,但构建自定义 ROM 意味着要付出相当大的努力才能实现这一目标。至少对于Nexus
and Pixel
设备,所需的驱动程序可用here https://developers.google.com/android/drivers;对于其他设备,您必须在设备供应商那里找到它们(如果有的话)。
诀窍是使用与应用程序相同的密钥来签署 ROM - 只有这样signature
可以获得级别权限 - 而对于库存 ROM,您(理论上)需要 Google 的发布密钥来签署软件包。正如所解释的,可以强制执行单用户here https://source.android.com/devices/tech/admin/multiuser-apps,而这也仅适用于系统应用程序。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)