我们有一个核心 android 应用程序模块(称为app
)和一个动态功能模块(称为replay
)。即使这是一个 DFM,我们也会在安装时包含它。在我们 DFM 的 AndroidManifest.xml 中:
<dist:module
dist:instant="false"
dist:title="@string/title_replay">
<dist:delivery>
<dist:install-time />
</dist:delivery>
<dist:fusing dist:include="true" />
</dist:module>
我们可以使用 CL 中包含的 DFM 构建我们的 apk:$ ./gradlew app:assembleDebug
现在在测试时间......我们的功能模块中没有任何仪器测试replay
,只有我们的app
模块。所以我们可以从命令行运行仪器测试就好了:$ ./gradlew app:connectedDebugAndroidTest
然而,我们最近开始尝试在 Android Studio 中运行仪器测试。我们再次只想在app
模块上运行测试:
现在的问题是我们收到了一堆奇怪的“Android资源链接失败”错误:
What went wrong:
Execution failed for task ':replay:processDebugAndroidTestResources'.
/Users/user/.gradle/caches/transforms-2/files-2.1/48609a786af4d1714850acbdd03ace31/jetified-beacon-ui-1.0.3/
AndroidManifest.xml:15:9-19:54: AAPT: error: resource string/hs_beacon_empty (aka com.example.feature.replay.test:string/hs_beacon_empty) not found.
我们正在为我们的几个第三方依赖项(facebook、leakcanary、beacon 等)获取这些。它们似乎都是向现有 xml 文件(strings.xml、AndroidManifest.xml)添加值的库
它看起来像是replay
构建过程的一部分,AAPT 试图在我们的replay
模块中查找实际上在其他库中的资源。但是,为什么 AAPT 会查看我们的replay
功能模块:com.example.android.feature.replay.test:string/hs_beacon_empty
?
我没有完全了解 AAPT 如何为动态模块合并资源,我更不了解它是如何为仪器测试 apk 做到这一点的。
我不明白为什么这可以通过 CL 工作,所以我查看了 Android Studio 构建日志的顶部,当我运行仪器测试时我看到了
Executing tasks: [:replay:assembleDebug, :replay:assembleDebugAndroidTest, :app:assembleDebug, :app:assembleDebugAndroidTest]
所以现在更基本的问题是,为什么 Android Studio 在为应用模块运行测试时会尝试组装重放和重放测试代码?
FWIW 我正在运行 Android Studio 和 AGP 3.5 Beta 5