Налаштування Dependency Injection (Hilt) в Android-додатку

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

Розробка та підтримка будь-яких видів мобільних додатків:

Інформаційні та розважальні мобільні програми
Новинки, ігри, довідники, онлайн-каталоги, погодні, фітнес та здоров'я, туристичні, освітні, соціальні мережі та месенджери, квіз, блоги та подкасти, форуми, агрегатори
Мобільні програми електронної комерції
Інтернет-магазини, 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, 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+ річним досвідом гарантують чисту архітектуру та продуктивність.