即时应用是 10 的一项关键功能,因此它们必须正常运行。即时应用是隐式安装的,因此它们的功能集受到限制,并在更严格的安全沙盒中运行。由于这些限制具有普遍性,系统的任何部分都可能无法与即时应用正常协作。创建 CTS 测试子集是为了确保即时应用允许的行为能够正常运行。关键思想是通过隔离要移植的最小测试集来最大限度地减少 CTS 的大小增长。在即时应用模式下运行 CTS 意味着将测试 APK 安装为即时应用并运行测试。
即时应用限制
即时应用不是由用户安装的,因此它们在受限的沙盒中运行,并具有以下限制
- 只能持有某些权限。
- 除非其他应用被标记为对即时应用可见,否则无法看到这些应用。
- 只能访问某些系统设置。
- 只能访问某些系统属性。
- 无法公开服务/提供程序。
- 可以接收和发送广播,但需遵守特殊规则。
此外,即时应用必须选择允许新的安全沙盒添加更多限制。围绕即时应用的这种广泛的特殊行为贯穿整个平台,因此需要一种方法来验证即时应用是否在生态系统中的所有设备上按预期工作。
在即时应用模式下运行的测试
并非所有 CTS 模块都有适用于即时应用的测试。如果模块测试的功能与系统服务器交互,则这些测试应在即时应用模式下运行。例如,OpenGL 测试不与系统服务器交互,因此无需在即时应用模式下运行它们,而辅助功能测试与系统服务器交互,因此需要在即时应用模式下运行它们。
除了确定哪些模块适用之外,用户还需要确定这些模块中的哪些测试是相关的。例如,测试可插拔架构(例如,AccessibilityService)的服务特定行为不适用于即时应用模式,因为即时应用无法向其他应用(包括平台)公开服务,而验证应用端行为的测试适用于即时应用模式。另一个例子是,验证即时应用无法持有的权限背后的行为的测试在即时应用模式下不相关。有一组仅适用于即时应用的测试,用于验证有关它们行为方式的规则,例如,不公开服务或不查看其他应用。通常,这些测试已经编写完成,不需要移植。
即时应用模式下的测试失败
如果测试失败是因为它验证了即时应用无法访问的功能,则它不适用于即时应用模式。通过使用 @AppModeFull
注释标记测试,使其仅在完整应用模式下运行。您可以将此注释应用于类级别,以排除其中的所有测试。
如果测试失败是因为即时应用可访问的某些功能已损坏,请提交错误报告。
故障排除
如果您的测试失败,并显示 *Failed to install MyCtsModule.apk on DEVICE. Reason: '-116'*,请在 logcat 上查找 PackageManager 消息。例如,如果显示 *Can't replace Full App with Instant App: your_app*,则请先使用 adb 卸载您的应用。