Coil — nedir, temel kavramlar ve Android'de ImageLoader

Yazar: IT Sectr Yayınlanma: 2026-05-05 Okuma süresi: 9 dk

Coil, Kotlin ile yazılmış ve coroutine'ler üzerine inşa edilmiş, Android için bir görsel yükleme kütüphanesidir. Resmi dokümantasyona göre kütüphane, Memory Cache, Disk Cache ve donanım hızlandırmalı dönüşümleri destekler. Coil, minimum APK boyutu (yaklaşık 150 KB) ve Jetpack Compose ile tam uyumluluğu ile öne çıkar.

Önemli Noktalar

  • Coil, Kotlin Coroutines ve Kotlin Serialization kullanan Android için bir görsel yükleme kütüphanesidir.
  • ImageLoader, istekleri, önbelleğe almayı ve görsel dönüşümlerini yöneten merkezi bileşendir.
  • Memory Cache, anında erişim için kodlanmış bitmap görsellerini RAM'de saklar.
  • Disk Cache, çevrimdışı çalışma ve trafik azaltma için sıkıştırılmış dosyaları depolamada kaydeder.
  • Jetpack Compose — kütüphane, bildirimsel UI için AsyncImage ve SubcomposeAsyncImage'i destekler.

Coil Nedir?

Coil (Coroutine Image Loader), tamamen Kotlin ile yazılmış ve asenkron işlemler için coroutine'ler kullanan Android için bir görsel yükleme kütüphanesidir. Ağ, kaynaklar, dosya sistemi ve Content Provider'dan bitmap görsellerini yüklemek için otomatik çok seviyeli önbellekleme ile birleşik bir API sağlar.

Glide ve Picasso'nun aksine Coil, geri arama zincirleri yerine Kotlin Coroutines kullanarak kodu daha doğrusal ve öngörülebilir hale getirir. Tüm yükleme ve kod çözme işlemleri, Dispatchers.IO dağıtıcısı aracılığıyla arka plan iş parçacıklarında yürütülür ve sonuçlar açık bir değiştirme olmadan ana iş parçacığına iletilir.

Coil, dönüşümleri (Round, Blur, Grayscale), geçiş animasyonlarını, SVG ve GIF'in yanı sıra standart olmayan görüntüleme için özel Target'leri destekler. Google I/O 2023'e göre Coil, Glide ile birlikte resmi Jetpack Compose eğitimlerinde önerilmektedir.

  • APK Boyutu — yaklaşık 150 KB (Glide'in 500 KB'sine karşı)
  • Minimum Android Sürümü — API 21 (Lollipop)
  • Bağımlılık — Kotlin Coroutines (dahili)

Coil Nasıl Çalışır: ImageLoader ve ImageRequest

ImageLoader, Coil'in ana bileşenidir, yükleme isteklerini yürütmekten ve önbelleği yönetmekten sorumludur. Her örnek, MemoryCache, DiskCache, BitmapPool ve bir coroutine havuzuna referanslar içerir. Varsayılan olarak, Coil.imageLoader(context) aracılığıyla oluşturulan bir singleton kullanılır.

ImageRequest

ImageRequest, tek bir görsel yükleme isteğini tanımlayan bir nesnedir: veri kaynağı (URL, URI, Int kaynağı), hedef ImageView veya Target, dönüşümler, önbellek ayarları ve yer tutucu. ImageRequest bir builder aracılığıyla oluşturulur ve esneklik ve okunabilirlik sağlar.

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

Oluşturulduktan sonra ImageRequest, enqueue veya execute aracılığıyla ImageLoader'a iletilir. enqueue yöntemi bir coroutine başlatır ve ekrandan ayrılırken yüklemeyi iptal etmeye izin veren bir Disposable döndürür. execute yöntemi, doğrudan bir Result döndüren bir askıya alma işlevidir.

İstek yürütme akışı

ImageLoader sırayla MemoryCache, DiskCache'i kontrol eder ve yalnızca her ikisinde de bulunamazsa HttpEngine aracılığıyla bir ağ isteği yürütür. Yüklemeden sonra, baytlar hedef boyut dikkate alınarak Bitmap'e kodlanır, dönüşümler uygulanır, sonuç her iki önbellekte saklanır ve Target'e iletilir.

  • Memory Cache — önce kontrol edilir, anahtar URL + parametrelerdir
  • Disk Cache — bellek hatasında kontrol edilir, anahtar URL'nin MD5'idir
  • HttpEngine — varsayılan olarak OkHttp, bileşen aracılığıyla özelleştirilebilir

Coil'in Temel Bileşenleri

Coil, Bağımlılık Enjeksiyonu aracılığıyla herhangi bir parçanın değiştirilebildiği bir bileşen mimarisi üzerine inşa edilmiştir. Tüm bileşenler ImageLoaderFactory'ye kaydedilir ve builder aracılığıyla ImageLoader yapıcısına iletilir.

ImageLoader

ImageLoader, tüm yükleme işlemleri için giriş noktasıdır. Her örnek bir coroutine havuzu, BitmapPool, MemoryCache, DiskCache ve bir engelleyiciler listesi içerir. Varsayılan olarak bir genel örnek oluşturulur, ancak birim testleri için izole önbelleklere sahip ayrı örnekler oluşturulabilir.

MemoryCache

MemoryCache, kodlanmış Bitmap nesnelerini depolayan LRU (Least Recently Used) tabanlı bir bellek içi önbellektir. Varsayılan maksimum boyut, kullanılabilir uygulama belleğinin %25'idir, ancak 32 MB'tan az değildir. Önbellek anahtarı URL + boyut + dönüşümlerden oluşturulur ve güncel olmayan görsel alımını önler.

DiskCache

DiskCache, ham veriler (JPEG, PNG, WebP) ve kodlanmış meta veriler için dosya tabanlı bir önbellektir. Uygulamanın önbellek dizininde bulunur ve sınır aşıldığında otomatik temizlemeyi destekler. Disk işlemleri, dizin ve maksimum boyut yapılandırmasıyla DiskCache.Builder aracılığıyla gerçekleştirilir.

Coil'de Önbellek Seviyeleri

Coil, ağ isteklerini en aza indiren ve görsel görüntülemeyi hızlandıran çok seviyeli bir önbellekleme stratejisi uygular. Her seviyenin kendi amacı ve veri ömrü vardır.

SeviyeDepolama TürüÖmürVarsayılan Boyut
Memory CacheRAM'de BitmapLRU çıkarılmasına kadarHeap'in %25'i, 32 MB'tan
Disk CacheJPEG/WebP dosyalarıSınır aşılana kadar250 MB
Http CacheOkHttp yanıtlarıCache-Control başlıklarına göreHTTP istemcisine bağlı

Memory Cache, zaten kodlanmış Bitmap'lere anında erişim sağlar. Disk Cache, ilk yüklemeden sonra uygulamanın ağ olmadan (çevrimdışı öncelikli) çalışmasını sağlar. OkHttp düzeyindeki Http Cache, ETag ve If-Modified-Since ile koşullu istekleri işler.

Önbellek politikaları, CachePolicy aracılığıyla istek başına üç değerle yapılandırılır: ENABLED, READ_ONLY, WRITE_ONLY, DISABLED. Örneğin, kullanıcı avatarları için Memory Cache için READ_ONLY ve Disk Cache için ENABLED ayarlanabilir.

Kotlin'de Coil Kullanım Örnekleri

Coil, uygulama mimarisine bağlı olarak çeşitli entegrasyon yöntemleri sunar. Çalışan kod örnekleriyle üç temel senaryoyu inceleyelim.

Uzantı yoluyla ImageView'a yükleme

load, ImageView için bir uzantı işlevidir, bir görseli tek satırda yüklemenin en basit yoludur. İşlev, bir lambda yapılandırıcısı aracılığıyla tüm isteğe bağlı parametrelerle birlikte URL, URI, Int kaynağı veya Dosyayı kabul eder.

kotlin
imageView.load("https://example.com/photo.jpg") {
    crossfade(true)
    placeholder(R.drawable.placeholder)
    error(R.drawable.error)
    size(300, 300)
    transformations(CircleCropTransformation())
}

load yöntemi, onDestroy'da veya View yeniden kullanılırken iptal edilebilen bir Disposable döndürür. Bu, hızlı liste kaydırma sırasında bellek sızıntılarını ve gereksiz ağ isteklerini önler.

Jetpack Compose'da Kullanım

AsyncImage, bildirimsel UI'da görsel yüklemek için bir composable işlevidir. Herhangi bir veri kaynağını ve durumlar için üç isteğe bağlı parametreyi kabul eder: placeholder, error ve success.

kotlin
@Composable
fun NetworkImage(url: String) {
    AsyncImage(
        model = url,
        contentDescription = "ağ görseli",
        placeholder = ColorPainter(Color.Gray),
        error = ColorPainter(Color.Red)
    )
}

SubcomposeAsyncImage, bir içerik yuvası aracılığıyla yükleme sırasında görüntülemeyi özelleştirmeye izin veren daha esnek bir sürümdür. Bu, iskeletler (shimmer) ve ilerleme çubukları için kullanışlıdır.

Standart olmayan çıktı için özel Target

ImageView veya AsyncImage uygun değilse, Bitmap kabul eden tek bir onSuccess yöntemiyle bir Target uygulayabilirsiniz. Bu, Notification, RemoteViews veya OpenGL dokularına yüklemek için kullanılır.

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'in Diğer Kütüphanelerle Karşılaştırması

Görsel yükleme kütüphanesi seçimi proje gereksinimlerine bağlıdır. Coil, her biri kendi güçlü yönlerine sahip olan Glide ve Picasso ile rekabet eder. Temel özelliklerin bir karşılaştırması tabloda sunulmuştur.

ÖzellikCoilGlidePicasso
DilKotlin (%100)Java + KotlinJava
APK Boyutu~150 KB~500 KB~120 KB
Coroutine'lerDahiliHayır (geri arama)Hayır (geri arama)
Jetpack ComposeYerel destekaccompanist aracılığıylaÜçüncü taraf
GIF/WebPEvet (dahili)Evet (dahili)Hayır
Google TavsiyesiEvet (I/O 2023)EvetHayır

Kotlin ve Jetpack Compose'daki yeni projeler için Coil, sıfır ek coroutine bağımlılığı ve minimum boyut sayesinde doğal seçim haline gelir. Glide, animasyonlar ve video önizlemeleri içeren karmaşık senaryolar için tercih edilmeye devam etmektedir. Picasso, işlevsellik açısından her ikisinin de gerisinde kalır ancak basitlikte kazanır.

Android Projesinde Coil Kurulumu

Coil'in bir Android projesine eklenmesi bir Gradle bağımlılığı aracılığıyla yapılır. Eklendikten sonra kütüphane, ContentProvider aracılığıyla otomatik olarak bir ImageLoader kaydeder, bu nedenle Application'da manuel başlatma gerekmez. Özelleştirme gerekiyorsa, builder aracılığıyla özel bir ImageLoader oluşturulur.

kotlin
// build.gradle.kts (app module)
dependencies {
    implementation("io.coil-kt:coil:2.6.0")
    // Jetpack Compose için ek olarak:
    implementation("io.coil-kt:coil-compose:2.6.0")
    // SVG desteği için:
    implementation("io.coil-kt:coil-svg:2.6.0")
    // GIF desteği için:
    implementation("io.coil-kt:coil-gif:2.6.0")
}

ImageLoader'ı özelleştirmek için ImageLoaderFactory kullanılır — Application.onCreate'de oluşturulan bir singleton. Fabrikada önbellek sınırlarını, HTTP istemcisini, özel kod çözücüleri ve günlük kaydını yapılandırabilirsiniz. Varsayılan olarak Coil, hazır bir bağlantı havuzuyla OkHttp kullanır.

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

Sıkça Sorulan Sorular

Coil nedir ve ne için kullanılır?

Coil, Kotlin ile coroutine'ler kullanılarak yazılmış Android için bir görsel yükleme kütüphanesidir. Ağ, kaynaklar veya dosya sisteminden bitmap görsellerinin asenkron olarak yüklenmesi, önbelleğe alınması ve görüntülenmesi için kullanılır.

Coil, Glide'dan nasıl farklıdır?

Coil %100 Kotlin ile yazılmıştır ve Glide'daki geri arama mekanizması yerine coroutine'ler kullanır. Coil daha küçük APK boyutuna (~150 KB vs ~500 KB) ve AsyncImage aracılığıyla Jetpack Compose için yerel desteğe sahiptir.

Bir Kotlin projesine Coil nasıl eklenir?

build.gradle.kts dosyasına io.coil-kt:coil:2.6.0 bağımlılığını ekleyin. Jetpack Compose için ayrıca io.coil-kt:coil-compose:2.6.0 ekleyin. Kütüphane, ContentProvider aracılığıyla otomatik olarak bir ImageLoader kaydeder.

Coil hangi görsel türlerini destekler?

Coil, JPEG, PNG, WebP, BMP, SVG (coil-svg modülü aracılığıyla) ve GIF'i (coil-gif modülü aracılığıyla) destekler. AVIF ve HEIF biçimleri, Android 10+ cihazlarda özel bir kod çözücü aracılığıyla desteklenir.

Coil'de önbellek nasıl yapılandırılır?

Önbellek, ImageLoader.Builder aracılığıyla yapılandırılır: memoryCache heap yüzdesiyle, diskCache yol ve bayt cinsinden sınırla. Önbellek politikaları (ENABLED, DISABLED, READ_ONLY), CachePolicy aracılığıyla istek başına yapılandırılır.

Özet

  • Coil, tam coroutine ve Jetpack Compose desteğine sahip Kotlin için bir görsel yükleme kütüphanesidir.
  • ImageLoader, iki önbellek seviyesi kullanarak istekleri, önbelleğe almayı ve dönüşümleri yönetir: Memory Cache ve Disk Cache.
  • AsyncImage ve SubcomposeAsyncImage, placeholder, error ve success durumlarını destekleyen Compose entegrasyonu sağlar.
  • APK Boyutu ~150 KB, Coil'i pazardaki en kompakt görsel yükleme kütüphanelerinden biri yapar.
  • Dönüşümler (RoundedCorners, CircleCrop, Blur) kütüphaneye dahildir ve donanım hızlandırmasıyla çalışır.
  • Disk Cache, yapılandırılabilir depolama sınırıyla önceden yüklenmiş görsellere çevrimdışı erişim sağlar.
  • Coil, Google tarafından önerilmektedir resmi Jetpack Compose kılavuzlarında, modern standart statüsünü teyit eder.

Anahtar teslim bir mobil uygulama geliştireceğiz

IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.

Projeyi tartış

Ayrıca okuyun