Использовать ли отдельные репозитории или папки для модулей в Android проекте
Что проверяют
Понимаете ли вы, как устроена многомодульная сборка на Gradle и чем платят за разнос модулей по репозиториям. Следом обычно спрашивают, как вы делите проект на модули и как ускорить сборку, когда их становится сотня.
Как отвечать
Стандарт для одного приложения это монорепозиторий с модулями-папками: в settings.gradle.kts строки вида include(":core:network") и include(":feature:profile"). Так устроен и эталонный проект Google Now in Android. Аргументы:
- атомарные изменения: правка API в
coreи во всех его потребителях идёт одним коммитом и одним ревью, CI сразу видит поломку; - нет версий между своими модулями: модуль зависит от
project(":core:ui"), а не от опубликованного артефакта; - сборка: Gradle собирает модули параллельно и кеширует результаты. Зависимость через
implementationне протекает к потребителям модуля, поэтому правка внутри него пересобирает меньше, чем сapi. Общие настройки держат в convention-плагинах вbuild-logic, версии вlibs.versions.toml; - масштаб: помогают configuration cache, удалённый build cache и сборка в CI только затронутых модулей по графу зависимостей.
Отдельный репозиторий оправдан, когда модуль это самостоятельная библиотека: дизайн-система или SDK, которые используют несколько приложений и выпускает своя команда. Тогда это AAR в Maven-репозитории с семантическим версионированием и changelog, а для отладки вместе с приложением есть composite build через includeBuild.
Цену назовите прямо: несколько репозиториев это публикация артефактов, согласование версий, изменения в два захода и ситуация, когда два модуля тянут разные версии одной библиотеки.
Где спотыкаются
Говорят, что в монорепозитории модули нельзя тестировать изолированно. Изоляцию даёт граница модуля и его зависимости, а не граница репозитория.
Предлагают разнести модули по репозиториям ради скорости сборки. Обычно выходит наоборот: теряется общий кеш, а локальная отладка превращается в публикацию snapshot-версий.
Берут git submodules как компромисс и получают рассинхрон ссылок на коммиты и сломанные ветки у новичков.