在多模块android项目中测试时出现冲突的提供者错误

Mat*_*atF 6 android android-contentprovider android-testing android-gradle-plugin

我有一个由多个 gradle 模块组成的应用程序:

App -- main app module with dependencies to all submodules
|
|-- API - library module
|    |-- Constants for authority etc.
|
|-- DB-Impl - library module
|    |-- ContentProvider for the data specified in API
|
|-- Extension - library module
|    |-- Dependency on API and test-dependency on DB-Impl
Run Code Online (Sandbox Code Playgroud)

这在构建和部署主 apk 时工作正常。所有模块都在清单中使用相同的 sharedUserId,并且可以从 DB-Impl 访问提供程序。

然而,当我尝试为不同的模块运行仪器测试时,它变得复杂了。

例如:我运行 DB-Impl 测试,该模块单独安装在设备上。当我想部署主应用程序或尝试运行它的测试时,apk 安装失败,因为它还包含提供程序,引发INSTALL_FAILED_CONFLICTING_PROVIDER错误。

扩展模块也是如此。它需要数据库,通常包含在主应用程序 apk 中。当简单地运行测试时,它们会因为没有安装提供程序而失败。所以我添加了androidTestCompile对 DB-Impl 模块的依赖。现在这个测试 apk 还包括提供者定义,导致更多的错误。

我尝试在测试任务上添加任务依赖项,因此它会运行uninstallAll,但是这只会卸载从中调用它的模块,因此我必须手动卸载可能随提供程序一起提供的每个模块。

是否有避免问题的通用策略?

ult*_*aon 2

我遇到了同样的问题,并且发现只有一种方法可以解决它。您需要在androidTest目录中创建Manifest.xml,并使用另一个权限重新声明内容提供程序(例如附加“.test”后缀),还需要为“provider”xml元素添加附加属性:“tools:node='replace' ”,通过这种方法,您可以覆盖库模块测试 apk 的内容提供者权限。