Как разделить Android-приложение на Google и Huawei с помощью Flavors
Элегантное разделение проекта на отдельные сборки для магазинов Google Play, Huawei AppGallery и F-Droid, используя механизм Product Flavors. Он позволяет в рамках одной кодовой базы собирать APK с разными SDK, конфигурациями и зависимостями.
Код разнесен по платформенным модулям :gms, :hms и :foss. Все они реализуют общий контракт из :common, где описан интерфейс AppInteractor. Благодаря этому основной код приложения работает с единой абстракцией, не зная, какой именно сервис подключён – Google или Huawei.
Каждая реализация живет в своём модуле и подключает нужные зависимости: FirebaseAnalytics для Google и HiAnalytics для Huawei. В FOSS-вариант не подключается ничего. Связывание выполняется через модуль :inject, где с помощью Hilt определяется, какая реализация будет подставлена в зависимости от активного flavor.
В приложении задаются три flavors: gms, hms и foss. implementation-конфигурации гарантируют, что в сборку попадет только нужный код. Для плагинов добавлены переменные, вынесенные в buildSrc, чтобы подключать их условно.
Результат – три полностью автономных APK: один использует сервисы Google, другой – Huawei, а третий подходит для F-Droid и устройств без проприетарных SDK. Такой подход даёт гибкость и минимум дублирования, а главное – позволяет поддерживать все экосистемы Android-устройств из одной кодовой базы.
Таймкоды
0:00 – Что будет в видео
0:38 – Зачем выбирать Flavors
0:56 – Структура модулей
1:33 – Создание модуля :common
2:11 – Конфигурация модуля :common
2:42 – Создание AppInteractor
3:13 – Создание модулей :gms, :hms и :foss
4:08 – Конфигурация модулей :gms, :hms и :foss
4:54 – Создание AppInteractorImpl в модуле :foss
5:35 – Создание AppInteractorImpl в модуле :gms
6:37 – Создание AppInteractorImpl в модуле :hms
7:49 – Создание модуля :inject
8:20 – Конфигурация модуля :inject
9:21 – Создание InteractorModule для Hilt
9:51 – Настройка Flavors в модуле :app
10:41 – Запуск и проверка всех сборок
11:27 – Импорт JSON-файлов
12:31 – Условное подключение плагинов
13:16 – Создание каталога buildSrc
13:59 – Создание FlavorsKtx для хранение переменных
14:49 – Сборка всех таргетов
android