Почему 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)
Это может быть временным решением этой проблемы, пока она не будет исправлена в следующем выпуске.