abx, abx2xml, xml2abx Конвертор XML в бинарный и обратно Тип файла: приложение usage: abx2xml [-i] input [output] Комментарии Формат файла ABX представляет собой двоичную сериализацию данных XML (или, скорее, подмножество XML: некоторые функции XML, такие как пространства имен, не поддерживаются). Это позволяет хранить XML-документ в двоичном формате, который является более компактным и более быстрым для чтения (примерно в 2,4 раза меньше размер файла и в 4,3 раза быстрее чтение в соответствии с собственными тестами Google). Файл начинается с подписи файла «ABX\0», закодированной как ASCII. Согласно исходному коду, символ nul (0x00) в конце подписи представляет собой версию формата файла, которая может измениться в будущем при обновлении формата. Файл кодируется как последовательность «событий» XML, которые описывают документ при чтении по порядку. Это основано на идее «вытягивающего синтаксического анализатора» (https://developer.android.com/reference/org/xmlpull/v1/XmlPullParser), который концептуально будет представлять документ на рисунке 2 как: • Начало документа • Начало тега : имя «корень» • Начало тега : имя — «myElement»; у него есть 1 атрибут с именем "anAttribute" со значением "значение атрибута" • Текст : «Содержимое первого myElement» • Окончания тегов : имя «myElement» • Начало тега : имя — «myElement»; у него есть 1 атрибут под названием "anAttribute" со значением "еще несколько данных атрибута" • Текст : «Содержимое второго элемента myElement» • Окончания тегов : имя «myElement» • Концы тегов : имя «корень» • Окончание документа Формат ABX «интернирует» имена элементов, имена атрибутов и, возможно, значения атрибутов. Это означает, что текстовые данные, которые представляют эти значения, будут записаны в сам файл только один раз, и впоследствии, если они должны быть снова записаны в файл, вместо этого они будут ссылаться на идентификатор в таблице поиска. Вы можете увидеть пример подтверждения такого поведения на рис. 3, где строка «myElement» появляется только один раз, несмотря на наличие четырех тегов с таким именем в исходных данных — каждое последующее использование этого текста «интернировано». Формат также допускает использование строго типизированных значений атрибутов. В «ванильном» XML все данные в атрибуте являются текстовыми, но ABX позволяет программисту изначально хранить числа, двоичные данные и логические значения, так что, например, число с плавающей запятой может быть сохранено в данных как значение IEEE 754, а не как текст, целое число может быть сохранено как значение с дополнением до двух, а не как текст, и так далее. Использование собственных форматов данных для строго типизированных данных является важной особенностью, которую следует отметить, поскольку это может означать, что числовые идентификаторы (например, идентификаторы пользователей), которые ранее реагировали на текстовый поиск, больше не будут обеспечивать совпадения, когда XML-файл мигрировал на использование ABX. Формат начинается с подписи 0x41425800 (ABX\0), за которой затем следует один или несколько «токенов», которые состоят из байта типа токена, за которым следуют данные, закодированные на основе типа, определенного байтом типа. Байт типа содержит две части информации. Младшие 4 бита (младший полубайт) задают тип XML-события для этого токена, старшие 4 бита (старший полубайт) задают тип данных для данных токена. Всем данным, записанным как STRING_INTERNED в файле, присваивается идентификатор; первый назначенный идентификатор будет равен 0, а каждый последующий идентификатор будет увеличиваться на 1. Каждый раз, когда записывается интернированная строка, сначала устанавливается, была ли она ранее записана в файл; если строка была записана ранее, то ее идентификатор записывается в данные как беззнаковое 16-битное целое число; если эта строка записывается впервые, то в данные записывается максимальное 1 6-битное целое число (0xFFFF), за которым следует длина строки в байтах в виде 16-битного целого числа, за которым следует столько же байтов данных в кодировке UTF-8; новой строке будет присвоен следующий доступный идентификатор. Можно интернировать не более 65534 (0xFFFE) строк. Все строки после этой точки будут сохранены, как если бы они были записаны впервые, даже при повторной записи. Для всех типов токенов, кроме типа ATTRIBUTE, данные типа, определенного типом данных, следуют непосредственно после байта типа. В ATTRIBUTE интернированная строка (и это всегда интернированная строка, независимо от байта типа) следует за байтом типа, который является именем атрибута, за которым следует значение, закодированное в соответствии с байтом типа. В Android 12 есть утилиты для преобразования ABX, которые являются обертками к Java-утилите: $ cat /system/bin/abx2xml #!/system/bin/sh export CLASSPATH=/system/framework/abx.jar exec app_process /system/bin com.android.commands.abx.Abx "$0" "$@" $ cat /system/bin/xml2abx #!/system/bin/sh export CLASSPATH=/system/framework/abx.jar exec app_process /system/bin com.android.commands.abx.Abx "$0" "$@" Например: $ abx2xml settings_config.xml settings_config.xml.unabx $ xml2abx settings_config.xml.unabx settings_config.xml.reabx $ abx2xml settings_config.xml.reabx settings_config.xml.todiff К сожалению, settings_config.xml.reabx не совпадает с settings_config.xml. Сравнение выходных данных утилиты UNIX «strings» показывает строку «true3» в каждой настройке в файле .reabx, которой не было в оригинале. Что еще более странно, .unabx не был идентичен .todiff. Но это сделало их идентичными (на обычной машине с Linux): $ dos2unix settings_config.xml.unabx ABX конвертировался в текстовый файл с CR-LF в первый раз, а во второй только с LF |