Образ Android


    Образ       Файлы     GPT     Разделы     RAW  

1. Структура образа прошивки Андроид

Все устройства Sunxi (на основе SoC Allwinner) используют LiveSuit или PhoenixSuit в качестве средства программирования и обновления прошивки по умолчанию для розничных клиентов, а также Card или PhoenixUSB для прошивки при производстве устройств. Протокол и данные LiveSuit/Phoenix являются стандартом с закрытым исходным кодом, используемым многими компаниями и устройствами. Для работы с такими образами используются инструменты, описанные на странице LiveSuit images.

Для создания загрузочной карты с ОС Андроид для одноплатного компьютера OragePi Zero2 (который будет ниже обозначаться как устройство) используется утилита PhoenixCard.

С помощью этой утилиты на SD-карту записывается прошивка, содержащаяся в файле "образа прошивки", например, OrangePi Zer02 Android10 V1_1.img. Такой файл можно загрузить с сайта производителя или разобрать, как-то модифицировать и снова собрать самостоятельно.

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

На ТВ-боксах, содержащих nand-память, используется также второй вариант установки ОС - через подключение устройства по кабелю к USB-порту ПК. При этом используется тот же самый файл прошивки, поэтому его структура и содержимое должны удовлетворять особенностям обоих (точнее, даже трех) способов установки ОС. Третий способ - это запись карты в режиме "product", с которой система не стартует, но переписывается во внутреннюю nand-память устройства.

Для устройства OragePi Zero2 имеется несколько готовых образов ОС Linux в виде img-файлов, являющихся raw (т.е. необработанными) копиями загрузочного носителя. Такой img-образ переносится на загрузочный носитель простым копированием, например, с помощью утилиты diskimager.exe (под Windows) или аналогичными утилитами под Linux (а также консольной командой Linux dd).

Однако с прошивкой Android дело обстоит иначе. Здесь вместо raw-образов для программирования прошивки используются img-образы, известные также как imagewty-образы (по начальной magic-сигнатуре файла IMAGEWTY). Несмотря на расширение .img файл imagewty-образа для прошивки Android не является именно образом (image), а представляет собой архив специального формата (типа "сборная солянка"), содержащий набор файлов. Особенность такого образа заключается в том, что в комплекте с солянкой идут также и ложка с вилкой: кроме файлов, необходимых для работы системы, в таком образе присутствуют и инструменты, т.е. служебный софт, необходимый для нормального функционирования утилит программирования (записи прошивки).

Структура этого архива (файла imagewty-образа) выглядит так:

  • 1. Заголовок архива размером 96 байт, который начинается с сигнатуры (магического слова IMAGEWTY)
  • 2. Заголовки файлов (их общее количество равно 40 для нашего случая)
  • 3. Массивы данных для каждого файла (без сжатия).

    Нужно учитывать, что этот формат образа был создан достаточно давно (для более ранних моделей и версий) и должен был учитывать различные способы и инструменты программирования прошивки Allwinner (Live Suite, Phoenix Suite, Phoenix USB Pro, Phoenix Card), в том числе в условиях массового производства, поэтому в нем могут содержаться устаревшие и не используемые в конкретном случае параметры. То же самое относится и к сохраненным в архиве файлам: не все из них нужны для программирования, а некоторые из них вообще не попадают на карту (загрузочный носитель) или никак не используются.

    Заголовок образа (архива) содержит:


  • сигнатура = IMAGEWTY
  • версия заголовка = 0x300 ( версия 3)
  • размер заголовка = 96
  • RAMbase = 0x4d00000
  • версия формата = 0x100234
  • общий размер образа = 929431552 (это размер файла архива)
  • размер заголовка, включая выравнивания = 0
  • длина заголовка файла = 1024
  • USB PID = 0x1234
  • USB VID = 0x8743
  • Hard ID = 0x100
  • Firmware ID = 0x100
  • parX1 = 1
  • parX2 = 1024
  • количество файлов = 40
  • parX3 = 1024

    Примечание. Назначение и смысл параметров parX1, parX2, parX3 пока не выяснены.


    Заголовок каждого файла содержит (на примере sys_partition.fex):


  • длина имени файла = 256
  • размер заголовка = 1024
  • основной тип (maintype) = COMMON
  • подтип (subtype) = BOARD_CONFIG_BIN
  • unknown = 0
  • имя файла = sys_partition.fex
  • сохраненная длина = 5248 - это размер текстовых данных плюс нулевые байты на конце
  • выравнивание (pad 1) = 0
  • оригинальная длина = 5238 - это размер файла без завершающих нулей
  • выравнивание (pad 2) = 0
  • смещение (offset) = 0x18000

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

    Для этого мы используем специально написанную платформонезависимую программу, которая может запускаться в любом браузере и показывает содержимое архива. А также позволяет в интерактивном режиме сохранить любой выбранный файл по его имени (или все файлы архива). В принципе, эта программа может быть размещена на веб-сервере для её удаленного использования по сети, но из-за довольно большого (гигабайт) размера файла архива прошивки загрузка его достаточно долгая, поэтому более разумно иcпользовать её на локальном сервере, например, на LAMP (который может быть развернут в серверной версии Linux прямо на Opi Zero2) или на ПК под Windows.

    Кроме того, существует известная консольная утилита-распаковщик imgrepacker.exe, которая умеет делать распаковку архива в папку (с последующей упаковкой из этой папки), а также распаковку второго уровня (или слоя) для файлов boot.fex, recovery.fex и super.fex. Однако для целей детального анализа архива образа прошивки она оказалась менее удобной. Кроме того, она создает в папке ешё и свои служебные файлы, которые на самом деле в исходном архиве отсутствуют, что не дает полной картины о структуре образа.
    Например, файлы boot.fex.cfg, recovery.fex.cfg, super.fex.cfg в архиве отсутствуют, но они создаются этой утилитой при распаковке второго слоя (уровня).

    Также при распаковке утилитой imgrepacker создается служебный файл image.cfg, который представляет собой список распакованных файлов. В исходном архиве файл image.cfg отсутствует, однако он требуется утилите imgrepacker для обратной запаковки папки с файлами в архив IMAGEWTY-образа (файл .img).

    Нужно учитывать, что в случае исключения каких-то файлов из полного набора перед их упаковкой с помощью утилиты imgrepacker эти пропущенные файлы также должны быть удалены из списка в файле image.cfg, в противном случае при упаковке возникнет ошибка.

    Содержимое файла image.cfg: Файл конфигурации imgrepacker


    Итак, в архиве IMAGEWTY-образа прошивки OrangePi_Zer02_Android10_V1_1.img упаковано 40 файлов. Ниже приведен их полный список с указанием имени, размера и положения в архиве. Смещение показано в hex-виде. Чтобы проверить правильность распаковки достаточно просмотреть архив (без его распаковки) с помощью hex-редактора, найдя содержимое любого файла внутри образа по указанному смещению. Файлы лежат в архиве прошивки именно в таком порядке, как указаны в списке.


    № Имя файла ( размер - смещение )

  • 1) sys_config.fex (22543 - 0xa400)

  • 2) board.fex (1024 - 0x10000)

  • 3) config.fex (30720 - 0x10400)

  • 4) split_xxxx.fex (512 - 0x17c00)

  • 5) sys_partition.fex (5238 - 0x18000)

  • 6) sunxi.fex (129536 - 0x19800)

  • 7) boot0_nand.fex (49152 - 0x39400)

  • 8) boot0_sdcard.fex (49152 - 0x45400)

  • 9) u-boot.fex (1015808 - 0x51400)

  • 10) u-boot-crash.fex (37 - 0x149400)

  • 11) toc1.fex (8 - 0x149800)

  • 12) toc0.fex (8 - 0x149c00)

  • 13) fes1.fex (30592 - 0x14a000)

  • 14) boot_package.fex (1261568 - 0x151800)

  • 15) usbtool.fex (148480 - 0x285800)

  • 16) usbtool_crash.fex (390656 - 0x2a9c00)

  • 17) aultools.fex (166071 - 0x309400)

  • 18) aultls32.fex (151839 - 0x332000)

  • 19) cardtool.fex (73728 - 0x357400)

  • 20) cardscript.fex (1899 - 0x369400)

  • 21) sunxi_gpt.fex (8192 - 0x369c00)

  • 22) sunxi_mbr.fex (65536 - 0x36bc00)

  • 23) dlinfo.fex (16384 - 0x37bc00)

  • 24) arisc.fex (6 - 0x37fc00)

  • 25) boot-resource.fex (5876736 - 0x380000)

  • 26) Vboot-resource.fex (4 - 0x91ac00)

  • 27) env.fex (131072 - 0x91b000)

  • 28) Venv.fex (4 - 0x93b000)

  • 29) boot.fex (33554432 - 0x93b400)

  • 30) Vboot.fex (4 - 0x293b400)

  • 31) super.fex (852623532 - 0x293b800)

  • 32) Vsuper.fex (4 - 0x3565bc00)

  • 33) recovery.fex (33554432 - 0x3565c000)

  • 34) Vrecovery.fex (4 - 0x3765c000)

  • 35) vbmeta.fex (4096 - 0x3765c400)

  • 36) Vvbmeta.fex (4 - 0x3765d400)

  • 37) vbmeta_system.fex (4096 - 0x3765d800)

  • 38) Vvbmeta_system.fex (4 - 0x3765e800)

  • 39) vbmeta_vendor.fex (4096 - 0x3765ec00)

  • 40) Vvbmeta_vendor.fex (4 - 0x3765fc00)


    Эти файлы имеют разные формат и назначение. Часть из них при программировании попадает в соответствующие разделы загрузочного носителя (внешней SD-карты или встроенной nand-памяти), другие файлы являются служебными и используются прошивальщиками PhoenixCard и PhoenixSuite (или аналогичными). Кроме того, есть вспомогательные файлы, которые помешщены в архив прошивки, но при программировании вообще не используются, а нужны лишь для служебных утилит.

    Более подробно о каждом файле рассказано в следующей главе 2: Файлы

    В связи с тем, что устройство OragePi Zero2 не имеет внутренней постоянной nand-памяти, а использует внешнюю SD-карту, для него актуален лишь вариант записи образа на карту с помощью PhoenixCard в режиме "startup". Поэтому способы программирования через USB c помощью утилиты Phoenix Suite и аналогичных здесь рассматривать не будем.

    Нужно также подчеркнуть, что в данной статье не ставится целью понять и описать в деталях и подробностях стандартный способ программирования утилитой PhoenixCard, а также выяснить смысл или назначение используемых этой утилитой файлов, имеющихся в архиве прошивки. Хотя о некоторых выясненных подробностях расскажем.

    Главная задача: понять и определить, какие из этих сорока файлов обязательно нужны, а их содержимое должно попасть на загрузочный носитель (карту), если будет использоваться какой-то другой способ записи (без PhoenixCard).


    Конечная цель: создать из этих файлов загрузочный raw-образ прошивки Android, аналогичный образу Linux, который можно будет записать на карту простым копированием с помощью умеющих это делать инструментов.


    Дополнение. Эта поставленная цель достигнута. Поэтому, если нет желания или интереса читать всё остальное, то можно сразу загрузить и попробовать прошить RAW-образ Android для OpiZero2, собранный (или конвертированный) на основе стоковой версии Ver.1.1 с сайта производителя.


    Как загрузить готовые образы

    ZIP-архив с файлом RAW-образа v11zero2-32.zip имеет размер 424 837 223 байт и содержит файл v11raw32gb.img, предназначенный для записи только на SD-карту емкостью 32 Gb.

    Размер файла: 1740800 Kb.

    ВНИМАНИЕ ! Перед записью рекомендуется очистить карту в режиме overwrite утилитой SDcardFormatter (если карта не новая и уже использовалась для записи образа).

    Скачать этот zip-архив можно по ссылкам (на разных облаках):

  • Mega

  • MailRu

  • Yandex

  • Google


    Если возникнут проблемы с этой прошивкой, то можно задать вопросы или сообщить о проблеме в теме на Форум 4PDA