Разбор xmlns и префиксов в AndroidManifest.xml
В самом начале: строка xmlns:android="http://schemas.android.com/apk/res/android" — это объявление XML‑пространства имён, не ссылка на веб‑ресурс. Она связывает префикс android: с набором системных атрибутов Android, которые понимают инструменты сборки и платформа.
Что означает xmlns:android и как это работает
xmlns:android объявляет namespace (уникальное имя) для атрибутов с префиксом android:. URL в кавычках — просто идентификатор: инструменты (aapt/aapt2, Gradle, Android Studio) знают, что атрибуты android: относятся к системному SDK. Система не делает HTTP‑запрос — все определения и допустимые атрибуты «зашиты» в SDK и сборочных инструментах.
Практические последствия:
- android:label, android:icon, android:name и т. п. — системные параметры.
- Нельзя определять свои атрибуты в пространстве android: — создавайте отдельный namespace.
- Удаление или изменение xmlns:android приведёт к ошибкам парсинга/сборки.
Другие пространства имён: tools, app (res-auto) и кастомные
Помимо android: часто встречаются:
-
xmlns:tools="http://schemas.android.com/tools"
Используется на этапе сборки/анализе (lint, manifest merge). Примеры: tools:replace, tools:ignore, tools:node. Эти атрибуты не применяются в рантайме (их удаляет процесс сборки). -
xmlns:app="http://schemas.android.com/apk/res-auto"
Для атрибутов библиотек и кастомных view (например, Material Components). res-auto говорит Gradle выбрать правильное пространство имён на основе подключённых артефактов.
Совет:
Если создаёте собственную библиотеку с кастомными атрибутами — объявляйте xmlns:app="http://schemas.android.com/apk/res-auto" и регистрируйте атрибуты в attrs.xml. Не пытайтесь добавить кастомные атрибуты в android:.
Как читать манифест внутри APK и что важно учитывать
При декомпиляции APK (apktool, aapt, jadx) вы видите итоговый, замёрдженный манифест. Что учитывать:
- Любой атрибут с префиксом android: — из системного namespace.
- tools:‑атрибуты обычно исчезают из финального APK (они для сборки).
- app: или другие префиксы указывают на атрибуты библиотек/ресурсов — ищите их определения в attrs.xml соответствующей библиотеки.
- Мерж манифестов может добавлять/перезаписывать атрибуты; tools:replace/ tools:node помогают управлять этим на этапе сборки.
Полезные правила и частые ошибки
- Не менять строку http://schemas.android.com/apk/res/android — это не URL, а идентификатор namespace.
- Не убирать xmlns:android — без него парсер не распознает android:‑атрибуты.
- Не пытаться создавать свои android:XXX атрибуты — используйте res-auto и attrs.xml.
- При проблемах с мержем используйте tools:replace/ tools:node в исходном манифесте модуля.
Удаление или изменение namespace приведёт к ошибкам сборки или к тому, что атрибуты перестанут интерпретироваться корректно.
Частые ошибки
- Ошибка: "Error: No resource found for attribute ..." — обычно означает, что вы использовали атрибут из библиотеки, но не подключили её или неправильно указали xmlns:app.
- Ошибка при мержe манифестов — конфликтующие атрибуты требуют tools:replace или явного разрешения в модулях.
- Попытка использовать android: для кастомного атрибута — приведёт к недоступности атрибута или ошибке компиляции.
FAQ
-
Нужно ли менять http://schemas.android.com/apk/res/android?
Нет — это стандартный идентификатор namespace, менять нельзя. -
Можно ли добавить свои атрибуты с префиксом android:?
Нет — пространство android: контролируется платформой. Используйте xmlns:app=".../res-auto" и attrs.xml. -
Почему в layout и в манифесте одинаковый URL?
Потому что во всех XML‑ресурсах Android используется одно и то же системное пространство имён для android:‑атрибутов — так инструменты одинаково интерпретируют их везде.
Эти правила и практики достаточно, чтобы уверенно читать AndroidManifest.xml, понимать назначения строк вроде schemas.android.com/apk/res/android и безопасно править манифесты в проектах и при разборе APK.