Ответ
Да, работал. Разделение на feature-модули позволяет:
- Уменьшить время сборки (изолированные модули компилируются параллельно)
- Упростить поддержку (каждая фича независима)
- Включить динамическую загрузку (через
Dynamic Feature Module)
Пример структуры:
// settings.gradle
include ':app', ':feature_auth', ':feature_profile'
// build.gradle (feature модуля)
plugins {
id 'com.android.dynamic-feature'
}
dependencies {
implementation project(':app')
}
Для навигации между фичами можно использовать Deep Links или NavGraph с включенным include. Важно избегать циклических зависимостей между модулями.
Ответ 18+ 🔞
А, ну это ж классика, блядь! Ты про то, как приложение на куски резать, чтобы оно не превратилось в такого монстра, который жрёт память и собирается полдня? Работал, конечно, работал. Это как с машиной: если у тебя один здоровый движок на всё, то он и бензин хавает как не в себя, и чинить его — ёперный театр. А если разложить всё по коробочкам — feature-модули, — то уже проще.
Вот смотри, зачем это всё, эти модули, вообще нужно:
- Время сборки — овердохуища экономится. Потому что эти модули изолированные, их можно компилить параллельно, а не ждать, пока один здоровенный кусок кода проглотит твой комп.
- Поддержка — просто пиздец как упрощается. Каждая фича сама по себе, как квартира в коммуналке. Сломал кран в одной — в других вода течёт. Не надо ковыряться во всём проекте из-за одной кнопки.
- Динамическая загрузка — вот это вообще магия. Через
Dynamic Feature Moduleможно пользователю не всё сразу впихивать, а качать фичи по мере надобности. Зашёл в настройки профиля — качнул модуль профиля. Умно, да?
Вот, смотри, как это примерно выглядит, структура-то:
// settings.gradle
include ':app', ':feature_auth', ':feature_profile'
// build.gradle (feature модуля)
plugins {
id 'com.android.dynamic-feature'
}
dependencies {
implementation project(':app')
}
Видишь? В settings.gradle просто перечисляем: вот основное приложение (:app), вот модуль авторизации, вот модуль профиля. А в самом модуле в зависимостях указываем, что он зависит от основного :app. Всё, логично.
А теперь самое интересное — как между этими фичами-то прыгать? Ну, есть варианты. Можно через Deep Links — это как точный адрес с координатами. А можно через NavGraph с включённым include, чтобы все графы в один большой собрать. Главное, блядь, — циклических зависимостей избегать как огня! Это когда модуль A зависит от B, а B в свою очередь тянет A. Получается такая вот манда с ушами, и Gradle просто охуеет и сдаст тебе билд с ошибкой. Терпения ноль ебать у него на этот счёт.
Короче, идея годная. Сначала кажется, что мороки много, но когда проект разрастётся, ты сам себе спасибо скажешь, что не поленился и навёл порядок.