Настройка Dependency Injection (Hilt) в Android-приложении

Вы тратите часы на написание фабрик для ViewModel, прокидываете зависимости через конструкторы на три уровня вложенности, а при добавлении нового модуля приходится править пять файлов. Dependency Injection — классическая боль Android-разработчика, и [Hilt](https://developer.android.com/training/depe

Разработка и поддержка любых видов мобильных приложений:

Информационные и развлекательные мобильные приложения
Новостные приложения, игры, справочники, онлайн-каталоги, погодные, фитнес и здоровье, туристические, образовательные, социальные сети и мессенджеры, квиз, блоги и подкасты, форумы, агрегаторы
Мобильные приложения электронной коммерции
Интернет-магазины, B2B-приложения, маркетплейсы, онлайн-обменники, кэшбэк-сервисы, биржи, дропшиппинг-платформы, программы лояльности, доставка еды и товаров, платежные системы
Мобильные приложения для управления бизнес-процессами
CRM-системы, ERP-системы, управление проектами, инструменты для команды продаж, учет финансов, управление производством, логистика и доставка, управление персоналом, системы мониторинга данных
Мобильные приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, платформы предоставления электронных услуг, платформы кешбека, видеохостинги, тематические порталы, платформы онлайн-бронирования и записи, платформы онлайн-торговли

Это лишь некоторые из типы мобильных приложений, с которыми мы работаем, и каждый из них может иметь свои специфические особенности и функциональность, а также быть адаптированным под конкретные потребности и цели клиента.

Услуги, которые мы предлагаем
Показано 1 из 1Все 1734 услуг
Настройка Dependency Injection (Hilt) в Android-приложении
Средний
~2-3 дня

Наши компетенции:

Часто задаваемые вопросы

Последние работы

  • image_mobile-applications_feedme_467_0.webp
    Разработка мобильного приложения для компании FEEDME
    895
  • image_mobile-applications_xoomer_471_0.webp
    Разработка мобильного приложения для компании XOOMER
    782
  • image_mobile-applications_rhl_428_0.webp
    Разработка мобильного приложения для компании RHL
    1216
  • image_mobile-applications_zippy_411_0.webp
    Разработка мобильного приложения для компании ZIPPY
    1079
  • image_mobile-applications_affhome_429_0.webp
    Разработка мобильного приложения для компании Affhome
    1003
  • image_mobile-applications_flavors_409_0.webp
    Разработка мобильного приложения для компании FLAVORS
    597

Вы тратите часы на написание фабрик для ViewModel, прокидываете зависимости через конструкторы на три уровня вложенности, а при добавлении нового модуля приходится править пять файлов. Dependency Injection — классическая боль Android-разработчика, и Hilt от Google решает её кардинально. Вместо 5 файлов настройки достаточно одного, а 80% бойлерплейта Dagger уходит. Время настройки DI сокращается в 3 раза, количество строк кода для ViewModel — с 20 до 2. Согласно Google I/O session, Hilt используется в 70% новых Android-приложений. Экономия бюджета на разработку составляет до 35% за счёт снижения boilerplate. Закажите внедрение Hilt под ключ и забудьте о рутине.

Мы внедряем Hilt в Android-проекты уже 10+ лет, на счету более 50 успешных проектов с DI. Настройка занимает от 1 дня для нового проекта, миграция с Dagger — от 3 дней. Гарантируем чистую архитектуру и производительность на всех этапах.

Какие проблемы решает Hilt

Hilt убирает 80% бойлерплейта Dagger. Вместо ручного создания компонентов и фабрик — аннотации. Вот конкретные сценарии:

  • Бойлерплейт ViewModel: раньше приходилось писать ViewModelFactory, теперь достаточно @HiltViewModel и конструктора.
  • Тестирование: замена зависимостей через @BindValue без лишних модулей — фейк подставляется прямо в тесте.
  • Управление скоупами: готовые компоненты для Activities, Fragments, Services — не нужно описывать вручную.
  • Сеть и база данных: Hilt сам предоставляет SingletonComponent, а с помощью @InstallIn легко привязать любой модуль к нужному жизненному циклу.

Как настроить Hilt?

// build.gradle.kts (project) plugins { id("com.google.dagger.hilt.android") version "2.51" apply false } // build.gradle.kts (app) plugins { id("com.google.dagger.hilt.android") id("com.google.devtools.ksp") } dependencies { implementation("com.google.dagger:hilt-android:2.51") ksp("com.google.dagger:hilt-android-compiler:2.51") } // Application.kt @HiltAndroidApp class App : Application() 

@HiltAndroidApp — точка входа, без неё Hilt не инициализируется. С этого начинается любой проект. После этого в любом Android-классе можно использовать @Inject и @AndroidEntryPoint.

Инжекция в Android-классы

@AndroidEntryPoint class ProfileFragment : Fragment() { @Inject lateinit var userRepository: UserRepository private val viewModel: ProfileViewModel by viewModels() } @HiltViewModel class ProfileViewModel @Inject constructor( private val userRepository: UserRepository, private val analyticsService: AnalyticsService ) : ViewModel() 

@AndroidEntryPoint генерирует сабкомпонент, а @HiltViewModel избавляет от ручной ViewModelFactory. Для Fragment инжекция происходит автоматически — поле viewModel заполняется без фабрики.

Модули, биндинги и квалификаторы

@Module @InstallIn(SingletonComponent::class) object NetworkModule { @Provides @Singleton fun provideOkHttpClient(): OkHttpClient = OkHttpClient.Builder() .addInterceptor(HttpLoggingInterceptor().apply { level = if (BuildConfig.DEBUG) HttpLoggingInterceptor.Level.BODY else HttpLoggingInterceptor.Level.NONE }) .build() @Provides @Singleton fun provideApiService(client: OkHttpClient): ApiService = Retrofit.Builder() .baseUrl(BuildConfig.API_URL) .client(client) .addConverterFactory(GsonConverterFactory.create()) .build() .create(ApiService::class.java) } @Module @InstallIn(SingletonComponent::class) abstract class RepositoryModule { @Binds abstract fun bindUserRepository(impl: UserRepositoryImpl): UserRepository } @Qualifier @Retention(AnnotationRetention.BINARY) annotation class AuthenticatedClient @Qualifier @Retention(AnnotationRetention.BINARY) annotation class UnauthenticatedClient @Module @InstallIn(SingletonComponent::class) object HttpModule { @Provides @Singleton @AuthenticatedClient fun provideAuthenticatedClient(authInterceptor: AuthInterceptor): OkHttpClient = OkHttpClient.Builder().addInterceptor(authInterceptor).build() @Provides @Singleton @UnauthenticatedClient fun provideUnauthenticatedClient(): OkHttpClient = OkHttpClient.Builder().build() } 

@InstallIn привязывает модуль к скоупу. Для Activity используйте ActivityComponent::class, для Fragment — FragmentComponent::class. Каждый компонент живёт столько же, сколько соответствующий Android-объект. Квалификаторы (@Qualifier) разрешают конфликты, когда нужно два бинда одного типа — например, два OkHttpClient с разными перехватчиками. Без них Hilt выдаст ошибку [Dagger/DuplicateBindings].

Как тестировать с Hilt?

@HiltAndroidTest @RunWith(AndroidJUnit4::class) class ProfileFragmentTest { @get:Rule val hiltRule = HiltAndroidRule(this) @BindValue @JvmField val fakeRepository: UserRepository = FakeUserRepository() @Test fun displaysUserName() { // тест } } 

@BindValue заменяет реальный биндинг на фейк прямо в тесте. Для юнит-тестов ViewModel Hilt не нужен — зависимости передаются в конструктор.

Почему Hilt лучше ручного DI?

Ручное внедрение зависимостей приводит к лавине boilerplate-кода: фабрики, провайдеры, прокидывание через конструкторы. Hilt автоматизирует всё это, сокращая время разработки на 40%. Hilt предоставляет @HiltAndroidTest и @BindValue, заменяя mock-библиотеки. Вы не пишете тестовые модули — просто указываете фейковую имплементацию. Экономия времени — до 50% на настройку тестов. Интеграционные тесты с Hilt запускаются быстро благодаря оптимизированной генерации компонентов.

Сравните Hilt и Dagger по ключевым параметрам:

Hilt Dagger
Файлов настройки 1 5+
Бойлерплейт Минимум Много
Тестирование Встроенное Ручные правила
Официальность Google Google (базовый)

А если взять ручное DI без Dagger — объём кода растёт ещё в 2 раза. Hilt выигрывает за счёт автоматической генерации сабкомпонентов и готовых скоупов.

Компоненты и скоупы Hilt

Компонент Скоуп Жизненный цикл
SingletonComponent @Singleton Application
ActivityComponent @ActivityScoped Activity
FragmentComponent @FragmentScoped Fragment
ServiceComponent @ServiceScoped Service
ViewComponent @ViewScoped View

Каждый компонент автоматически уничтожается при завершении соответствующего Android-объекта. Это исключает утечки памяти.

Процесс работы

  • Анализ зависимостей — определяем, какие объекты нужны в проекте, и классифицируем их по скоупам.
  • Проектирование модулей — разбиваем на логические блоки (сеть, база данных, репозитории) и настраиваем @InstallIn.
  • Реализация — написание модулей и биндингов, код-ревью, проверка на дублирование.
  • Интеграционные тесты — проверяем инжекцию с @HiltAndroidTest и @BindValue.
  • Деплой — отправляем в CI, документируем архитектуру.

Сроки: от 1 до 5 дней в зависимости от сложности проекта. Стоимость рассчитывается индивидуально. Получите консультацию — оценим ваш проект в течение дня.

Схема компонентов HiltSingletonComponent → ActivityComponent → FragmentComponent

Что входит в работу

  • Настройка build.gradle.kts и подключение Hilt
  • Установка @HiltAndroidApp и базовых компонентов
  • Инжекция во все Android-классы (Activity, Fragment, Service, ViewModel)
  • Написание модулей и квалификаторов
  • Тестирование с @HiltAndroidTest
  • Документация и код-ревью
  • Поддержка после внедрения

Частая ошибка: @Inject в non-Android классах без @AndroidEntryPoint

@Inject во Fragment без @AndroidEntryPoint даёт NullPointerException — поле остаётся null. Hilt не инжектирует в классы без аннотации. Типичный краш при копировании кода из старого проекта. Мы это учитываем и проверяем все входные точки.

Свяжитесь с нами для консультации — оценим ваш проект в течение дня. Сертифицированные инженеры с 10+ летним опытом гарантируют чистую архитектуру и производительность.