Koin — bu kod yaratish, refleksiya va annotatsiyalarsiz ishlaydigan Kotlin üçün DI freymvorkidir. Kutubxona modullarni tasvirlash üçün DSL dan foydalanadi va bog‘liqliklarni Android, Ktor va Multiplatform qo‘llab-quvvatlashi bilan yengil konteyner orqali kiritadi. Koin rasmiy hujjatlariga ko‘ra, freymvork modullar, skoplar va minimal boilerplate bilan Jetpack Compose uchun o‘rnatilgan qo‘llab-quvvatlashni taqdim etadi.
Asosiy ma’lumotlar
Koin — refleksiya, annotatsiyalar yoki kod yaratmasdan toza tilda yozilgan Kotlin üçün DI freymvorkid. Kompilyatsiya bosqichida annotatsiya protsessori va kod yaratishni talab qiladigan Dagger Hiltdan farqli o‘laroq, Koin faqat runtime da modullarni tasvirlash üçün yengil DSL yordamida ishlaydi.
Koinning asosiy g‘oyasi — murakkab bog‘liqlik graflari va komponent daraxtlari tushunchalarini o‘rganish zaruratisiz bog‘liqliklarni ro‘yxatga olish va hal qilish üçün sodda API taqdim etishdir. Dasturchi konteyner üçün qaysi sinflar mavjudligini tasvirlaydi, Koin esa ularni konstruktor yoki by inject kechiktirilgan delegatlari orqali avtomatik kiritadi. Freymvork Kotlin Multiplatform bilan to‘liq mos keladi, bu Android, iOS va server tomonida yagona DI yondashuvidan foydalanishga imkon beradi.
Kotlin Developers Community so‘roviga (2025) ko‘ra, Koin tijoriy Android loyihalarining 31 foizida ishlatiladi, mashhurlik bo‘yicha faqat Hiltdan (47%) keyinda. Tanlashning asosiy sababi — sozlashning oddiyligi va kod yaratish zaruriyatining yo‘qligi, bu loyiha qurilishini tezlashtiradi.
Rivojlanishning tez boshlanishi muhim bo‘lgan o‘rta va katta loyihalar üçün yoki arxitektura sabablariga ko‘ra Hilt mavjud bo‘lmagan Kotlin Multiplatform yechimlari üçün Koinni tanlang.
Koin refleksiya va kod yaratishdan foydalanmaydi — barcha ro‘yxatga olishlar reified tipli inline funktsiyalarga asoslanadi, ular kompilyatsiya bosqichida funktsiya tanasiga aniq turni joylashtiradi. Bu Koinni yakuniy APK hajmi bo‘yicha eng yengil DI freymvorklaridan biriga aylantiradi: Koin qo‘shilishi dastur hajmini bor-yo‘g‘i 100–150 KB ga oshiradi, Dagger Hilt esa yaratilgan kod hisobiga taxminan 500 KB qo‘shadi.
Koin konteyneri konfiguratsiya bilan lambda qabul qiluvchi startKoin funktsiyasi orqali ishga tushiriladi. Ushbu lambda ichida ro‘yxatga olishlar bilan modullar tasvirlanadi — DI mantiqining asosiy qurilish bloki.
startKoin funktsiyasi GlobalContext orqali dasturning istalgan nuqtasidan foydalanish mumkin bo‘lgan global konteyner yaratadi, ammo ko‘p modulli loyihalarda izolyatsiyalangan konteynerlar yaratish üçün KoinApplication dan foydalanish tavsiya etiladi. Android da ishga tushirish üçün avtomatik ravishda Application hayot aylanishiga bog‘lanadigan AndroidContext ishlatiladi. Modullar Module nusxalari ro‘yxatini qabul qiluvchi modules parametri orqali ro‘yxatga olinadi.
val networkModule = module {
single {
OkHttpClient()
}
single {
Retrofit.Builder()
.baseUrl("https://api.example.com")
.build()
}
}
startKoin {
modules(networkModule)
}
Har bir modul single (singlton) yoki factory (yangi nusxa) orqali ta’riflarni o‘z ichiga oladi. Ta’riflar get() orqali boshqa ro‘yxatdan o‘tgan bog‘liqliklarga murojaat qilishi mumkin, bu turlarni aniq ko‘rsatmasdan va boilerplate kodsiz kiritish grafi hosil qiladi.
Koin kontekstdan turni chiqarish üçün reified parametrli inline funktsiyalardan faol foydalanadi. Bu sinfni aniq ko‘rsatmasdan ro‘yxatga olish yozishga imkon beradi: single { MyService() } lambdaning qaytarilgan qiymatiga qarab turni avtomatik aniqlaydi.
Daggerdan farqli o‘laroq, Koin bog‘liqlik grafigini kompilyatsiya bosqichida tekshirmaydi — barcha xatolar hal qilinmagan bog‘liqlikka birinchi murojaatda runtime da aniqlanadi. Bu kodni sezilarli darajada soddalashtiradigan va qurilishni tezlashtiradigan, ammo DI konfiguratsiyasining test qamrovini talab qiladigan kelishuvdir. Ko‘plab jamoalar kompilyatsiya vaqtidagi tekshiruvlarning yo‘qligiga qaramay, Koinni aynan rivojlanish tezligi va oddiyligi üçün tanlaydi.
Koin 3.5 versiyasida Koin Annotations plagini orqali kompilyatsiya bosqichida grafning eksperimental tekshiruvi paydo bo‘ldi. Dasturchi @Module va @KoinComponent annotatsiyalarini qo‘shadi, plagin esa qurilish vaqtida ishlaydigan validatsiya kodini yaratadi. Biroq Koinning asosiy afzalligi — kod yaratishning yo‘qligi — bu rejimda yo‘qoladi, shuning üçün aksariyat jamoalar testlar orqali runtime tekshiruvlari bilan klassik DSL yondashuvidan foydalanishda davom etadi.
Koin bog‘liqliklarni kiritishning bir necha usulini taqdim etadi: by inject(), get() va konstruktor orqali to‘g‘ridan-to‘g‘ri uzatish. Usulni tanlash foydalanish kontekstiga bog‘liq.
by inject delegati — ViewModel va Android fragmentlarida eng keng tarqalgan kiritish usuli. Bog‘liqlik kechiktirilgan holda — faqat xususiyatga birinchi murojaatda ishga tushiriladi. Bu darhol kerak bo‘lmasligi mumkin bo‘lgan resurs talab qiladigan servislar üçün samaralidir.
class MainViewModel : ViewModel() {
private val repository: UserRepository by inject()
fun loadUsers() {
repository.fetchAll()
}
}
get funktsiyasi bog‘liqlik nusxasini darhol qaytaradi. Ro‘yxatga olish vaqtida fabrik lambdalar ichida yoki bog‘liqlik kechiktirilgan ishga tushirishsiz sinxron kontekstda kerak bo‘lganda ishlatiladi. by inject() dan farqli o‘laroq, get() kechiktirilgan yuklashni qo‘llab-quvvatlamaydi va chaqiruv vaqtida konteyner allaqachon ishga tushirilgan bo‘lishini talab qiladi.
Scope Koinda — bog‘liqliklarning hayot aylanishini Activity, Fragment yoki foydalanuvchi sessiyasi kabi ma’lum bir komponentga bog‘lash mexanizmi. Bu Android dasturlarida xotirani boshqarish üçün asosiy funksionallikdir.
Modul ichidagi scope funktsiyasi bog‘langan komponent yashaydigan davr mobaynida yashaydigan skop yaratadi. Skopda ro‘yxatdan o‘tgan barcha bog‘liqliklar yopilganda yo‘q qilinadi, bu xotira oqishlarining oldini oladi.
val userScope = module {
scope<UserSession> {
scoped {
UserRepository(get())
}
scoped {
SessionManager(get())
}
}
}
scoped funktsiyasi faqat skop ichida mavjud bo‘ladigan bog‘liqlikni ro‘yxatga oladi. Skop yopilganda barcha scoped obyektlar axlat yig‘uvchi üçün erishib bo‘lmas holga keladi.
single — kechiktirilgan ishga tushirish bilan butun dastur üçün yagona nusxani ro‘yxatga olish. Holatsiz servislar üçün ishlatiladi: tarmoq mijozlari, kesh, loggerlar.
factory — har bir get() chaqiruvi yangi nusxa yaratadi. Har murojaatda yangi nusxa muhim bo‘lgan ViewModel, repozitoriylar va holatli obyektlar üçün qo‘llaniladi.
Koin ning Android loyihasiga integratsiyasi minimal: build.gradle ga bog‘liqlik qo‘shish va Application.onCreate da startKoin chaqirish kifoya. Koin Jetpack Compose, Navigation va WorkManager bilan integratsiya üçün modullarni taqdim etadi, bu uni Hiltga to‘liq muqobil qiladi.
Maxsus koin-android-compose kutubxonasi koinViewModel() va koinInject() funktsiyalari orqali to‘g‘ridan-to‘g‘ri Composable funktsiyalarida bog‘liqliklarni kiritishga imkon beradi. Bu konteynerni har bir ekranning parametrlari orqali uzatish zaruratini bartaraf qiladi va hayot aylanishi bilan avtomatik bog‘lanish tufayli ViewModel kodini tozaroq qiladi.
Google I/O 2024 ga ko‘ra, Jetpack Compose yangi Android loyihalari üçün asosiy freymvorkga aylandi. Koin qo‘shimcha sozlamalarsiz Compose ning mahalliy qo‘llab-quvvatlashini ta’minlaydi, koinViewModel() orqali skoplarni ViewModel hayot aylanishiga avtomatik bog‘laydi va coroutine kontekstini hisobga oladi.
Sinov üçün Koin test modullari bilan izolyatsiyalangan konteyner yaratuvchi va test tugagandan so‘ng uni avtomatik yopuvchi koinTest va koinTestRule funktsiyalarini taqdim etadi. Bu testlarning izolyatsiyasini ta’minlaydi va test holatlari o‘rtasida holat oqishining oldini oladi.
Koinning Jetpack Navigation bilan integratsiyasi koin-androidx-navigation moduli orqali amalga oshiriladi. Har bir ekranning ViewModel avtomatik ravishda by viewModel() orqali bog‘liqliklarni oladi va ekran aylantirilganda holatni saqlash va dastur kichiklashtirilgandan keyin tiklash üçün SavedStateHandle uzatiladi.
ViewModel ni Koin bilan birlik sinovi üçün koin-test-junit5 yoki koin-test-junit4 kutubxonasidan koinTestRule ishlatiladi. Qoida har bir sinovdan oldin test modullari bilan izolyatsiyalangan konteyner yaratadi va tugagandan so‘ng uni avtomatik yopadi, test holatlari o‘rtasida holat oqishining oldini oladi. Haqiqiy bog‘liqliklar MockK orqali mocklar bilan almashtiriladi: single
Koin 3.x ning asosiy imkoniyatlaridan biri Kotlin da server dasturlari yaratish üçün Ktor va ish stoli dasturlari üçün Compose Multiplatform qo‘llab-quvvatlashidir. Bu Koinni kiritish paradigmasini o‘zgartirmasdan Kotlinning uchala platformasini ham qamrab oluvchi yagona DI freymvorkiga aylantiradi. koin-ktor moduli Application blokida install(Koin) orqali bog‘liqliklarni ro‘yxatga olish va Android dagi kabi by inject() orqali marshrutlarga servislarni kiritish imkonini beradi. Bu Koinni mobil mijozdan server backendigacha har qanday arxitekturadagi Kotlin loyihalari üçün universal DI yechimiga aylantiradi.
Koinning Jetpack Navigation bilan koin-androidx-navigation moduli orqali integratsiyasi har bir ekran üçün qo‘lda ViewModelProvider.Factory yaratish zaruratini bartaraf qiladi. Ko‘p modulli loyihalar üçün Koin loadKoinModules orqali modullarning kechiktirilgan yuklanishini qo‘llab-quvvatlaydi, bu har bir funksiya modulining DI konfiguratsiyasini mustaqil ulashga imkon beradi.
Ko‘p beriladigan savollar
Koin kod yaratish va annotatsiyalarsiz runtime da ishlaydi, bu qurilishni tezlashtiradi, ammo bog‘liqlik grafigini kompilyatsiya bosqichida tekshirmaydi. Hilt kompilyatsiya vaqtida kod yaratadi va DI xatolarini ertaroq aniqlaydi, lekin murakkab sozlashni talab qiladi va qurilishni sekinlashtiradi.
Ha, Koin Kotlin Multiplatformni to‘liq qo‘llab-quvvatlaydi. koin-core kutubxonasi barcha Kotlin platformalarida ishlaydi, koin-android va koin-compose esa Android va iOS üçün platformaga xos imkoniyatlarni qo‘shadi.
Tsiklik bog‘liqliklar runtime da StackOverflowError ga olib keladi. Koin ularni avtomatik aniqlamaydi. Yechim — arxitektura refaktoringi: umumiy interfeysni ajratish, Listener/Observer na’munasidan foydalanish yoki kechiktirilgan ishga tushirish bilan fabrika orqali tsiklni uzish.
Android da skoplar AndroidScope orqali Activity yoki Fragment hayot aylanishiga bog‘lanishi mumkin. Komponent yo‘q qilinganda Koin tegishli skopni avtomatik yopadi. Foydalanuvchi skoplarida (foydalanuvchi sessiyasi) yopish scope.close chaqiruvi bilan qo‘lda amalga oshiriladi.
koin-test modulidan koinTest funktsiyasidan foydalaning. U test modullari bilan izolyatsiyalangan konteyner yaratadi va testdan so‘ng avtomatik yopiladi. Haqiqiy bog‘liqliklar Mockito yoki MockK bilan modul orqali mocklar bilan almashtiriladi.
Xulosa
Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz
IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.