What is binary xml file in android

Android Binary XML FormatВ¶

Android uses a special format to save XML and resource files. Also resource files are XML files in the source folder, but all resources are packed into a single resource file called resources.arsc . The underlying format is chunk based and is capable for storing several different information.

The most common AXML file is the AndroidManifest.xml . This file must be part of every APK, and contains the meta-information about the package.

Androguard is capable of decoding such files and two different tools exists for decoding:

androguard arsc for decoding resources.arsc .

androguard axml for decoding AndroidManifest.xml and all other XML files

Decode the AndroidManifest.xmlВ¶

Let’s use one of the example files provided by androguard. To decode the AndroidManifest.xml of an APK file, simply give androguard axml the APK file as an argument:

The output will look like this:

You can check with the original, uncompiled, XML file, which can be found here:

The original file will print:

Note, that the overall structure is equal but there are certain differences.

Resource labels are hex numbers in the decompiled version but strings in the original one

Newlines and whitespaces are different.

Due to the compilation, this information is lost. But it does not matter, as the structure of the Manifest does not matter. To get some information about the resource IDs, we need information from the resources.arsc .

Читайте также:  Как посмотреть какая версия android

To retrive information about a single ID, simply run the following:

You can see, that the ID 7F040001 was successfully resolved to the same string from the source file. To understand how Android handles resource configurations, you should read HandlingResources.

Decode any other XML fileВ¶

Also layout files or other XML files provided with the APK are compiled. To decompile them, just give the path inside the APK as an argument, or specify the binary XML file directly:

Decode information from the resources.arscВ¶

To get XML resource files out of the binary resources.arsc , use androguard arsc .

For example, get all string resources of an APK:

will give the following output:

You can also list all resource types:

Working with AXML and Resource files from pythonВ¶

To load an AXML file, for example the AndroidManifest.xml , use the AXMLPrinter :

In order to use resources, you need the ARSCParser :

© Copyright 2012-2018, Anthony Desnos, Geoffroy Gueguen, Sebastian Bachmann Revision eef97351 .

Источник

Полноценная бинарная замена XML

В чем прелесть XML? Он реализован под все платформы, «человекочитаемый», для него созданы схемы данных (условно человекочитаемые). Открывая 25-мегабайтный файл в браузере сразу замечаешь недостатки этого текстового формата, и начинаешь задумываться. Делаем мы это, конечно, не часто, но все же — чем бы заменить XML?

Добавление самопальных бинарных контейнеров в проект заканчивается провалом, когда к вам приходят партнеры и просят подключить их к этому каналу данных. Google Protobuf поначалу выглядит хорошо, но вскоре понимаешь, что это не замена для XML, не хватает функциональности. BSON в 5 раз медленнее Protobuf, уступает в компактности и для него не реализованы схемы данных.

Разработаем же еще один бинарный формат.

USDS 1.0

USDS (или $S) — Universal serialized data structures — универсальные сериализованные структуры данных, бинарный формат, способный полностью заменить XML и JSON. Основные отличия:

  • Вместо текстовых тегов/ключей используются целые числа. Соотношение «Имя» — «Целочисленный идентификатор» задается отдельно, в «Словаре». Словарь может быть прикреплен к документу USDS или может быть передан отдельно.
  • Нет закрывающих тегов, как в XML;
  • Документы USDS формируются строго по схеме, которая также задается в Словаре. Поддерживаются полиморфизм и опциональные поля.
  • Числовые значения в документе USDS хранятся в бинарном виде (не как текст).
Читайте также:  Как сделать дозвон андроид

Допустим, мы задокументировали этот формат и создали первую версию библиотеки для работы с ним. Есть ли профит? Бенчмарк расставит все по своим местам:

Что-то в этом уже есть, хотя работы еще не мало: Basic Parser всегда будет уступать Google Protobuf, но не на столько же.

Пример использования

Хоть формат и бинарный, использовать его не сложнее, чем XML. Посмотрим, как это будет выглядеть на С++ (а в далеком светлом будущем и на других языках).

Шаг 1: составляем Словарь

Как было сказано выше, документ USDS строится только по схеме, которая может выглядеть так:

Все правила построения схемы можно посмотреть здесь. Библиотека USDS Basic Parser пока что поддерживает далеко не все элементы схемы, но пример выше — рабочий. Сохраняем схему в текстовый файл, или вставляем прямо в исходный код, что дальше?

Шаг 2: инициализируем парсер:

Так или иначе, схема данных оказалась в массиве «text_dictionary», скормим его парсеру:

Парсер готов генерировать бинарные USDS документы. Если вам необходимо только декодировать бинарники, то инициализация словарем не требуется: парсер автоматически вытащит словарь прямо из бинарного документа USDS.

Шаг 3: создаем бинарный документ:

Алгоритм ничем не отличается от работы с любым другим DOM-парсером: добавляем несколько корневых объектов, инициализируем их значениями, генерируем выходной массив данных.

Особенности работы с массивами опущены, вы можете посмотреть их отдельно, скачав исходный код примера.

Шаг 4: декодирование бинарного документа:

Для чистоты эксперимента создадим отдельный объект парсера, не будем его инициализировать словарем и посмотрим, разберет ли он наш бинарный документ:

Обратите внимание, что «Сервер» заранее ничего не знает о схеме данных, но спокойно получил бинарник, нашел в нем поля по их текстовым именам и корректно преобразовал их в значения переменных С++. Именно эта функция недоступна в Google Protobuf и ASN.1.

Читайте также:  Megafon tv apk для android tv

Вы можете существенно ускорить программу, если будете инициализировать поля по их числовым идентификаторам (ID, совпадают с теми, что указаны в Словаре), смотрите исходный код примера.

Человекочитаемость

Это действительно очень важная функция: вы не можете прочитать посторонний бинарный пакет Google Protobuf или ASN.1 (кроме XER), а иногда очень хочется. При использовании BSON можно преобразовать любой пакет данных в JSON, что уже неплохо. Не отстает от него и USDS:

Сервер не только получил произвольный бинарный документ, но и смог преобразовать его в JSON. Ту же операцию можно было выполнить и на стороне «Клиента»: сформировать DOM-объект и сразу преобразовать его в JSON, который также строго соответствует схеме данных.

В планы разработки USDS заложен редактор документов USDS с полноценным GUI. В ближайшем будущем в USDS Basic Parser будет реализована конвертация между XML, JSON и USDS в любом направлении.

Заключение

Зачем я опубликовал сырой продукт (Pre-Alpha), который настоятельно не рекомендуется использовать в проектах? Мне важен ваш отклик:

  • чего не хватает в продукте?
  • нужен ли он вообще?
  • понятно ли написана документация и исходный код?

Отвечу в комментариях на любые вопросы.

Страница проекта: USDS 1.0
Скачать библиотеку и исходный код примера можно здесь.
Исходный код библиотеки доступен здесь.

Источник

Оцените статью