Введение

«Какую библиотеку загрузки изображений вы используете и почему?» — вопрос, который задают почти на каждом Android-собеседовании. И кандидат, который отвечает «ну, Glide, наверное», — сразу минус. Интервьюер ждёт не название, а понимание: что библиотека делает под капотом и чем отличаются варианты.

Загрузка картинки по URL — на первый взгляд тривиальная задача: скачал байты, показал в ImageView. Но в реальном проекте за ней тянется целый список проблем: кэширование в памяти и на диске, сжатие и ресайз под размер View, обработка списков, где картинок сотни, а сеть медленная. Именно это решают библиотеки — Glide, Picasso и Coil.

Вопрос «Glide или Coil?» — это ещё и вопрос эпох: Glide — проверенный временем стандарт, Coil — Kotlin-first новичок, который пришёл с Compose, а Picasso — легенда, которую официально заархивировали. Разберём каждую по фактам.

Что проверяет интервьюер

Вопрос про загрузку изображений проверяет широту кругозора: знаете ли вы, чем библиотеки отличаются архитектурно (Kotlin-first, корутины, Compose), следите ли за статусом инструментов и понимаете ли, зачем вообще нужны кэш и ресайз. Названия библиотек знают все, причины — немногие.

Зачем нужна библиотека

Наивный способ загрузки картинки — URL.openStream() в потоке и BitmapFactory.decodeStream(). Он работает ровно до первого реального экрана: сетевой вызов на главном потоке, нет кэша, нет обработки поворотов камеры, нет учета размера экрана. Отсюда и задачи, которые решают все три библиотеки:

  • Сеть: скачивание в фоне, правильный Content-Type, обработка ошибок и отмен.
  • Память и диск: двухуровневый кэш, чтобы одна и та же картинка не скачивалась и не декодировалась повторно.
  • Ресайз: даунсемплинг (уменьшение разрешения) под размер View, а не декодирование гигантского bitmap целиком.
  • Жизненный цикл: отмена запросов, когда View уходит с экрана или Activity уничтожается.
  • Форматы: GIF, видео-кадры, SVG — не из коробки везде.

Все три библиотеки закрывают эти пункты, но с разной философией. Glide, по словам его создателей, — «фреймворк управления медиа и загрузки изображений для Android», с фокусом на плавный скролл списков. Coil — «библиотека загрузки изображений для Android и Compose Multiplatform», спроектированная вокруг Kotlin. Picasso — «мощная библиотека скачивания и кэширования изображений», которая в 2020-х осталась позади.

Типичная ошибка на собеседовании: кандидат перечисляет названия, но не может объяснить, что делает библиотека «под капотом». Запомните четыре слова: сеть, кэш, ресайз, жизненный цикл. Если вы озвучите их и поясните каждое — ответ уже на уровне выше среднего.

Glide: стандарт индустрии

Glide от команды bumptech (сейчас развивается при участии Google) — самая распространённая библиотека загрузки изображений в Android. На странице проекта она описана как «быстрый и эффективный фреймворк управления медиа и загрузки изображений, который оборачивает декодирование, кэширование в памяти и на диске и пулинг ресурсов в простой интерфейс».

Ключевые факты, которые стоит знать:

  • Поддерживает не только статичные картинки, но и анимированные GIF и кадры видео.
  • Сетевой стек подключаемый: по умолчанию свой на HttpUrlConnection, но есть готовые интеграции с OkHttp и Volley.
  • Главный фокус — плавная прокрутка списков с изображениями: именно для этого сделаны ресайз под размер View, кэш и пулинг.
  • Лицензия — BSD (с элементами MIT и Apache 2.0), по состоянию на сегодня актуальная версия 5.x.

Базовый пример выглядит так:

GlideExample.kt
Glide.with(imageView.context)
    .load("https://example.com/photo.jpg")
    .placeholder(R.drawable.ic_placeholder)
    .error(R.drawable.ic_error)
    .centerCrop()
    .into(imageView)

Строка Glide.with(...) привязывает запрос к жизненному циклу: если переданный Activity или Fragment уничтожен, запрос отменяется. placeholder и error — заглушки на время загрузки и при сбое. centerCrop — кроп под размер ImageView, который заодно подсказывает Glide, какого размера bitmap ему нужен.

Уровня кэша

Память → диск → сеть. Glide сначала ищет картинку в памяти, затем на диске, и только потом идёт в сеть. Благодаря этому повторный показ одного URL не стоит ни одного сетевого запроса — а это главное для списков.

На собеседовании про Glide стоит сказать: «де-факто стандарт, огромное комьюнити, отлично работает со списками, но API построен вокруг Java и флуент-цепочки, что в Kotlin-проекте выглядит тяжеловато».

Coil: Kotlin-first и Compose

Coil (coil-kt/coil) — библиотека нового поколения. Её позиционирование прямо из README: «библиотека загрузки изображений для Android и Compose Multiplatform». И четыре характеристики, которые она про себя заявляет:

  • Fast: кэш в памяти и на диске, даунсемплинг, автоматическая пауза и отмена запросов.
  • Lightweight: зависит только от Kotlin, Coroutines и Okio, дружит с R8-сжатием.
  • Easy to use: API построено на возможностях Kotlin, минимум бойлерплейта.
  • Modern: Kotlin-first, интегрируется с Compose, Coroutines, Okio, OkHttp и Ktor.

Расшифровка названия — Coroutine Image Loader: вся внутренняя механика построена на корутинах, а не на собственном пуле потоков. Это не маркетинговая деталь, а архитектурное отличие от Glide.

Лицензия Coil — Apache 2.0. В версии 3.x пакеты переехали в coil3.*, а сетевой движок вынесен в отдельный модуль coil-network-okhttp — это стоит упомянуть, если пишете про него в резюме.

CoilExample.kt
// View system: одна строка вместо цепочки
imageView.load("https://example.com/photo.jpg")
CoilCompose.kt
// Compose: AsyncImage из coil-compose
AsyncImage(
    model = "https://example.com/photo.jpg",
    contentDescription = "Фото профиля",
    modifier = Modifier.size(64.dp)
)

Одно из главных преимуществ Coil — нативная работа с Compose: AsyncImage умеет перезагружать модель, отменять загрузку при выходе из композиции и корректно переживать рекомпозицию. Для проектов на Compose это решающий аргумент.

Почему это спрашивают: «Coil или Glide?» — излюбленный вопрос интервьюеров. Хороший ответ: «Coil — Kotlin-first, легче, встроен в Compose; Glide — проверенный стандарт с большим комьюнити, лучше если нужны GIF/видео-кадры из коробки и глубокие кастомные интеграции». Никто не ждёт «Coil, потому что модно».

Picasso: легенда, которую заархивировали

Picasso от Square — «мощная библиотека скачивания и кэширования изображений для Android», выпущенная в 2013 году и завоевавшая индустрию: 18+ тысяч звёзд, Apache 2.0, минималистичный API. Версия 2.8 требует Java 8 и API 21. Код выглядел так:

PicassoExample.kt
Picasso.get()
    .load("https://example.com/photo.jpg")
    .placeholder(R.drawable.ic_placeholder)
    .error(R.drawable.ic_error)
    .into(imageView)

Но история Picasso — это ещё и урок про эволюцию инструментов. На странице проекта сейчас прямо написано: библиотека deprecated, для новых проектов рекомендуется Coil, новых релизов в Maven Central не будет, а существующие версии продолжат работать без поддержки.

Урок для собеседования

Picasso — пример того, как инструмент, который был стандартом, перестаёт развиваться: Java-архитектура, собственный пул потоков, никакой нативной поддержки Compose. Упоминание статуса Picasso на собеседовании показывает, что вы следите за экосистемой, а не выучили список библиотек в 2021 году.

Если проект ещё живёт на Picasso и работает — менять его насильно не нужно, существующие версии стабильны. Но для нового кода ответ интервьюеру звучит однозначно: Picasso не выбирают, Glide или Coil — да.

Что выбрать и что отвечать

Сводка по фактам — и сразу структура ответа на собеседовании.

КритерийGlidePicassoCoil
СтатусАктивно развивается (5.x)Deprecated, без новых релизовАктивно развивается (3.x)
ЯзыкJava-ориентированный APIJava-ориентированный APIKotlin-first
ДвижокСобственный пул + подключаемый стекСобственный пул потоковКорутины + Okio
ComposeОтдельный модуль, позжеНет нативной поддержкиAsyncImage из коробки
ФорматыGIF, видео-кадры из коробкиБазовыеМодули coil-gif, coil-video, coil-svg
ЛицензияBSD (частично MIT/Apache 2.0)Apache 2.0Apache 2.0

Правильный ответ на собеседовании строится так:

  1. Зачем вообще библиотека: сеть + двухуровневый кэш + ресайз + жизненный цикл.
  2. Glide — стандарт индустрии для View system, лучший для списков и GIF, но API не Kotlin-first.
  3. Coil — Kotlin-first, на корутинах, минимум зависимостей, нативный Compose. Для нового проекта и для Compose — первый выбор.
  4. Picasso — историческая легенда, официально deprecated, не берём в новые проекты.
  5. Практика: если проект на Compose — Coil; если большой легаси на View и нужны GIF/видео — Glide.
  • Чек-лист перед собеседованием:
  • Три уровня кэша и зачем нужен даунсемплинг под размер View.
  • Отмена запросов по жизненному циклу — у Glide через with(), у Coil через корутины.
  • Coil = Coroutine Image Loader: зависимость только от Kotlin, Coroutines и Okio.
  • Статус Picasso: deprecated, Square рекомендует Coil для новых проектов.
  • Ссылки на источники: bumptech/glide, coil-kt/coil, square/picasso.

Не забывайте и про смежную тему — сетевой стек. Библиотеки изображений ходят по сети, поэтому интервьюер может свернуть к OkHttp: переиспользование соединений, кэш по HTTP-заголовкам, перехватчики. Если ответите и про это — вопрос про картинки закрыт с запасом.

Вопрос про выбор библиотеки — один из тех, где видна разница между «заучил список» и «понимаю экосистему». Кандидат уровня middle обычно не просто называет Coil, а объясняет, чем он лучше для его стека. Если такие связки тем даются с трудом — это не про память, а про системное видение, и его как раз тренируют на мок-собеседованиях. Я — Рустем Бикбулатов, senior Android-разработчик и ментор Яндекс Практикума: на разборах мы проходим именно такие связки «библиотека → сеть → архитектура».

Хотите понять, что мешает перейти на middle?

Бесплатная диагностика: разберу ваши пробелы в Kotlin, Coroutines и архитектуре и составлю план роста за 30–40 минут. Без обязательств — если менторство вам не подойдёт, честно скажу.

Итоги

Загрузка изображений — простая на первый взгляд тема, которая на собеседовании раскрывается в полноценный разговор об экосистеме: статусы библиотек, архитектурные решения, связка с Compose и сетью. Зафиксируем главное.

  • Зачем библиотеки: сеть, двухуровневый кэш, ресайз под View, отмена по жизненному циклу — четыре причины, почему руками это не пишут.
  • Glide — стандарт для View system: GIF, видео-кадры, интеграции с OkHttp, но не Kotlin-first. Coil — Kotlin-first, на корутинах, нативный Compose, три зависимости. Picasso — deprecated, для новых проектов не выбирается.
  • Ответ уровня middle: не название, а обоснованный выбор под стек проекта со ссылкой на статус и архитектуру библиотеки.

Главное

Вопрос «какую библиотеку выберете» — это вопрос про системное мышление: вы видите не название, а архитектуру, статус и место инструмента в экосистеме. Кандидат, который может обосновать выбор — уже звучит как middle.

Если темы вроде этой «знаю, но сформулировать не могу» — это типичная граница junior→middle, и её закрывают практикой объяснений. Напишите в Telegram — разберём вашу ситуацию и составим план подготовки.