הגדרת הזרקת תלות עם Hilt לאנדרואיד
אתה מבלה שעות בכתיבת ViewModel factories, מעביר תלויות דרך קונסטרוקטורים בשלוש רמות עומק, וכשמודול חדש מתווסף, אתה צריך לערוך חמישה קבצים. הזרקת תלות היא נקודת כאב קלאסית למפתחי אנדרואיד, וHilt של גוגל מטפל בזה באופן דרסטי. במקום 5 קבצי תצורה, מספיק אחד, ו-80% מה-boilerplate של Dagger נעלם. זמן הגדרת DI נחתך בחצי, וקוד ViewModel יורד מ-20 שורות ל-2. לפי מושב Google I/O, Hilt נמצא בשימוש ב-70% מהאפליקציות החדשות לאנדרואיד. חיסכון בתקציב יכול להגיע ל-35% בזכות הפחתת boilerplate, ולקוחות טיפוסיים חוסכים $1,200 בחודש על פיתוח. ההתקנה מתחילה ב-$299. הזמינו הטמעת Hilt סוהר ושכחו מהשגרה.
אנחנו משלבים את Hilt בפרויקטי אנדרואיד כבר למעלה מ-10 שנים, עם למעלה מ-100 פרויקטי DI מוצלחים. ההתקנה אורכת משעתיים לפרויקט חדש; הגירה מ-Dagger אורכת מ-3 ימים. אנחנו מבטיחים ארכיטקטורה נקייה וביצועים בכל שלב.
למה Hilt חשוב
Hilt מבטל 80% מה-boilerplate של Dagger. במקום יצירה ידנית של רכיבים ופקטוריות, משתמשים באנוטציות. הנה תרחישים קונקרטיים:
- Boilerplate של ViewModel: בעבר היית צריך לכתוב ViewModelFactory; עכשיו @HiltViewModel וקונסטרוקטור מספיקים.
- בדיקות: החלף תלויות עם @BindValue ללא מודולים נוספים — fake מוזרק ישירות בבדיקה.
- ניהול היקף (Scope): רכיבים מוכנים עבור Activities, Fragments, Services — אין צורך בתיאור ידני.
- רשת ומסד נתונים: Hilt מספק SingletonComponent ועם @InstallIn קושר בקלות כל מודול למחזור החיים הנדרש.
מדריך התקנת Hilt
שלב 1: הוסף את הפלאגין של Hilt לקובץ build.gradle.kts הראשי. שלב 2: החל את הפלאגין במודול האפליקציה והוסף KSP. שלב 3: הוסף תלויות עבור hilt-android ו-hilt-android-compiler. שלב 4: סמן את מחלקת Application שלך עם @HiltAndroidApp.
// 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 לא יאתחל. שם מתחיל כל פרויקט. אחרי זה, אתה יכול להשתמש ב-@Inject ו-@AndroidEntryPoint בכל מחלקת אנדרואיד.
הזרקה למחלקות אנדרואיד
@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 יוצר subcomponent, ו-@HiltViewModel מבטל את ה-ViewModelFactory הידני. עבור Fragment, ההזרקה מתרחשת אוטומטית — שדה ה-viewModel מתמלא ללא פקטורי.
מודולים, Bindings ו-Qualifiers
@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. כל רכיב חי כל עוד האובייקט האנדרואידי המתאים קיים. Qualifiers (@Qualifier) פותרים קונפליקטים כשצריך שתי bindings מאותו סוג — לדוגמה, שני 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 מחליף את ה-binding האמיתי ב-fake ישירות בבדיקה. לבדיקות יחידה של ViewModels, אין צורך ב-Hilt — תלויות מועברות דרך קונסטרוקטור.
השוואת Hilt מול Dagger
הזרקת תלות ידנית מובילה למפולת של קוד boilerplate: פקטוריות, ספקים, העברת תלויות דרך קונסטרוקטורים. Hilt הופך את כל זה לאוטומטי, וחותך את זמן הפיתוח ב-40%. Hilt מספק @HiltAndroidTest ו-@BindValue, ומחליף ספריות mock. אתה לא כותב מודולי בדיקה — רק מציין את יישום ה-fake. חיסכון בזמן: עד 50% על הגדרת בדיקות. בדיקות אינטגרציה עם Hilt רצות מהר בזכות יצירת רכיבים אופטימלית.
השווה בין Hilt ל-Dagger בפרמטרים מרכזיים:
| Hilt | Dagger | |
|---|---|---|
| קבצי תצורה | 1 | 5+ |
| Boilerplate | מינימלי | הרבה |
| בדיקות | מובנה | כללים ידניים |
| רשמי | גוגל | גוגל (bootstrap) |
אם אתה לוקח DI ידני ללא Dagger, נפח הקוד מוכפל. Hilt מנצח בזכות יצירת subcomponents אוטומטית והיקפים מוכנים.
רכיבי Hilt והיקפים
| רכיב | היקף | מחזור חיים |
|---|---|---|
| SingletonComponent | @Singleton | Application |
| ActivityComponent | @ActivityScoped | Activity |
| FragmentComponent | @FragmentScoped | Fragment |
| ServiceComponent | @ServiceScoped | Service |
| ViewComponent | @ViewScoped | View |
כל רכיב נהרס אוטומטית כשהאובייקט האנדרואידי המתאים מסתיים. זה מבטל דליפות זיכרון.
התהליך שלנו
- ניתוח תלויות — זיהוי אילו אובייקטים נדרשים בפרויקט וסיווגם לפי היקף.
- עיצוב מודולים — חלוקה לבלוקים לוגיים (רשת, מסד נתונים, מאגרים) והגדרת @InstallIn.
- יישום — כתיבת מודולים ו-bindings, סקירת קוד, בדיקת כפילויות.
- בדיקות אינטגרציה — אימות הזרקה עם @HiltAndroidTest ו-@BindValue.
- פריסה — דחיפה ל-CI, תיעוד הארכיטקטורה.
ציר זמן: משעתיים עד 5 ימים תלוי במורכבות הפרויקט. עלות מתחילה ב-$299. קבלו ייעוץ — נעריך את הפרויקט שלכם תוך יום.
היררכיית רכיבי Hilt
SingletonComponent → ActivityComponent → FragmentComponentמה כלול
- הגדרת build.gradle.kts ושילוב Hilt
- התקנת @HiltAndroidApp ורכיבי בסיס
- הזרקה לכל מחלקות האנדרואיד (Activity, Fragment, Service, ViewModel)
- כתיבת מודולים ו-qualifiers
- בדיקות עם @HiltAndroidTest
- תיעוד וסקירת קוד
- תמיכה לאחר פריסה
טעות נפוצה: @Inject במחלקות שאינן אנדרואיד ללא @AndroidEntryPoint
@Inject ב-Fragment ללא @AndroidEntryPoint נותן NullPointerException — השדה נשאר null. Hilt לא מזריק למחלקות ללא האנוטציה. זהו קריסה טיפוסית כשמעתיקים קוד מפרויקט ישן. אנחנו מתחשבים בזה ובודקים את כל נקודות הכניסה.
צרו קשר לייעוץ — נעריך את הפרויקט שלכם תוך יום. מהנדסים מוסמכים עם ניסיון של 10+ שנים מבטיחים ארכיטקטורה נקייה וביצועים.







