Разработка
Metro — новый фреймворк внедрения зависимостей для Android
Он не пытается изобрести велосипед, а пытается заставить существующие колеса работать лучше вместе. Короче говоря, Metro стоит на плечах гигантов.
Metro — это фреймворк для внедрения зависимостей во время компиляции, во многом вдохновленный Dagger, Anvil и Kotlin-Inject. Он стремится объединить их лучшие функции в одно целостное решение, добавив несколько новых и реализуя их в виде плагина компилятора.
В течение некоторого времени возникало ощущение, что сообщество Kotlin хотело создать библиотеку, объединяющую эти различные инструменты и функции. Для некоторых из этих задач существуют различные инструменты, но пока не существует единого решения, которое связывало бы их все вместе, устраняло бы некоторые из их ограничений и включало бы новые функции, предлагаемые плагинами компиляторов. Metro пытается стать таким ответом. Он не пытается изобрести велосипед, а пытается заставить существующие колеса работать лучше вместе. Короче говоря, Metro стоит на плечах гигантов.
Установка
Metro 0.1.1 доступен сегодня. Установка проста!
plugins {
id("dev.zacsweers.metro") version "0.1.1"
}
Документация: https://zacsweers.github.io/metro/
Runtime API: https://zacsweers.github.io/metro/api/0.x/
Репозиторий: https://github.com/zacsweers/metro
Фичи
Если вы когда-либо работали с Dagger или kotlin-inject, то в Metro вы почувствуете себя как дома.
Графы — это интерфейсы или абстрактные классы, аннотированные @DependencyGraph
.
xxxxxxxxxx
interface AppGraph {
val httpClient: HttpClient
}
val graph = createGraph<AppGraph>()
Предоставляйте зависимости с помощью внедрения конструктора в стиле JSR-330 или провайдеров непосредственно в ваших графах.
xxxxxxxxxx
interface AppGraph {
val httpClient: HttpClient
private fun provideFileSystem(): FileSystem = FileSystem.SYSTEM
}
class HttpClient(private val fileSystem: FileSystem)
Выполните вспомогательную инъекцию с помощью @Assisted
и @AssistedFactory
.
xxxxxxxxxx
interface AppGraph {
val cacheFactory: Cache.Factory
private fun provideFileSystem(): FileSystem = FileSystem.SYSTEM
}
class Cache( size: Long, fs: FileSystem) {
interface Factory {
fun create(size: Long): Cache
}
}
Добавляйте и объединяйте биндинги как в Anvil.
xxxxxxxxxx
AppScope::class) (
class CacheImpl(...) : Cache
Необязательные зависимости. Если зависимость не существует в внедряемом графе, используется значение параметра по умолчанию.
xxxxxxxxxx
class Cache(fs: FileSystem = FileSystem.SYSTEM)
Внедрение функций верхнего уровня.
xxxxxxxxxx
fun App(circuit: Circuit) {
ProvideCircuitCompositionLocals(circuit) {
CircuitContent(HomeScreen)
}
}
Подробные, но понятные сообщения об ошибках и диагностика.
И многое другое!
Основные моменты
- Проверка графа зависимостей во время компиляции
- Генерация кода FIR/IR во время компиляции
- Генерация кода и рантайм в стиле Dagger
- API в стиле Kotlin-Inject
- Агрегация в стиле Anvil
- Мультиплатформенность
- Интеграция с IDE
- Расширенный интероп
- Частные провайдеры и инъекции частных членов
- Необязательные зависимости
- Внедрение функции верхнего уровня
- Подробные, но понятные сообщения об ошибках и диагностика
Перейдите в раздел «Возможности» на сайте проекта, чтобы получить полный обзор, а в разделе «Использование» получите полную документацию по всем доступным API.
Производительность сборки
Будучи плагином компилятора, Metro работает значительно быстрее. При сравнительном тестировании моего приложения CatchUp производительность сборки значительно возросла.
Средние улучшения
- ABI – на 47% быстрее
- ABI без инкрементальной компиляции – на 28% быстрее
- No-ABI – на 56% быстрее
- Без ABI и без IC – на 25.5% быстрее
Будущая работа
Metro все еще находится в стадии активной разработки. Это всего лишь первый релиз, в нем будут ошибки, и есть несколько важных функций, которые я хочу реализовать в дальнейшем. Биндинги, допускающие значение NULL, @ContributesGraphExtension
и сообщения о неиспользуемых биндингах — вот лишь некоторые из них. Более подробную информацию можно найти в системе отслеживания ошибок и обсуждениях в репозитории.
-
Новости2 недели назад
Видео и подкасты о мобильной разработке 2025.14
-
Видео и подкасты для разработчиков4 недели назад
Javascript для бэкенда – отличная идея: Node.js, NPM, Typescript
-
Новости4 недели назад
Видео и подкасты о мобильной разработке 2025.12
-
Разработка4 недели назад
«Давайте просто…»: системные идеи, которые звучат хорошо, но почти никогда не работают