Coil — bu nima, asosiy tushunchalar va Android-da ImageLoader

Muallif: IT Sectr Nashr etilgan: 2026-05-05 O'qish vaqti: 9 daq

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 — Android da rasm yuklash uchun kutubxona, Kotlin Coroutines va Kotlin Serialization dan foydalanadi.
  • ImageLoader — so‘rovlar, keshlash va rasm transformatsiyalarini boshqaradigan markaziy komponent.
  • Memory Cache tezkor kirish uchun dekodlangan bitmap rasmlarini operativ xotirada saqlaydi.
  • Disk Cache oflayn ish va trafikni kamaytirish uchun siqilgan fayllarni diskda saqlaydi.
  • Jetpack Compose — kutubxona deklarativ UI uchun AsyncImage va SubcomposeAsyncImage ni qo‘llab-quvvatlaydi.

Coil nima?

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.

  • APK hajmi — taxminan 150 KB (Glide da 500 KB ga qarshi)
  • Minimal Android versiyasi — API 21 (Lollipop)
  • Bog‘liqlik — Kotlin Coroutines (ichki)

Coil qanday ishlaydi: ImageLoader va ImageRequest

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

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.

kotlin
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.

So‘rovning bajarilish jarayoni

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.

  • Memory Cache — birinchi navbatda tekshiriladi, kalit — URL + parametrlar
  • Disk Cache — xotira yo‘qligida tekshiriladi, kalit — URL MD5
  • HttpEngine — odatiy holda OkHttp, komponent orqali sozlanishi mumkin

Coil ning asosiy komponentlari

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

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

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

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 da keshlash darajalari

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.

DarajaSaqlash turiYashash muddatiOdatiy hajm
Memory CacheXotirada BitmapLRU siqib chiqarilgunga qadar25% heap, 32 MB dan
Disk CacheJPEG/WebP fayllariLimit oshib ketgunga qadar250 MB
Http CacheOkHttp javoblariCache-Control sarlavhalariga ko‘raHTTP 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.

Kotlin da Coil dan foydalanish misollari

Coil ilova arxitekturasiga qarab bir nechta integratsiya usullarini taqdim etadi. Ishchi kod misollari bilan uchta asosiy stsenariyni ko‘rib chiqamiz.

ImageView ga kengaytma orqali yuklash

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.

kotlin
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.

Jetpack Compose da foydalanish

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.

kotlin
@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.

Nostandart chiqish uchun maxsus Target

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.

kotlin
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()
)

Coil ni boshqa kutubxonalar bilan solishtirish

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.

XususiyatCoilGlidePicasso
TilKotlin (100%)Java + KotlinJava
APK hajmi~150 KB~500 KB~120 KB
KorutinlarIchkiYo‘q (callback)Yo‘q (callback)
Jetpack ComposeMahalliy qo‘llab-quvvatlashAccompaniment orqaliUchinchi tomon
GIF/WebPHa (ichki)Ha (ichki)Yo‘q
Google tavsiyasiHa (I/O 2023)HaYo‘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.

Android loyihasida Coil ni sozlash

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.

kotlin
// 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.

kotlin
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 nima va u nima uchun ishlatiladi?

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 Glide dan qanday farq qiladi?

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.

Kotlin loyihasiga Coil ni qanday qo‘shish mumkin?

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 qanday rasm turlarini qo‘llab-quvvatlaydi?

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.

Coil da keshlarni qanday sozlash mumkin?

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

  • Coil — korutinlar va Jetpack Compose uchun to‘liq qo‘llab-quvvatlashga ega Kotlin da rasm yuklash kutubxonasi.
  • ImageLoader so‘rovlar, keshlash va transformatsiyalarni boshqaradi, ikki darajali keshlardan foydalanadi: Memory Cache va Disk Cache.
  • AsyncImage va SubcomposeAsyncImage placeholder, error va success holatlarini qo‘llab-quvvatlab, Compose bilan integratsiyani ta’minlaydi.
  • APK hajmi ~150 KB Coil ni bozordagi eng ixcham rasm yuklash kutubxonalaridan biriga aylantiradi.
  • Transformatsiyalar (RoundedCorners, CircleCrop, Blur) kutubxonaga o‘rnatilgan va apparat tezlashtirishi bilan ishlaydi.
  • Disk Cache sozlanishi saqlash limiti bilan avval yuklangan rasmlarga oflayn kirishni ta’minlaydi.
  • Coil Google tomonidan tavsiya etilgan Jetpack Compose bo‘yicha rasmiy qo‘llanmalarda, bu uning zamonaviy standart maqomini tasdiqlaydi.

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.

Loyihani muhokama qilish

Shuningdek o'qing