Работал ли с разделением модулей по фичам

Ответ

Да, работал. Разделение на 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 просто охуеет и сдаст тебе билд с ошибкой. Терпения ноль ебать у него на этот счёт.

Короче, идея годная. Сначала кажется, что мороки много, но когда проект разрастётся, ты сам себе спасибо скажешь, что не поленился и навёл порядок.