Проект с несколькими модулями Gradle называется многомодульным проектом. В этом руководстве представлены лучшие практики и рекомендуемые шаблоны для разработки многомодульных приложений для Android.
Растущая проблема кодовой базы
В постоянно растущей кодовой базе масштабируемость, читаемость и общее качество кода часто со временем снижаются. Это происходит из-за того, что размер кодовой базы увеличивается, а её сопровождающие не предпринимают активных мер по обеспечению лёгкой поддержки структуры. Модуляризация — это способ структурирования кодовой базы таким образом, чтобы улучшить её поддержку и избежать этих проблем.
Что такое модуляризация?
Модуляризация — это практика организации кодовой базы на слабосвязанные и самостоятельные части. Каждая часть представляет собой модуль. Каждый модуль независим и служит чёткой цели. Разделяя задачу на более мелкие и легко решаемые подзадачи, вы упрощаете проектирование и поддержку большой системы.

Преимущества модульности
Преимуществ модуляризации множество, но каждое из них направлено на улучшение удобства поддержки и общего качества кодовой базы. В следующей таблице перечислены основные преимущества.
Выгода | Краткое содержание |
---|---|
Возможность повторного использования | Модульность открывает возможности для совместного использования кода и создания нескольких приложений на одной платформе. Модули фактически являются строительными блоками. Приложения должны представлять собой совокупность своих функций, организованных в виде отдельных модулей. Функциональность, предоставляемая определенным модулем, может быть реализована или не реализована в конкретном приложении. Например, :feature:news может быть частью полной версии и приложения Wear, но не частью демо-версии. |
Строгий контроль видимости | Модули позволяют легко контролировать, к чему вы предоставляете доступ другим частям кодовой базы. Вы можете пометить всё, кроме вашего открытого интерфейса, как internal или private чтобы предотвратить его использование вне модуля. |
Настраиваемая доставка | Play Feature Delivery использует расширенные возможности пакетов приложений, позволяя вам предоставлять определенные функции вашего приложения при определенных условиях или по запросу. |
Преимущества модуляризации доступны только при использовании модульной кодовой базы. Перечисленные ниже преимущества можно получить и с помощью других методов, но модуляризация поможет вам добиться их ещё лучше.
Выгода | Краткое содержание |
---|---|
Масштабируемость | В тесно связанной кодовой базе одно изменение может вызвать каскад изменений в, казалось бы, не связанных между собой частях кода. Правильно модульный проект будет придерживаться принципа разделения ответственности и, следовательно, ограничит связанность. Это предоставит участникам большую автономию. |
Право собственности | Помимо обеспечения автономии, модули также могут использоваться для обеспечения ответственности. У модуля может быть назначен отдельный владелец, отвечающий за поддержку кода, исправление ошибок, добавление тестов и проверку изменений. |
Инкапсуляция | Инкапсуляция означает, что каждая часть кода должна обладать минимально возможной информацией о других частях. Изолированный код легче читать и понимать. |
Тестируемость | Тестируемость характеризует, насколько легко тестировать код. Тестируемая кодовая база — это база, компоненты которой можно легко тестировать изолированно. |
Время сборки | Некоторые функции Gradle, такие как инкрементная сборка, кэширование сборки или параллельная сборка, могут использовать модульность для повышения производительности сборки . |
Распространенные ошибки
Степень гранулярности вашей кодовой базы — это степень её состоятельности из модулей. Более гранулярная кодовая база содержит больше модулей меньшего размера. При проектировании модульной кодовой базы следует определиться с уровнем гранулярности. При этом учитывайте размер кодовой базы и её относительную сложность. Слишком мелкая гранулярность увеличит накладные расходы, а слишком грубая — сведет на нет преимущества модуляризации.
Вот некоторые распространенные ошибки:
- Слишком мелкозернистый : каждый модуль вносит определённые накладные расходы в виде повышения сложности сборки и увеличения объёма шаблонного кода . Сложная конфигурация сборки затрудняет поддержание единообразия конфигураций между модулями. Избыток шаблонного кода приводит к громоздкой кодовой базе, которую сложно поддерживать. Если накладные расходы препятствуют улучшению масштабируемости, следует рассмотреть возможность объединения некоторых модулей.
- Слишком крупнозернистая структура : И наоборот, если ваши модули разрастаются слишком сильно, вы можете получить очередной монолит и упустить все преимущества модульности. Например, в небольшом проекте допустимо разместить уровень данных в одном модуле. Но по мере роста проекта может потребоваться разделить репозитории и источники данных на отдельные модули.
- Слишком сложно : не всегда имеет смысл разбивать проект на модули. Решающим фактором является размер кодовой базы. Если вы не ожидаете, что ваш проект превысит определённый предел, преимущества в масштабируемости и ускорении сборки будут неактуальны.
Подходит ли мне модуляризация?
Если вам нужны преимущества повторного использования, строгого контроля видимости или возможность использовать Play Feature Delivery , то модуляризация — это то, что вам нужно. Если же нет, но вы всё же хотите улучшить масштабируемость, владение, инкапсуляцию или ускорить сборку, то стоит рассмотреть модуляризацию.
Образцы
- Теперь и на Android — полнофункциональное Android-приложение с модульностью.
- Пример многомодульной архитектуры