Разбор 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.