Android Dependency Injection: Hilt vs Koin - Kapsamli Rehber ve Mulakat Sorulari 2026

Android icin Hilt ve Koin karsilastirmasi: pratik kod ornekleri, performans olcumleri ve yaygin mulakat sorulari. Hilt 2.60 ve Koin 4.2 icin guncellenmistir.

Hilt vs Koin Android Dependency Injection

Android uygulamalarinda siniflar arasi bagimliliklarin nasil yonetildigi, projenin test edilebilirligini, bakimini ve olceklenmesini dogrudan belirleyen kritik bir mimari karardir. 2026 yilinda Android ekosisteminde iki framework bu alanda hakim konumdadir: Google tarafindan resmi olarak desteklenen ve Dagger altyapisina dayanan Hilt (surum 2.60.1) ile saf Kotlin DSL yaklasimini benimseyen Koin (surum 4.2.2). Her iki arac da bagimlilik enjeksiyonu sorununu cozmekle birlikte, derleme zamani guvenligi, calisma zamani performansi, ogrenme egrisi ve platform destegi acisindan temelden farkli tasarim tercihleri yapmaktadir. Bu rehber, her iki framework'u pratik kod ornekleri, performans olcumleri ve teknik mulakat sorulari esliginde derinlemesine incelemektedir.

Derleme Zamani ve Calisma Zamani DI Ayrimi

Hilt, derleme sirasinda bagimlilik grafinin tamamini dogrular ve eksik bir baglama tespitinde derlemeyi basarisiz kilar. Koin ise bagimliliklari calisma zamaninda Kotlin DSL uzerinden cozumler ve yapilandirma hatalarini ancak ilgili kod yolu calistirildiginda yakalar. Bu temel fark, iki framework arasindaki tum teknik odunlesimlerin kaynagini olusturmaktadir.

Hilt Nasil Calisir: Derleme Zamani Kod Uretimi

Hilt, Dagger 2 uzerine insa edilmis ve Android yasam dongusu bilesenlerine eslenmis Dagger bilesenleri ureten bir DI framework'udur. @HiltAndroidApp anotasyonu, KSP (Kotlin Symbol Processing) araciligyla derleme zamaninda fabrikalar ve saglayicilar uretilmesini tetikler. Hilt 2.48 surumunden itibaren KSP, anotasyon islemcisi olarak KAPT'nin yerini almis ve isleme suresini yaklasik yariya indirmistir.

Tipik bir Hilt kurulumu uc temel bilesenden olusur: baglama tanimlarini iceren bir modul, bir giris noktasi (Activity, Fragment veya ViewModel) ve @HiltAndroidApp anotasyonuyla isaretlenmis Application sinifi.

AppModule.ktkotlin
@Module
@InstallIn(SingletonComponent::class)
object AppModule {

    @Provides
    @Singleton
    fun provideRetrofit(): Retrofit {
        return Retrofit.Builder()
            .baseUrl("https://api.example.com/")
            .addConverterFactory(GsonConverterFactory.create())
            .build()
    }

    @Provides
    @Singleton
    fun provideUserRepository(
        retrofit: Retrofit
    ): UserRepository {
        return UserRepositoryImpl(retrofit.create(UserApi::class.java))
    }
}
UserViewModel.ktkotlin
@HiltViewModel
class UserViewModel @Inject constructor(
    private val userRepository: UserRepository
) : ViewModel() {

    private val _users = MutableStateFlow<List<User>>(emptyList())
    val users: StateFlow<List<User>> = _users.asStateFlow()

    fun loadUsers() {
        viewModelScope.launch {
            _users.value = userRepository.getUsers()
        }
    }
}

Derleyici, UserRepository icin gecerli bir saglayicinin mevcut olup olmadigini uygulama calistirilmadan once dogrular. Eksik baglamalar runtime cokmesi olarak degil, derleme hatasi olarak ortaya cikar.

Koin Kurulumu: Kotlin DSL ile Pragmatik Yaklasim

Koin, tam tersi bir felsefe izlemektedir: sifir kod uretimi, sifir anotasyon isleme. Bagimliliklar saf Kotlin DSL kullanilarak tanimlanir ve framework bunlari calisma zamaninda global bir servis kayit defteri uzerinden cozumler. Koin 4.2, baslatma sirasinda paralel yukleme icin lazy moduller ve kapsam cozumlemeyi optimize eden yeni CoreResolverV2 motorunu sunmaktadir.

AppModule.ktkotlin
val appModule = module {
    single<Retrofit> {
        Retrofit.Builder()
            .baseUrl("https://api.example.com/")
            .addConverterFactory(GsonConverterFactory.create())
            .build()
    }

    single<UserRepository> {
        UserRepositoryImpl(get<Retrofit>().create(UserApi::class.java))
    }

    viewModel { UserViewModel(get()) }
}
MyApplication.ktkotlin
class MyApplication : Application() {
    override fun onCreate() {
        super.onCreate()
        startKoin {
            androidContext(this@MyApplication)
            modules(appModule)
        }
    }
}

DSL yapilandirmasi dogal bir Kotlin soz dizimi sunar ve Gradle yapilandirmasinda herhangi bir anotasyon isleme eklentisi gerektirmez. Odunlesim ise aciktir: get() cozumlemesindeki bir yazim hatasi, ancak ilgili enjeksiyon noktasi calistirildiginda ortaya cikar.

Performans Karsilastirmasi: Derleme Suresi ve Calisma Zamani Maliyeti

Performans sorusu, hemen her Android teknik mulakatinda gundeme gelmektedir. Somut rakamlar, subjektif degerlendirmelerden cok daha degerlidir.

MetrikHilt 2.60 (KSP)Koin 4.2
Temiz derleme ek yuku+8-15s (KSP kod uretimi)~0s (kod uretimi yok)
Artimli derleme ek yuku+2-4s~0s
Uygulama baslatma (50 baglama)~0ms (onceden uretilmis kod)~5-15ms (graf cozumleme)
Uygulama baslatma (500 baglama)~0ms~30-80ms
APK boyut etkisi+200-400 KB (uretilmis kod)+100 KB (runtime kutuphanesi)
Eksik baglama tespitiDerleme hatasiRuntime cokmesi
Minimum SDK gereksinimiAPI 23API 23

100'den az baglama iceren projelerde Koin'in calisma zamani ek yuku algilanamaz duzeydedir. 300 baglama esigini asan projelerde ise baslatma maliyeti olculebilir hale gelir; ancak Koin 4.2'nin lazy modulleri, modul yuklemesini paralellestirerek bu etkiyi hafifletmektedir.

Hilt 2.60 Kiricin Degisiklikler

Dagger 2.60 multidex destegini kaldirdi ve minSDK'yi 23'e yukselterek AndroidX gereksinimlerine uyum sagladi. API 21-22'yi hedefleyen projeler artik Hilt kullanamaz. Ayni surum, Hilt Gradle eklentisi kullanildiginda AGP 9 ve Gradle 9.1+ gerektirmektedir.

Test Stratejileri: Her Iki Framework'te Bagimlilik Degistirme

Test edilebilirlik, mimari farklarin pratik sonuclarinin en net goruldugu alandir. Hilt, uretim modullerinin test ikizleriyle derleme zamaninda degistirilmesi icin @TestInstallIn anotasyonu sunar. Koin ise loadKoinModules() ile tanimlarin calisma zamaninda gecersiz kilinmasina olanak tanir.

kotlin
// Hilt test module
@Module
@TestInstallIn(
    components = [SingletonComponent::class],
    replaces = [AppModule::class]
)
object FakeAppModule {

    @Provides
    @Singleton
    fun provideUserRepository(): UserRepository {
        return FakeUserRepository()
    }
}
kotlin
// Koin test
class UserViewModelTest : KoinTest {

    @Before
    fun setUp() {
        startKoin {
            modules(
                module {
                    single<UserRepository> { FakeUserRepository() }
                    viewModel { UserViewModel(get()) }
                }
            )
        }
    }

    @Test
    fun `loads users from repository`() {
        val viewModel: UserViewModel = get()
        viewModel.loadUsers()
        assertEquals(3, viewModel.users.value.size)
    }

    @After
    fun tearDown() {
        stopKoin()
    }
}

Hilt testleri, test modulleri hatali yapilandirildiginda sorunu derleme asamasinda tespit eder. Koin testleri, startKoin/stopKoin yasam dongusu yonetimi gerektirir; ancak kismi modul gecersiz kilma konusunda daha fazla esneklik sunar.

Android mülakatlarında başarılı olmaya hazır mısın?

İnteraktif simülatörler, flashcards ve teknik testlerle pratik yap.

Coklu Modul Mimari: DI'nin Feature Modulleri Arasinda Olceklenmesi

Buyuk Android projeleri, ozellikleri bagimsiz Gradle modullerine ayirmaktadir. Kullanilan DI framework'unun modul sinirlarini temiz bir sekilde desteklemesi gerekmektedir. Her iki framework de modern Android modulerizasyonu kaliplariyla dogal bir uyum icerisindedir.

Hilt'te her feature modulu, @InstallIn ile uygun bilesene baglanan kendi @Module sinifini tanimlar. Hilt, derleme zamaninda tum modulleri tek bir bilesen hiyerarsisinde birlestirir. MVVM mimarisi, Hilt'in kapsamli bilesenleriyle dogal bir uyum gosterir.

feature-payments/PaymentModule.ktkotlin
@Module
@InstallIn(ViewModelComponent::class)
object PaymentModule {

    @Provides
    fun providePaymentGateway(
        retrofit: Retrofit
    ): PaymentGateway {
        return StripePaymentGateway(retrofit.create(PaymentApi::class.java))
    }
}

Koin'de feature modulleri, kendi module {} tanimlarini disar aktarir ve uygulama modulu bunlarin tumunu baslatma sirasinda yukler. Koin 4.2'nin lazy modulleri, feature modullerinin ilk erisime kadar ertelenmis yuklemesine olanak tanir.

feature-payments/paymentModule.ktkotlin
val paymentModule = module {
    factory<PaymentGateway> {
        StripePaymentGateway(get<Retrofit>().create(PaymentApi::class.java))
    }
}

// app/MyApplication.kt
startKoin {
    modules(appModule, paymentModule, analyticsModule)
}

Hilt, bilesen kapsam mekanizmasi araciligiyla bagimlilik gorunurlugunu zorunlu kilar. Koin ise konvansiyona dayanir; herhangi bir modul, diger modullerin tanimlarina erisebilir. Bu durum esneklik saglamakla birlikte, ozellikle buyuk ekiplerde ortuk baglantilara yol acabilir.

Kotlin Multiplatform ve Platform Destegi

Koin, Kotlin Multiplatform (KMP) destegini dogal olarak sunmaktadir. Ayni module {} DSL yapisi Android, iOS, masaustu ve web hedeflerinde calismaktadir. Hilt ise yalnizca Android platformuna baglidir; Android'e ozgu yasam dongusu bilesenleri ve Dagger anotasyon islemcisine ihtiyac duyar.

Birden fazla platformu hedefleyen projelerde, bu iki framework arasinda Koin tek uygulanabilir secenektir. Paylasilan is mantigi modulleri, bagimlilik tanimlarini bir kez yaparak tum hedeflerde ayni enjeksiyon altyapisini kullanabilir.

Frameworklar Arasi Gecis

Koin 4.2, Dagger kopru modulu sunarak kademeli gecise olanak tanir. Hilt'ten Koin'e gecis yapan ekipler, gecis doneminde mevcut Dagger modullerini Koin'in servis bulucusu uzerinden kullanabilir. Bu artimsal yaklasim, buyuk capli bir yeniden yazimi onler ancak gecici mimari karmasiklik ekler.

Sikca Sorulan Mulakat Sorulari ve Yanitlari

Android teknik mulakatlarinda bagimlilik enjeksiyonu konusu duzgun sekilde ele alindiginda, adayin mimari bilgisinin derinligini gosterir. Asagida 2026 yilinda en sik karsilasilan sorular ve beklenen yanit cerceveleri yer almaktadir.

S: Derleme zamani ve calisma zamani bagimlilik enjeksiyonu arasindaki temel fark nedir?

Derleme zamani DI (Hilt/Dagger), derleme sirasinda enjeksiyon kodu uretir. Derleyici, bagimlilik grafinin tamamini dogrulayarak eksik baglama tanimlarini runtime'dan once yakalar. Calisma zamani DI (Koin), bagimliliklari ilk talep edildiklerinde bir servis kayit defteri uzerinden cozumler. Derleme zamani DI daha hizli baslatma saglar ancak derleme suresini arttirir; calisma zamani DI sifir derleme ek yuku getirir fakat hata tespitini ertelemis olur.

S: Hilt'te @InstallIn anotasyonu ne ise yarar ve hangi bilesenlere baglama yapilabilir?

@InstallIn, bir Hilt modulunun hangi Dagger bilesenine ait oldugunu belirler. SingletonComponent uygulama yasam dongusu boyunca, ActivityRetainedComponent yapilandirma degisikliklerinde hayatta kalir, ViewModelComponent bir ViewModel'in yasam dongusune baglidir. ActivityComponent, FragmentComponent ve ViewComponent ise ilgili Android yasam dongusu sahiplerine eslenir. Ozel kapsamlar bu hiyerarsiyi genisletebilir.

S: Koin'de ViewModel enjeksiyonu Jetpack Compose'da nasil gerceklesir?

Koin, en yakin ViewModelStoreOwner kapsaminda bir ViewModel olusturan veya mevcut ornegi getiren koinViewModel() Composable fonksiyonunu saglar. Koin 4.2 surumundan itibaren koinNavViewModel(), Jetpack Compose navigasyonu kullanildiginda ViewModel'leri navigasyon grafi girislerine kapsamlar. Koin 4.2 ayrica Jetpack Navigation 3 icin birinci sinif destek ekledi.

S: Koin'in Hilt'e gore avantajli oldugu senaryolar hangileridir?

Koin, KMP projelerinde (Hilt yalnizca Android destekler), derleme suresinin baslatma suresinden daha kritik oldugu kucuk-orta olcekli uygulamalarda ve anotasyon tabanli yapilandirma yerine acik Kotlin DSL tercih eden ekiplerde daha uygun bir secenektir. Prototipleme ve kavram kanitlama projeleri de Koin'in minimal kurulum gereksiniminden faydalanir.

Yaygin Mulakat Hatasi: Service Locator ve DI Ayrimi

Koin'i bir "bagimlilik enjeksiyonu framework'u" olarak nitelendirmek teknik olarak tam dogru degildir. Koin bir service locator kalibini uygular: bagimliliklar constructor injection yoluyla disaridan itilmek yerine, get() cagrisiyla cekilir. Bu ayrimin farkinda olan mulakatcilar, adaylarin bu nyansi kabul etmesini beklemektedir. Hilt ve Dagger ise uretilmis constructor cagrilari araciligiyla gercek bagimlilik enjeksiyonu gerceklestirir.

Karar Matrisi: Hilt mi Koin mi?

FaktorHiltKoin
Graf dogrulamaDerleme zamaniCalisma zamani
Derleme suresine etkisiYuksek (KSP codegen)Yok
Baslatma maliyetiSifira yakinGraf boyutuyla orantili
Ogrenme egrisiDik (Dagger kavramlari)Yumusak (saf Kotlin DSL)
KMP destegiYokTam destek
Jetpack entegrasyonuDerin (resmi Google destegi)Iyi (topluluk + Navigation 3)
Ekip olceklenebilirligiGuclu (zorunlu kapsamlar)Esnek (konvansiyon tabanli)
Test altyapisi@TestInstallIn (derleme guvenli)loadKoinModules (runtime)
Min SDKAPI 23 (2.60 itibariyle)API 23

Hicbir framework evrensel olarak ustun degildir. Dogru secim, projenin olcegine, ekibin deneyim duzeyine ve hedeflenen platformlara baglidir.

Pratik yapmaya başla!

Mülakat simülatörleri ve teknik testlerle bilgini test et.

Kaynaklar

Hilt vs Koin Icin Temel Cikarimlar

  • Hilt 2.60 ile KSP, derleme zamani graf dogrulamasi ve sifira yakin baslatma maliyeti sunarak, siki guvenilirlik gereksinimleri olan buyuk, tek platformlu Android projeleri icin guclu bir tercih olmaya devam etmektedir, ancak artik minSDK 23 ve AGP 9+ gerektirmektedir
  • Koin 4.2, lazy moduller, CoreResolverV2 ve yeni Dagger koprusu ile baslatma performansi farkini kapatirken sifir derleme ek yuku ve tam KMP uyumlulugu saglamaktadir
  • Her iki framework de coklu modul mimarileri desteklemektedir; ancak Hilt kapsam sinirlarini derleme zamaninda zorunlu kilarken, Koin ekip konvansiyonlarina dayanmaktadir
  • Android mulakat hazirliginda derleme zamani ve calisma zamani DI arasindaki odunlesimi anlamak ve her bir framework'un hangi senaryoda daha uygun oldugunu ifade edebilmek, beklenen temel yetkinlik duzeyi olarak kabul edilmektedir
  • Frameworklar arasi gecis basit bir islem degildir, ancak Koin'in Dagger koprusu artik Hilt'ten uzaklasan ekipler icin kademeli bir yol sunmaktadir
Günün meydan okuması

Android kodundaki hatayı bulabilir misin?

Gerçek bir kod parçası, gizli bir hata, günde bir deneme. Denemek için hesap gerekmez.

Anthony Fillion-Maillet

Yazan:

Anthony Fillion-Maillet

SharpSkill kurucusu

10 yılı aşkın süredir fullstack geliştirici. SharpSkill’i yönetiyor ve burada yayımlanan her şeyden sorumlu.

27 Eylül 2026 tarihinde güncellendi

Etiketler

#android
#hilt
#koin
#dependency-injection
#kotlin

Paylaş

İlgili makaleler