Какие минусы выделения фичи в библиотеку для подключения в другой проект
Что проверяют
Понимаете ли вы, что выделение фичи в библиотеку превращает внутренний код в публичный продукт со своим контрактом, версиями и владельцем. Следом обычно спрашивают, как бы вы это организовали: отдельный репозиторий, модуль в монорепозитории или composite build.
Как отвечать
Главные минусы в Android-мире:
- публичный API становится контрактом: любой публичный класс кто-то начнёт использовать, и изменить его без поломки потребителей уже нельзя. Помогают
internalи режимexplicitApi()в Kotlin, но дисциплина нужна постоянно; - версионирование и публикация: нужен Maven-репозиторий (Nexus, Artifactory, GitHub Packages), semver, changelog. Цикл «поправил, опубликовал, поднял версию в приложении» медленнее правки в своём модуле;
- транзитивные зависимости: библиотека тащит свои версии Kotlin, корутин, OkHttp, Compose. Gradle выберет старшую версию, и одна из сторон может упасть в рантайме с
NoSuchMethodError; - ограничения сборки:
minSdkбиблиотеки не может быть выше, чем у приложения, а метаданные Kotlin, собранные новым компилятором, старый может не прочитать; - ресурсы и манифест: при слиянии совпадающие имена ресурсов перетирают друг друга, поэтому нужен
resourcePrefix. Разрешения и компоненты из манифеста библиотеки молча попадают в приложение; - R8: правила для потребителя кладутся в
consumerProguardFiles, иначе в релизе рефлексия и сериализация упадут у чужого приложения, а не у вас; - интеграция: библиотека не может опираться на граф Hilt хоста, его тему и дизайн-систему, всё это надо передавать снаружи.
Плюс организационная цена: кто владеет кодом, кто чинит баги второго проекта и чьи требования важнее.
Где спотыкаются
Называют главным минусом производительность и «лишние вызовы». После R8 код из AAR работает так же быстро, как код в самом приложении, реальная цена в поддержке.
Выносят фичу, которую пока использует один проект. Преждевременное обобщение даёт кучу настроек и абстракций, которые никому не нужны.
Забывают про релизную сборку: отлаживают только debug, где R8 выключен, а падение ловят уже потребители.