Невозможно разрешить библиотеку плейсхолдера: как исправить ошибку сборки

Ошибка «невозможно разрешить библиотеку плейсхолдера» (в англоязычном интерфейсе Android Studio она обычно звучит как «Unable to resolve placeholder library» или «Failed to resolve…») возникает на этапе синхронизации Gradle и означает, что система сборки не смогла найти или подставить зависимость, указанную в конфигурации проекта. Чаще всего первый признак — красная строка в окне Build и остановка синхронизации сразу после открытия проекта или добавления новой библиотеки.

Проблема почти всегда связана не с кодом приложения, а с конфигурацией: файлом build.gradle, настройками репозиториев, версией плагина Android Gradle Plugin или плейсхолдерами манифеста (manifest placeholders), которые подставляются в AndroidManifest.xml во время сборки. Ниже разберём, как локализовать источник сбоя и исправить его безопасными способами.

Что означает эта ошибка на самом деле

Термин «плейсхолдер» в контексте сборки Android-проекта имеет два значения, и важно понять, о каком из них идёт речь в вашем случае. Первое — плейсхолдер зависимости: когда в блоке dependencies указана библиотека, которую Gradle не может найти ни в одном из подключённых репозиториев. Второе — плейсхолдер манифеста: переменная вида ${имя} в AndroidManifest.xml, значение которой должно быть задано через manifestPlaceholders в build.gradle.

Быстрая проверка: откройте полный текст ошибки в окне Build или на вкладке Problems. Если в сообщении фигурирует координата вида group:artifact:version — проблема в зависимости. Если упоминается AndroidManifest.xml и имя переменной — ищите незаданный плейсхолдер манифеста.

Типичные причины сбоя

Прежде чем что-то менять, полезно понять, какие ситуации приводят к такой ошибке чаще всего. Это сократит круг проверок.

  • 🔍 Опечатка в координатах библиотеки — неверное имя группы, артефакта или несуществующая версия в блоке dependencies.
  • 🌐 Отсутствует нужный репозиторий — библиотека опубликована, например, в Maven Central или Google Maven, но соответствующий репозиторий не объявлен в проекте.
  • 📦 Незаданный плейсхолдер манифеста — в AndroidManifest.xml используется переменная, для которой не указано значение в manifestPlaceholders.
  • 🔌 Нет доступа к сети или повреждён кэш Gradle — зависимость не может быть скачана, а локальная копия отсутствует или испорчена.
  • ⚙️ Несовместимость версий — устаревший плагин Android Gradle Plugin или версия Gradle не поддерживает синтаксис конфигурации.
⚠️ Внимание: не удаляйте строки из build.gradle «наугад», чтобы заставить синхронизацию пройти. Удалённая зависимость может незаметно сломать функциональность приложения, и ошибка всплывёт уже на этапе выполнения.

Шаг 1. Проверка зависимостей и репозиториев

Откройте файл build.gradle уровня модуля (обычно app) и найдите строку с библиотекой, которая указана в тексте ошибки. Сверьте координаты с официальной документацией библиотеки: имя группы, артефакта и номер версии должны совпадать символ в символ. Обратите внимание на регистр букв и дефисы — система координат Maven чувствительна к ним.

Затем проверьте, объявлены ли репозитории, в которых опубликована библиотека. В зависимости от версии проекта список репозиториев находится либо в build.gradle уровня проекта, либо в файле settings.gradle в блоке dependencyResolutionManagement. Типичная конфигурация выглядит так:

repositories {

google()

mavenCentral()

}

Если библиотека распространяется через собственный репозиторий разработчика, его адрес нужно добавить в этот список — точный URL берите только из официальной документации конкретной библиотеки.

☑️ Проверка зависимостей

Выполнено: 0 / 5

Шаг 2. Проверка плейсхолдеров манифеста

Если ошибка указывает на AndroidManifest.xml, откройте файл и найдите все вхождения конструкции ${...}. Каждая такая переменная должна получать значение при сборке. Значения задаются в build.gradle модуля внутри блока defaultConfig или конкретного buildType:

android {

defaultConfig {

manifestPlaceholders = [appLabel: "MyApp"]

}

}

Частый сценарий: библиотека, которую вы подключили, содержит в собственном манифесте плейсхолдер (например, ключ API или имя приложения), а её документация требует задать значение в вашем проекте. Если значение не задано, инструмент слияния манифестов (manifest merger) завершается с ошибкой. Решение — добавить соответствующий ключ в manifestPlaceholders, следуя инструкции именно вашей библиотеки.

📊 Где именно возникла ошибка у вас?
При синхронизации Gradle
При слиянии манифестов (manifest merger)
После обновления Android Studio
После добавления новой библиотеки

Шаг 3. Очистка кэша и повторная синхронизация

Повреждённый кэш — нетривиальная, но реальная причина: Gradle хранит скачанные зависимости локально, и если загрузка оборвалась, система может считать библиотеку «отсутствующей», даже когда всё настроено верно. Вам нужно выполнить очистку через меню File → Invalidate Caches… в Android Studio и перезапустить IDE.

Если это не помогло, попробуйте пересобрать проект из терминала, чтобы увидеть полный и нефильтрованный вывод:

gradlew clean build --refresh-dependencies

Флаг --refresh-dependencies заставляет Gradle заново проверить и скачать зависимости, игнорируя закэшированные данные. Команда выполняется из корневой папки проекта; в Windows вместо gradlew используется gradlew.bat.

⚠️ Внимание: очистка кэша и повторная загрузка зависимостей требуют стабильного интернет-соединения. Если вы работаете через корпоративный прокси или VPN, убедитесь, что Gradle настроен на его использование — иначе скачивание снова завершится неудачей.

Сравнение типовых сценариев ошибки

Таблица ниже поможет быстро сопоставить симптом с вероятной причиной и первым действием.

Фрагмент текста ошибки Вероятная причина Первое действие
Failed to resolve: group:artifact:version Опечатка в координатах или отсутствует репозиторий Сверить координаты с документацией библиотеки
Attribute ... requires a placeholder substitution Незаданный плейсхолдер манифеста Добавить значение в manifestPlaceholders
Could not GET / Could not HEAD Нет сети, прокси или репозиторий недоступен Проверить интернет и настройки прокси Gradle
Unsupported / incompatible Gradle version Несовместимость версий Gradle и плагина Сверить версии с таблицей совместимости в официальной документации

Когда проблема в версиях Gradle и плагина

После обновления Android Studio среда может предложить обновить и Android Gradle Plugin, однако не каждая версия плагина совместима с каждой версией Gradle. Несоответствие проявляется именно ошибками разрешения конфигурации. Версия Gradle задаётся в файле gradle/wrapper/gradle-wrapper.properties, версия плагина — в build.gradle уровня проекта или в каталоге версий libs.versions.toml.

Как действовать аккуратно: не повышайте версии вслепую. Откройте официальную таблицу совместимости Android Gradle Plugin и Gradle на сайте документации Android и приведите обе версии в соответствие с ней. Если проект старый и обновление невозможно, иногда разумнее откатить версию плагина до той, с которой проект собирался ранее.

Что делать, если проект чужой или унаследованный

Начните с поиска файла README или документации в репозитории — там часто указаны требуемые версии JDK, Gradle и плагина. Проверьте, какая версия JDK выбрана в настройках Android Studio (Settings → Build, Execution, Deployment → Build Tools → Gradle): несовместимая версия Java тоже вызывает сбои конфигурации. Если в проекте есть CI-конфигурация (GitHub Actions, GitLab CI), посмотрите в ней — там обычно зафиксировано рабочее окружение сборки.

Если ничего не помогло

Когда стандартные шаги исчерпаны, остаётся несколько безопасных вариантов. Первый — создать новый пустой проект в Android Studio и перенести в него конфигурацию по частям: так вы найдёте строку, которая ломает сборку, методом исключения. Второй — сравнить ваши файлы build.gradle и settings.gradle с эталонным рабочим проектом той же команды или с шаблоном, который генерирует актуальная версия IDE.

Третий вариант — изучить полный стек ошибки с расширенным логированием:

gradlew build --stacktrace

Вывод будет длинным, но именно в нём видно, какой именно файл и какая строка конфигурации вызвали сбой. Копируйте текст ошибки целиком, а не только первую строку — решающая информация почти всегда находится в блоке «Caused by» ниже по тексту.

⚠️ Внимание: избегайте советов из сети вроде «добавьте эту строку в gradle.properties» или «отключите проверку зависимостей», если вы не понимаете, что делает параметр. Обходные пути могут скрыть ошибку, но вернуться в виде сбоев уже в готовом приложении.

Часто задаваемые вопросы

Ошибка появилась сразу после добавления новой библиотеки. Что проверить в первую очередь?

Сверьте координаты зависимости с официальной документацией библиотеки и убедитесь, что нужный репозиторий объявлен в проекте. Также проверьте, не требует ли библиотека задать плейсхолдер манифеста или дополнительные параметры в build.gradle.

Синхронизация проходит, но ошибка возникает при сборке APK. Почему?

Это характерно для проблем слияния манифестов: плейсхолдер подставляется на этапе сборки, а не синхронизации. Откройте полный лог сборки и найдите упоминание AndroidManifest.xml и имени незаданной переменной.

Поможет ли переустановка Android Studio?

Практически никогда: ошибка находится в конфигурации проекта или кэше Gradle, а не в самой IDE. Переустановка лишь удалит настройки, не устранив причину. Начните с очистки кэша и проверки файлов build.gradle.

Может ли ошибка быть вызвана отсутствием интернета?

Да, если зависимость ещё не скачана в локальный кэш. Gradle не сможет её разрешить без сети. Проверьте подключение и настройки прокси, затем выполните синхронизацию повторно.

Где искать точный текст ошибки, если окно Build показывает мало информации?

Запустите сборку из терминала командой gradlew build --stacktrace из корня проекта. Консольный вывод содержит полную цепочку причин, включая блоки «Caused by», которых нет в сокращённом отображении IDE.