Coil — Kotlin da yozilgan va korutinlar asosida qurilgan Android uchun rasm yuklash kutubxonasidir. rasmiy hujjatlarga ko‘ra, kutubxona Memory Cache, Disk Cache va apparat tezlashtirishi bilan transformatsiyalarni qo‘llab-quvvatlaydi. Coil minimal APK hajmi (taxminan 150 KB) va Jetpack Compose bilan to‘liq mosligi bilan ajralib turadi.
Asosiy fikrlar
Coil (Coroutine Image Loader) — to‘liq Kotlin tilida yozilgan va asinxron ish uchun korutinlardan foydalanadigan Android rasm yuklash kutubxonasidir. U tarmoq, resurslar, fayl tizimi va Content Provider dan bitmap rasmlarini avtomatik ko‘p darajali keshlash bilan yuklash uchun yagona API ni taqdim etadi.
Glide va Picasso dan farqli o‘laroq, Coil callback zanjiri o‘rniga Kotlin Coroutines dan foydalanadi, bu kodni chiziqli va bashorat qilinadigan qiladi. Barcha yuklash va dekodlash operatsiyalari Dispatchers.IO orqali fon oqimlarida bajariladi va natija asosiy oqimga aniq o‘tishsiz yetkaziladi.
Coil transformatsiyalar (Round, Blur, Grayscale), o‘tish animatsiyalari, SVG va GIF ni, shuningdek nostandart ko‘rsatish uchun maxsus Target ni qo‘llab-quvvatlaydi. Google I/O 2023 ma’lumotlariga ko‘ra, Coil Glide bilan bir qatorda Jetpack Compose bo‘yicha rasmiy qo‘llanmalarda tavsiya etiladi.
ImageLoader — yuklash so‘rovlarini bajarish va keshlarni boshqarish uchun mas’ul bo‘lgan Coil ning asosiy komponentidir. Har bir nusxa MemoryCache, DiskCache, BitmapPool va korutinlar hovuziga havolalarni o‘z ichiga oladi. Odatiy holda Coil.imageLoader(context) orqali yaratilgan singletondan foydalaniladi.
ImageRequest — rasm yuklash uchun bitta so‘rovni tavsiflovchi ob’ekt: ma’lumot manbai (URL, URI, Int resurs), maqsadli ImageView yoki Target, transformatsiyalar, keshlash sozlamalari va placeholder. ImageRequest builder orqali yig‘iladi, bu moslashuvchanlik va o‘qish qulayligini ta’minlaydi.
val request = ImageRequest.Builder(context)
.data("https://example.com/image.jpg")
.crossfade(true)
.size(512, 512)
.transformations(listOf(RoundedCornersTransformation(12f)))
.memoryCachePolicy(CachePolicy.ENABLED)
.diskCachePolicy(CachePolicy.ENABLED)
.target(imageView)
.build()
ImageRequest tuzilgandan so‘ng, enqueue yoki execute orqali ImageLoader ga uzatiladi. Enqueue metodi korutinni ishga tushiradi va ekran tark etilganda yuklashni bekor qilish imkonini beruvchi Disposable ni qaytaradi. Execute metodi to‘g‘ridan-to‘g‘ri Result qaytaruvchi suspend-funksiyadir.
ImageLoader ketma-ket MemoryCache, DiskCache ni tekshiradi va faqat ikkalasi ham xato berganda HttpEngine orqali tarmoq so‘rovini bajaradi. Yuklangandan so‘ng, baytlar maqsadli o‘lchamni hisobga olgan holda Bitmap ga dekodlanadi, transformatsiyalar qo‘llaniladi, natija ikkala keshlarda saqlanadi va Target ga uzatiladi.
Coil Dependency Injection orqali istalgan qismni almashtirish imkoniyatiga ega komponent arxitekturasi asosida qurilgan. Barcha komponentlar ImageLoaderFactory da ro‘yxatga olinadi va builder orqali ImageLoader konstruktoriga uzatiladi.
ImageLoader — barcha yuklash operatsiyalari uchun kirish nuqtasidir. Har bir nusxa korutinlar hovuzi, BitmapPool, MemoryCache, DiskCache va interceptors ro‘yxatini o‘z ichiga oladi. Odatiy holda bitta global nusxa yaratiladi, ammo modul testi uchun izolyatsiya qilingan keshlarga ega alohida nusxalar yaratilishi mumkin.
MemoryCache — dekodlangan Bitmap ob’ektlarini saqlaydigan LRU (Least Recently Used) asosidagi xotira ichidagi keshlardir. Odatiy maksimal hajm ilovaning mavjud xotirasining 25% ini tashkil qiladi, lekin 32 MB dan kam emas. Kesh kaliti URL + o‘lcham + transformatsiyalardan shakllanadi, bu eskirgan rasmning berilishini istisno qiladi.
DiskCache — xom ma’lumotlar (JPEG, PNG, WebP) va dekodlangan metama’lumotlar uchun fayl keshlaridir. Ilovaning kesh katalogida joylashgan va limit oshib ketganda avtomatik tozalashni qo‘llab-quvvatlaydi. Disk bilan ishlash katalog va maksimal hajm sozlamalari bilan DiskCache.Builder orqali amalga oshiriladi.
Coil tarmoq so‘rovlarini minimallashtiradigan va rasmlarni ko‘rsatishni tezlashtiradigan ko‘p darajali keshlash strategiyasini amalga oshiradi. Har bir daraja o‘z maqsadi va ma’lumotlarning yashash muddatiga ega.
| Daraja | Saqlash turi | Yashash muddati | Odatiy hajm |
|---|---|---|---|
| Memory Cache | Xotirada Bitmap | LRU siqib chiqarilgunga qadar | 25% heap, 32 MB dan |
| Disk Cache | JPEG/WebP fayllari | Limit oshib ketgunga qadar | 250 MB |
| Http Cache | OkHttp javoblari | Cache-Control sarlavhalariga ko‘ra | HTTP mijoziga bog‘liq |
Memory Cache allaqachon dekodlangan bitmaplarga tezkor kirishni ta’minlaydi. Disk Cache birinchi yuklashdan so‘ng ilovaning tarmoqsiz (offline-first) ishlashini kafolatlaydi. Http Cache OkHttp darajasida ETag va If-Modified-Since shartli so‘rovlarini qayta ishlaydi.
Keshlash siyosatlari so‘rov bo‘yicha CachePolicy orqali uch qiymat bilan sozlanadi: ENABLED, READ_ONLY, WRITE_ONLY, DISABLED. Masalan, foydalanuvchi avatarlari uchun Memory Cache uchun READ_ONLY va Disk Cache uchun ENABLED o‘rnatilishi mumkin.
Coil ilova arxitekturasiga qarab bir nechta integratsiya usullarini taqdim etadi. Ishchi kod misollari bilan uchta asosiy stsenariyni ko‘rib chiqamiz.
load — ImageView uchun kengaytma funksiyasi, bir qatorda rasm yuklashning eng oddiy usuli. Funksiya URL, URI, Int resurs yoki File ni va barcha ixtiyoriy parametrlarni lambda konfigurator orqali qabul qiladi.
imageView.load("https://example.com/photo.jpg") {
crossfade(true)
placeholder(R.drawable.placeholder)
error(R.drawable.error)
size(300, 300)
transformations(CircleCropTransformation())
}
load metodi onDestroy da yoki View qayta ishlatilganda bekor qilinishi mumkin bo‘lgan Disposable ni qaytaradi. Bu ro‘yxatni tez aylantirishda xotira oqishi va keraksiz tarmoq so‘rovlarining oldini oladi.
AsyncImage — deklarativ UI da rasmlarni yuklash uchun composable funksiyasi. Istalgan ma’lumot manbai va holatlar uchun uchta ixtiyoriy parametrni qabul qiladi: placeholder, error va success.
@Composable
fun NetworkImage(url: String) {
AsyncImage(
model = url,
contentDescription = "tarmoq rasmi",
placeholder = ColorPainter(Color.Gray),
error = ColorPainter(Color.Red)
)
}
SubcomposeAsyncImage — content slot orqali yuklash vaqtida ko‘rsatishni sozlash imkonini beruvchi yanada moslashuvchan versiyadir. Bu skeleton (shimmer) va taraqqiyot chiziqlari uchun foydalidir.
Agar ImageView yoki AsyncImage mos kelmasa, Bitmap ni qabul qiluvchi yagona onSuccess metodiga ega Target amalga oshirilishi mumkin. Bu Notification, RemoteViews yoki OpenGL teksturasiga yuklash uchun ishlatiladi.
val target = object : BitmapTarget() {
override fun onSuccess(result: Bitmap) {
notificationRemoteView.setImageViewBitmap(R.id.icon, result)
}
}
imageLoader.enqueue(
ImageRequest.Builder(context)
.data(url)
.target(target)
.build()
)
Rasm yuklash kutubxonasini tanlash loyiha talablariga bog‘liq. Coil har biri o‘z kuchli tomonlariga ega bo‘lgan Glide va Picasso bilan raqobatlashadi. Asosiy xususiyatlarning solishtirilishi jadvalda keltirilgan.
| Xususiyat | Coil | Glide | Picasso |
|---|---|---|---|
| Til | Kotlin (100%) | Java + Kotlin | Java |
| APK hajmi | ~150 KB | ~500 KB | ~120 KB |
| Korutinlar | Ichki | Yo‘q (callback) | Yo‘q (callback) |
| Jetpack Compose | Mahalliy qo‘llab-quvvatlash | Accompaniment orqali | Uchinchi tomon |
| GIF/WebP | Ha (ichki) | Ha (ichki) | Yo‘q |
| Google tavsiyasi | Ha (I/O 2023) | Ha | Yo‘q |
Kotlin va Jetpack Compose da yangi loyihalar uchun Coil korutinlardan nol qo‘shimcha bog‘liqlik va minimal hajm tufayli tabiiy tanlovga aylanadi. Glide animatsiyalar va video oldindan ko‘rish bilan murakkab stsenariylar uchun afzal. Picasso ikkalasidan funksionallik bo‘yicha past, ammo soddalikda g‘olib keladi.
Coil ni Android loyihasiga ulash Gradle bog‘liqligi orqali amalga oshiriladi. Kutubxona qo‘shilgandan so‘ng, u ContentProvider orqali ImageLoader ni avtomatik ro‘yxatga oladi, shuning uchun Application da qo‘lda ishga tushirish talab qilinmaydi. Sozlash zarur bo‘lganda, builder orqali o‘z ImageLoader yaratiladi.
// build.gradle.kts (ilova moduli)
dependencies {
implementation("io.coil-kt:coil:2.6.0")
// Jetpack Compose uchun qo‘shimcha:
implementation("io.coil-kt:coil-compose:2.6.0")
// SVG qo‘llab-quvvatlash uchun:
implementation("io.coil-kt:coil-svg:2.6.0")
// GIF qo‘llab-quvvatlash uchun:
implementation("io.coil-kt:coil-gif:2.6.0")
}
ImageLoader ni sozlash uchun Application.onCreate da yaratilgan singleton ImageLoaderFactory ishlatiladi. Fabrikada kesh limitlari, HTTP mijozi, maxsus dekoderlar va loglashtirishni sozlash mumkin. Odatiy holda Coil tayyor ulanishlar hovuziga ega OkHttp dan foydalanadi.
class App : Application(), ImageLoaderFactory {
override fun newImageLoader(): ImageLoader {
return ImageLoader.Builder(this)
.memoryCache {
MemoryCache.Builder()
.maxSizePercent(0.25)
.build()
}
.diskCache {
DiskCache.Builder()
.directory(cacheDir.resolve("coil_cache"))
.maxSizeBytes(512 * 1024 * 1024)
.build()
}
.build()
}
}
Tez-tez beriladigan savollar
Coil — Kotlin tilida korutinlardan foydalanib yozilgan Android uchun rasm yuklash kutubxonasi. U tarmoq, resurslar yoki fayl tizimidan bitmap rasmlarini asinxron yuklash, keshlash va ko‘rsatish uchun ishlatiladi.
Coil 100% Kotlin tilida yozilgan va Glide dagi callback mexanizmi o‘rniga korutinlar dan foydalanadi. Coil kichikroq APK hajmiga (~150 KB ~500 KB ga qarshi) va AsyncImage orqali Jetpack Compose uchun mahalliy qo‘llab-quvvatlashga ega.
build.gradle.kts ga io.coil-kt:coil:2.6.0 bog‘liqligini qo‘shing. Jetpack Compose uchun io.coil-kt:coil-compose:2.6.0 ni ham qo‘shing. Kutubxona ContentProvider orqali ImageLoader ni avtomatik ro‘yxatga oladi.
Coil JPEG, PNG, WebP, BMP, SVG (coil-svg moduli orqali) va GIF (coil-gif moduli orqali) ni qo‘llab-quvvatlaydi. AVIF va HEIF formatlari Android 10+ bo‘lgan qurilmalarda maxsus dekoder orqali qo‘llab-quvvatlanadi.
Kesh ImageLoader.Builder orqali sozlanadi: memoryCache heap dan foiz ko‘rsatilgan holda, diskCache yo‘l va baytdagi limit bilan. Kesh siyosatlari (ENABLED, DISABLED, READ_ONLY) CachePolicy orqali so‘rov bo‘yicha sozlanadi.
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.