schemas.android.com/apk/res/android: что это за строка в AndroidManifest.xml

Строка xmlns:android="http://schemas.android.com/apk/res/android" появляется в каждом файле AndroidManifest.xml и в большинстве XML-разметок Android-приложений, и при её отсутствии или опечатке сборка проекта падает с ошибкой парсинга ресурсов. Начинающие разработчики часто копируют её вслепую, не понимая назначения, а при редактировании манифеста вручную — случайно удаляют или искажают, после чего IDE подсвечивает каждый атрибут android: как неизвестный.

Разберёмся, что скрывается за этим URI, почему он не является ссылкой на реальный сайт, какие ошибки возникают при неправильном объявлении пространства имён и как их исправить. Материал будет полезен тем, кто редактирует манифест вручную, разбирает чужой APK или изучает структуру Android-проекта.

Что такое пространство имён XML

XML-документы в Android собираются из элементов и атрибутов, определённых разными источниками. Чтобы парсер понимал, какому словарю принадлежит тот или иной атрибут, используется механизм пространств имён (namespaces). Директива xmlns:android объявляет префикс android и привязывает его к уникальному идентификатору URI.

Когда в манифесте встречается атрибут вроде android:name или android:versionCode, система сборки понимает: это атрибут из стандартного словаря фреймворка Android, а не пользовательское имя. Без объявленного префикса компилятор ресурсов aapt2 не сможет сопоставить атрибут с известным ему списком и выдаст ошибку.

Важный нюанс: сам URI http://schemas.android.com/apk/res/android — это идентификатор, а не веб-адрес. Переход по нему в браузере ничего не загрузит, и для работы приложения интернет-доступ к этому адресу не требуется. Строка служит лишь уникальной меткой, гарантированно не пересекающейся с другими словарями.

Зачем нужен именно такой URI

Формат идентификатора выбран по соглашению XML: в качестве пространства имён принято использовать URL-подобные строки на домене владельца технологии. Google как разработчик платформы закрепил за системными атрибутами адрес на домене schemas.android.com. Это гарантирует уникальность: никакая сторонняя библиотека не должна использовать чужой домен для своих словарей.

  • 📌 Уникальность — идентификатор привязан к домену, контролируемому разработчиком платформы.
  • 📌 Разделение словарей — системные атрибуты не смешиваются с пользовательскими и библиотечными.
  • 📌 Проверка на этапе сборки — aapt2 сверяет атрибуты с известным списком фреймворка.
  • 📌 Расширяемость — свои библиотеки могут объявлять собственные пространства имён.

Обратите внимание: протокол в идентификаторе — именно http, а не https. Замена на защищённый вариант изменит строку, и парсер перестанет распознавать атрибуты. Это одна из частых причин загадочных ошибок после «улучшения» манифеста вручную.

Где встречается это объявление

Чаще всего строка стоит в корневом элементе <manifest> файла AndroidManifest.xml. Но то же пространство имён объявляется и в ресурсных XML: макетах экранов (res/layout), файлах res/values, анимациях, drawable-описаниях. Везде, где используются атрибуты вида android:layout_width или android:text, требуется объявление префикса.

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

package="com.example.app">

<application

android:label="@string/app_name"

android:theme="@style/AppTheme">

</application>

</manifest>

В макетах объявление обычно ставится на корневом контейнере:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="match_parent"

android:layout_height="match_parent">

</LinearLayout>

Объявление действует в пределах элемента, где оно указано, и всех его потомков. Поэтому достаточно один раз объявить префикс на корневом узле — дочерние элементы унаследуют его автоматически.

📊 Как часто вы редактируете AndroidManifest.xml вручную?
Регулярно, по работе
Только когда требует туториал
Разбираю чужие APK из интереса
Никогда, всё генерирует IDE

Другие пространства имён в Android-проекте

Помимо системного словаря, в типичном проекте встречаются и другие префиксы. Самый известный — xmlns:app="http://schemas.android.com/apk/res-auto", который подключает атрибуты библиотек, включённых в проект. Суффикс res-auto указывает сборщику искать определения атрибутов среди ресурсов подключённых зависимостей, а не только в самом фреймворке.

Также существует xmlns:tools="http://schemas.android.com/tools" — словарь служебных атрибутов, которые видит только Android Studio во время разработки. В собранный APK они не попадают: например, tools:context помогает IDE показывать предпросмотр макета, но на устройстве никак не используется.

ПрефиксURIНазначение
androidschemas.android.com/apk/res/androidСистемные атрибуты фреймворка
appschemas.android.com/apk/res-autoАтрибуты библиотек из зависимостей
toolsschemas.android.com/toolsСлужебные атрибуты для IDE

Типичные ошибки и их причины

Самая распространённая проблема — сообщение об ошибке вида «unbound prefix» или подсветка всех атрибутов android: красным. Это означает, что префикс используется, но нигде не объявлен: либо строку xmlns:android удалили, либо элемент с атрибутом оказался вне области действия объявления.

Вторая группа ошибок связана с опечатками в самом URI. Пропущенный слэш, лишний пробел, замена http на https, кириллическая буква вместо латинской — любое отклонение превращает идентификатор в неизвестный. Компилятор при этом может выдавать невразумительные сообщения вроде «attribute not found», что сбивает с толку.

  • 🔍 Проверьте, что объявление стоит на корневом элементе файла.
  • 🔍 Сверьте URI посимвольно с образцом из рабочего проекта.
  • 🔍 Убедитесь, что нет невидимых символов при копировании из браузера или мессенджера.
  • 🔍 Проверьте, что файл сохранён в кодировке UTF-8 без BOM-артефактов.
⚠️ Внимание: при копировании XML-фрагментов из веб-страниц и PDF-документов в текст часто подмешиваются типографские кавычки вместо прямых и неразрывные пробелы. Такой файл визуально выглядит корректно, но парсер его отвергает. Если ошибка не находится, наберите строку объявления вручную.

☑️ Диагностика ошибки с пространством имён

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

Как исправить ошибку пошагово

Начните с самого простого: откройте проблемный XML-файл и посмотрите на его первый элемент. Если строки xmlns:android=... там нет — добавьте её как атрибут корневого тега, скопировав из заведомо рабочего файла того же проекта. Это закрывает большинство случаев.

Если объявление на месте, но ошибка остаётся, сравните URI с эталонным. Удобный приём — удалить строку целиком и набрать её заново: так вы исключите скрытые символы. После правки выполните очистку и пересборку проекта, поскольку кэшированные артефакты сборки иногда удерживают старую ошибку.

В ситуации, когда ошибка появляется только при сборке релизного варианта, а в debug всё работает, проверьте, не переопределяется ли манифест в отдельном варианте сборки (product flavors, build types) — там может лежать собственная копия файла с дефектом.

Что видно при анализе чужого APK

При обратном разборе готового приложения манифест хранится в бинарном виде, и инструменты декомпиляции восстанавливают его в читаемый XML. Восстановленный файл содержит то же объявление пространства имён — оно необходимо, чтобы разобранный манифест снова считался валидным документом.

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

⚠️ Внимание: модификация и переподпись чужих APK может нарушать условия лицензионных соглашений и законодательство. Используйте разбор исключительно для изучения собственных проектов или в рамках легального исследования безопасности.
Почему не сделали короткое имя вместо длинного URI

Стандарт XML требует, чтобы идентификатор пространства имён был глобально уникальным. Короткие имена вроде "android" или "system" неизбежно пересеклись бы между разными технологиями. URL-подобный формат на домене владельца решает эту задачу без централизованного реестра: каждый разработчик использует собственный домен, и коллизии исключены.

Частые вопросы

Нужен ли интернет, чтобы система обратилась к schemas.android.com?

Нет. URI — это просто строка-идентификатор. Ни компилятор, ни устройство не выполняют сетевых запросов по этому адресу. Приложение полностью работает офлайн.

Можно ли заменить http на https в объявлении?

Нельзя. Идентификатор сравнивается как точная строка, и замена протокола делает его другим, неизвестным системе сборки словарём. Используйте канонический вариант с http.

Чем отличается res/android от res-auto?

res/android — словарь атрибутов самой платформы Android. res-auto — специальное пространство, в котором сборщик ищет атрибуты, определённые подключёнными к проекту библиотеками.

Почему IDE подчёркивает атрибуты android: красным, хотя объявление есть?

Возможные причины: опечатка в URI, скрытые символы при копировании, устаревший кэш среды разработки или синтаксическая ошибка выше по файлу, из-за которой парсер не дошёл до объявления. Проверьте файл на валидность и выполните пересборку с очисткой кэша.

Нужно ли объявлять пространство имён в каждом XML-файле?

Да, если файл использует атрибуты с префиксом android:. Объявление не наследуется между файлами — каждый XML-документ самодостаточен и содержит собственные объявления на корневом элементе.