Почему Android Studio собирает наш апк тестового модуля dyanimc?

У нас есть основной модуль приложения для Android (называемый app) и один модуль динамических функций (называемый replay). Несмотря на то, что это DFM, мы включаем его во время установки. В AndroidManifest.xml нашего DFM:

<dist:module
    dist:instant="false"
    dist:title="@string/title_replay">
    <dist:delivery>
        <dist:install-time />
    </dist:delivery>
    <dist:fusing dist:include="true" />
</dist:module>

Мы можем построить наш apk с DFM, включенным просто отлично от CL: $ ./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 объединяет ресурсы для динамических модулей, я еще меньше понимаю, как это происходит для инструментальных тестовых приложений.

Я не понимал, почему это работает через CL, поэтому я посмотрел верхнюю часть журналов сборки Android Studio и увидел, что когда я запускаю тестирование инструментальных средств

Executing tasks: [:replay:assembleDebug, :replay:assembleDebugAndroidTest, :app:assembleDebug, :app:assembleDebugAndroidTest]

Итак, теперь более простой вопрос заключается в том, почему Android Studio пытается собрать повтор и тестовый код воспроизведения при запуске тестов для модуля приложения?


Я использую Android Studio и AGP 3.5 Beta 5

0 ответов

Я исправил это, добавив зависимость приложения также для androidTest в моем модуле динамических функций

implementation project(':app')
androidTestImplementation project(':app')

Однако я не нашел ответа на этот вопрос, если вы просто хотите запустить тесты для своего :core, из консоли вы можете просто запустить gradle :app:connectedAndroidTest, и он должен обойти DFM.

Поскольку Android Studio также обрабатывает тестовый ресурс для динамического модуля, вы должны снова реализовать (как тестовую библиотеку) соответствующую библиотеку в своем динамическом модуле следующим образом:

Например, если Android Studio не смогла найти ресурсы библиотеки beacon-ui. добавлятьandroidTestImplementation "com.helpscout:beacon-ui:$beaconVersion" на ваш build.gradle(dynmic_module)

Это может быть временным решением этой проблемы, пока она не будет исправлена ​​в следующем выпуске.

Другие вопросы по тегам