За что отвечает файл boot img

Обновлено: 07.07.2024

Я недавно загрузил этот диск для моего Allview P5 (Allview P5 является эквивалентом Gionee GN700W / FLY IQ441 / QMobile Noir A8). Он называется Primonex ROM и предназначен для версии телефона Gionee.

  • Сначала я попытался установить его как есть, но он застрял на экране загрузки.
  • После некоторых исследований я обнаружил, что это может быть проблема с boot.img файлом, и я не знаю, как извлечь или отредактировать его .

Может кто-нибудь сказать мне, как это сделать?

Метод, который я здесь представляю, основан на исходном коде CyanogenMod для Android.

В то время как AOSP от Google только предоставляет инструмент для создания в boot.img файл, CyanogenMod также добавляет unpackbootimg инструмент , позволяющий вам распаковать его. Этот инструмент, похоже, не предназначен специально для CyanogenMod, так что, скорее всего, он будет работать и для других ПЗУ.

Существует, однако, относительно большое количество альтернатив для распаковки boot.img файла, которые работают более или менее одинаково.

По сути, такой инструмент распаковки извлечет содержимое boot.img файла и отобразит набор параметров, которые вам нужно будет передать в Google. mkbootimg инструменту для создания файла, конфигурация которого (в основном параметры ядра и адреса памяти) будет соответствовать исходному.

Вот несколько примеров, я не проверял их лично, поэтому не могу рекомендовать их, и я представляю их только для справочных целей:

Некоторые из них с открытым исходным кодом или на основе сценариев:

    видимо, предназначался как своего рода швейцарский армейский нож для разработчиков Android. Первоначальный автор официально прекратил поддерживать проект, несколько других пользователей разветвляли его как javilonas или cmotc . нацеливается на простоту , добавляя оболочки оболочки сценариев в свой набор инструментов, чтобы сделать процесс распаковки и повторной упаковки более простым. предлагает набор инструментов CyanogenMod, «разветвленных и обновленных» в соответствии с собственным описанием проекта. Этот проект, кажется, действительно все еще поддерживается, что не очень распространено в этой области, однако фактическое преимущество перед оригинальными инструментами CyanogenMod для меня остается неясным.

Некоторые из них являются бесплатными закрытыми исходными кодами:

    довольно часто появляется на справочных форумах и, по-видимому, хорошо справляется со странными случаями, выдает «удобочитаемые» рекомендации на английском языке, когда в mkbootimg исходном коде требуются некоторые изменения, и отображает точную командную строку, используемую для перестройки изображения. кажется, также упоминается довольно часто и позволяет распаковывать и перепаковывать boot.img и файл дерева устройств dt.img . Не обманывайте себя тем , что размещен на GitHub: она является закрытым исходным кодом двоичном и только скомпилированные исполняемые файлы доступны на их хранилище ( на самом деле я даже интересно о точном интересе использования репозитория исходного кода в хранилище двоичные капли, но разные люди, разные умы . ). на форуме XDA предоставляет архив с набором инструментов. в Unix.SE рекомендует некоторые инструменты из ныне несуществующего проекта Android Serial Port. Однако имена файлов заставляют меня думать, что это должны быть старые готовые версии инструментов CyanogenMod (проект закрыт, документации и поддержки нет).

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

Некоторые производители выпускают ПЗУ, более или менее далекие от стандарта AOSP (необычные адреса, заголовки, формат файла и т. Д.). Если приведенная ниже стандартная процедура не работает, возможно, одно из этих альтернативных программных решений поможет. В противном случае вам придется проверять наличие проблем, характерных для вашего устройства: некоторым, кажется, требуется определенная процедура или даже специальные инструменты (например, этот вопрос относится к устройствам MediaTek).

Скомпилировать набор инструментов CyanogenMod для boot.img упаковки и распаковки довольно просто.

    Если вы уже установили полное дерево исходного кода Android (вы можете проверить мой другой ответ, чтобы получить больше информации об этом), перейдите в system/core/mkbootimg/ каталог (в качестве напоминания, исходный код Google AOSP предоставляет только инструмент для создания boot.img файла, они не предоставить любой инструмент для распаковки),

Если у вас этого нет и не нужно для каких-либо других целей, более простым и быстрым решением будет клонирование только репозитория CyanogenMod android_system_core :

Оказавшись в нужном каталоге, скомпилируйте и установите:

Обратите внимание , что Google заменяет C mkbootimg с версией Python , так что в будущих версиях нет компиляции может потребоваться больше для этой команды.

Вам также необходимо установить инструменты Android на свой компьютер, чтобы он мог общаться с вашим телефоном. Вам потребуются adb (Android Debug Bridge, утилита оболочки, позволяющая взаимодействовать с подсистемой отладки Android), adbd (связанный демон) и fastboot (утилита оболочки, позволяющая взаимодействовать с системой загрузчика вашего телефона).

Ваш любимый дистрибутив Linux может предоставлять их в виде одного или отдельных пакетов, но обычно они всегда называются «android-tools»:

  • Debian / Ubuntu: sudo apt-get install android-tools-
  • Fedora / CentOS: sudo yum install android-tools
  • OpenSUSE: sudo zypper install android-tools

Извлеките файл boot.img из ZIP-файла ROM или непосредственно с устройства:

  • Из стандартного файла .zip ПЗУ: некоторые приложения, такие как SuperSU, могут изменять boot.img непосредственно на устройстве, заменяя его на стандартный, что нарушает работу таких приложений.
  • Непосредственно с устройства: некоторые люди сообщают о проблеме чтения, приводящей к повреждению boot.img . IMO, эти проблемы, скорее всего, связаны с использованием плохих USB-кабелей или USB-концентратора, и их можно просто избежать, используя качественные кабели, соединяющие телефон напрямую с компьютером. Вам также необходима возможность запуска ADB в режиме root (в зависимости от используемого ПЗУ, это может быть тривиально или нет).

Первый способ очень очевиден: распакуйте файл .zip любым программным обеспечением ZIP, boot.img файл должен находиться прямо в корне архива.

Для второго метода вам сначала нужно будет определить (к сожалению, для конкретного устройства) путь к устройству хранения, на котором boot.img можно извлечь контент. Я знаю два метода для этого:

  • ls /dev/block/platform/*/by-name/ (если * охватывает еще одно имя папки конкретного устройства, скорее всего , это единственный каталог ниже platform/ ), точное название для поиска также зависит от платформы , но имеет обычный смысл (некоторые примеры: boot , LNX (аббревиатура для «Linux»)). Файлы в этом каталоге на самом деле являются символическими ссылками, и некоторые люди пытаются вручную перейти к цели, но я рекомендую придерживаться пути на основе имен более высокого уровня, который, хотя и дольше, остается менее подверженным ошибкам. Таким образом, вы в конечном итоге с пути, как /dev/block/platform/sdhci-tegra.3/by-name/LNX .
  • На некоторых (старых?) Устройствах правильное устройство можно найти, изучив вывод cat /proc/mtd . Если вы видите устройство, mtd2 связанное с "boot" меткой, то вы будете использовать путь /dev/mtd2 .
  • Из меню разработчика телефона:
    • Включить отладку на вашем телефоне,
    • Разрешить root-доступ к ADB (этот шаг относится к телефонам с CynogenMod, для других устройств может потребоваться более сложная процедура),

    Если это еще не сделано, я рекомендую вручную запустить сервер ADB на стороне компьютера, это позволит вам напрямую проверить ключ RSA на стороне устройства, не влияя на поведение следующих команд ADB:

    Затем переключите ADB в корневой режим:

    Наконец, вы должны иметь возможность напрямую извлечь boot.img файл из устройства с помощью такой команды (исходный и целевой путь и имена приведены в качестве примеров, адаптируйте их к вашим потребностям и предпочтениям):

    Команда скопирует весь раздел, как используемый, так и свободный, поэтому не удивляйтесь, что результирующий boot.img файл будет больше, чем исходный boot.img файл, поставляемый со стандартным файлом .zip ПЗУ, сам контент остается схожим

    После завершения передачи отключите телефон и не забудьте отключить отладку и root-доступ из меню разработчика.

    Распакуйте сам boot.img файл, используя скомпилированную ранее команду:

    Это выведет некоторую информацию, необходимую, чтобы позволить вам перестроить новый boot.img с правильной структурой относительно запаса boot.img . Однако, не спешите с блокнотом, поскольку CyanogenMod upackbootimg также сохраняет ту же самую информацию в нескольких файлах, которые мы будем использовать позже.

    Эта команда генерирует несколько файлов с определенными суффиксами, добавленными к имени входного файла:

    • *-second : Это загрузчик второго уровня, дополнительный и редко используемый на телефонах конечных пользователей. Если этот файл пуст (наиболее распространенный случай), то загрузчик телефона будет напрямую вызывать ядро ​​Linux.
    • *-zImage : Это ядро ​​Linux.
    • *-ramdisk.gz или *-ramdisk.lz4 : RAM-диск, используемый для заполнения корневого каталога устройства. Расширение отличается в зависимости от используемого алгоритма сжатия.
    • *-dt : Дерево устройств, заполнение /dev .
    • Остальные - это небольшие файлы, каждый из которых хранит одно из значений, отображаемых в unpackbootimg выходных данных. Эти значения определяют параметр командной строки для передачи ядру Linux и адреса, по которым загрузчик должен будет загружать каждый объект во время загрузки.

    Чаще всего распаковывают, boot.img чтобы иметь возможность редактировать содержимое корневого каталога телефона. Как видно выше, этот контент хранится в файле *-ramdisk.gz или, *-ramdisk.lz4 и его можно извлечь, используя команды ниже:

    Для сжатого ОЗУ LZ4 замените последний шаг на lz4 -d ../boot.img-ramdisk.lz4 | cpio -imd .

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

    Процесс создания ПЗУ CyanogenMod использует внутренний инструмент mkbootfs для создания boot.img файла (это происходит в build / tools / releasetools / common.py ). Тем не менее, шаги по созданию этого инструмента кажутся мне бесполезно сложными, в то время как использование предоставленной системы, cpio кажется, работает так же хорошо. Основное различие между ними, как я понимаю после (очень) быстрой проверки в mkbootfs исходном коде, заключается в том, что последний применяет некоторые меры безопасности, не включая точечные файлы и /root каталог в результирующий архив, в то время как cpio процедура на основе-ниже просто слепо положит все выбранное дерево каталогов в архив.

    Вывод: излишне сложный для компиляции с очень небольшим количеством преимуществ, так что давайте использовать инструменты, предоставляемые системой!

    Начните с создания нового RAM-диска, из ramdisk каталога, созданного выше, введите:

    Или, если вам нужно создать архив LZ4:

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

    Теперь перейдите в родительский каталог, чтобы создать сам new-boot.img файл.

    Как видно выше, unpackbootimg команда CyanogenMod генерирует файл, соответствующий каждому ожидаемому параметру mkbootimg . Поэтому все, что вам нужно сделать, - это нажать a, mkbootimg -h чтобы получить список всех параметров, а затем установить для каждого из них соответствующее значение, используя соответствующий файл. Обратите внимание, что некоторые параметры ожидают путь к файлу, а другие ожидают получить содержимое файла в качестве значения. Смотрите пример полученной команды ниже:

    Здесь не заданы только два параметра:

    • --board Насколько я понимаю, это просто информационное поле, позволяющее вставить название модели в полученное изображение.
    • --id : Это значение не ожидает, оно просто выводит уникальный идентификатор после построения изображения (объединяя метку времени и контрольную сумму).
    • Запустите устройство в режиме быстрой загрузки (он же режим загрузки, обычно удерживая кнопки питания и увеличения громкости).
    • Подключите USB-кабель.

    Убедитесь, что устройство правильно обнаружено:

    Попробуйте загрузиться с использованием нового ПЗУ (пока не перепрошивая его, поэтому в случае возникновения проблемы вам просто нужно перезагрузить телефон, чтобы вернуть его в рабочее состояние, замените ./new-boot.img имя файла своим собственным):

    Если телефон успешно работает с новым загрузочным образом, вернитесь в режим fastboot и постоянно его прошивайте:

    Поначалу эта процедура может показаться сложной, но как только вы ее получите, вы увидите, что на самом деле это не так.

    «Устрашающий» аспект связан с тем, что не существует единой «системы Android»: многие производители и поставщики ПЗУ вносят изменения, которые могут варьироваться от незначительной разницы в пути до совершенно нестандартной среды.

    Что вам нужно сделать, это определить положение вашего конкретного устройства, а затем, какие несколько команд, которые подходят для вашего случая. Получив их, вы можете придерживаться их и даже легко писать сценарии, если они вам часто нужны.

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

    Андроид-05

    Содержание:

    1. Разделы внутренней памяти

    Внутренняя память устройства на андроиде разбита на несколько логических дисков (разделов).

    Приведу только основные:

    Андроид-01

    Bootloader – здесь находится микропрограмма (загрузчик), позволяющая запускать операционную систему, рекавери и другие сервисные режимы.

    Recovery – как видно из названия, тут установлено инженерное меню восстановления или просто Рекавери.

    Boot – сердце Андроид ОС, тут находится ядро, драйвера и настройки управления процессором и памятью.

    System – системный раздел, в котором находятся все, необходимые для работы Android ОС, файлы, это как папка Windows на вашем диске С:\ (здесь и далее буду проводить ассоциацию с ОС Windows)

    Data – раздел для установки приложений и хранения их данных. (Program files)

    User – это всем известная sdcard или, проще говоря, место под пользовательские файлы (Мои документы). Здесь я вынужден сделать отступление, т.к. размещение данного раздела имеет несколько вариантов:

    Андроид-03

    2. Bootloader, Recovery, adb и fastboot

    Теперь, когда мы знаем, что и где находится, давайте разберемся для чего оно там.

    Начнем с Bootloader. Это загрузчик, который запускает Андроид, рекавери и т.п. Когда мы нажимаем кнопку включения, запускается загрузчик и, если нет дополнительных команд (зажатых клавиш), запускает загрузку boot. Если же была зажата комбинация клавиш (у каждого устройства она своя) то запускает, в зависимости от команды, recovery, fastboot или apx. На рисунке ниже наглядно показано, что запускает Bootloader и как взаимосвязаны разделы.

    Андроид-02

    Как видно из рисунка №3, раздел Recovery не влияет на загрузку Андроид ОС, но зачем же он тогда нужен? Давайте попробуем разобраться.

    Recovery (рекавери) по сути является маленькой утилитой на ядре Linux и загружается не зависимо от Андроид. Его штатный функционал не богат: можно сбросить аппарат до заводских настроек или же обновить прошивку (заранее скачанную на sdcard). Но, благодаря народным умельцам, у нас есть модифицированные рекавери, через которые можно устанавливать модифицированные (кастомные) прошивки, настраивать андроид, создавать резервные копии и многое другое. Наличие или отсутствие рекавери, а также его версия не влияют на работоспособность Андроид ОС (очень частый вопрос на форумах).

    Раз уж зашла речь об интерфейсах, хочу рассказать о еще одном, довольно известном,- adb (android debug bridge). Это, так называемый, режим отладки и назван он так неспроста – через него можно отслеживать работу, как системы в целом, так и отдельных приложений. Но это еще не все, при помощи adb можно получить полный доступ к файловой системе устройства и изменять системные файлы или же вытянуть важную информацию, когда ваш девайс завис на загрузке. Все функции режима отладки описывать не буду т.к. моя цель донести общую информацию, а не подробный обзор о функциях того или иного режима.

    3. Внутренности системы

    Разобравшись с теорией, давайте запустим Андроид ОС.

    А теперь перейдем в корневой каталог и посмотрим на внутренности самой Android OS:

    Андроид-04

    В этой схеме я привел, только необходимые для ознакомления, директории. На самом деле их гораздо больше и на обзор только одной папки System понадобится целая статья.

    Папка System хранит в себе системные данные и все необходимое для работы ОС. Давайте рассмотрим некоторые из этих папок:

    • app – здесь находятся системные приложения (смс, телефон, календарь, настройки и т.п.), а так же приложения установленные производителем устройства (фирменные виджеты, живые обои и т.д.).
    • fonts – системные шрифты
    • media – содержит стандартные мелодии звонков, уведомлений, будильников и звуков интерфейса, а так же загрузочную анимацию (bootanimation)
    • build.prop – Этот файл упоминается, чуть ли не первым, в разговорах и статьях о тонкой настройке системы. В нем содержится огромное количество настроек, таких как плотность экрана, время задержки сенсора приближения, управление wifi, имя и производитель устройства и многие другие параметры.

    4. Root

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

    Эпилог

    Как видите, Андроид не такая уж и сложная штука. Надеюсь, после прочтения статьи, вы узнали что-то новое или получили ответ на давно интересовавший вопрос.


    Здесь процесс решения и результат, а не только готовый результат.

    Прежде всего хочется сказать, что если в интернете нет готового решения для конкрентного телефона, то нужно копаться в коде, а если не понимать что код делает, то ничего не получится. К счастью если на информатике были азы delphi или чего-то подобного и знать основы if else, то разобраться и сделать можно.

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

    Сначала метод №1 c fastboot, который у меня не получился:
    fastboot oem off-mode-charge 0

    Далее метод №2 по парвке загрузчика.

    Получаем boot.img

    boot.img получен, ура, теперь его нужно разобрать.

    Распаковка boot.img

    Сначала сложный способ, затем лёгкий :)

    СЛОЖНЫЙ для windows юзера:

    Есть такой split_bootimg.pl на перл. Для split_bootimg.pl (разбивалка бута) требуется perl, в принципе можно поставить на windows и из винды запустить разбивалку бута, но собиралки, то нет( поэтому есть более правильный способ через cygwin (описание на русском на хабре очень хорошее) — в нём можно работать как в linux (либо если нет возможности скачать и поставить cygwin можно запустить виртуалку virtualbox или сервак) так:
    -разбираем boot или с помощью split_bootimg.pl или с помощью unpackbootimg+mkbootimg (найти можно легко по имени файла, например тут), можно воспользоваться инструкциями например такой инструкцией

    ЛЁГКИЙ для windows юзера:
    На 4pda парень молодец сделал суперлёгкую программу для windows, которая разбивает и собирает бут. Качаем, читаем описание как работать =>boot.img разбит! ramdisk получен!

    Правка системных файлов в boot.img (точнее в ramdisk):

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

    Сначала работал вот с этим кодом в init.star.rc (в разных телефонах называется по разному, но шаблон у всех у них один init.XXX.rc):

    (НАЗОВУ ЭТО сервисом charger)

    service charger /charger
    class charger
    user root
    group root
    oneshot

    По коду: сервис charger: класс charger запускает файл /charger

    Пробовал (не помогло, забегая вперёд напишу что если бы знал про монтирование /system, то часть вариантов сработало бы):
    — с работающего телефона скопировал через root explorer себе файл reboot из /system/bin/reboot (нужен root) и затем подменил файл /charger в корне ramdisk
    — вместо "/charger" писал "/sbin/reboot" а в /sbin/ копировал reboot файл, играл с правами на него
    — вместо "/charger" писал "/system/bin/reboot"
    — вставлял дополнительные строки (от пользователей с 4pda): on property:ro.bootmode=charger…(далее много кода, это только начало) и тд
    Всё это не приносило успеха, но по совету по on property:ro.bootmode=charger как я вижу сейчас есть доля истины, так как в полном коде есть монтирование /system — забегая вперёд скажу что монтирование /system — это развязка.

    Задался вопросом почему charger исполняется, а reboot нет. Иметь бы исходники их. Права одинаковые. Видимо внутри функции в reboot не исполняются, но почему?

    Ну и на 3-ий день с утра я уже держал в голове, что начну я с того, что возьму весь код в другом файле уже init.star.model.rc (обратил на него внимание потому что в нём много монтирований похожих на загрузку ос) из строки функции:

    (ВСЕ on — НАЗОВУ ФУНКЦИЕЙ ДЛЯ УДОБСТВА)

    on fs
    (там ниже идёт куча монтирований всех систем и ещё всего при загрузке ОС) — думаю ОС при моей функции:
    on charger
    должно выполнить всё то же что и при загрузке ОС чтобы мой reboot работал точно и вставил всё что ниже функции:
    on fs
    в мою функцию:
    on charger
    и так как там в функции on fs было exec /system/bin/какой-то_бинарник, то попробовал его заменить на exec /system/bin/reboot
    и при подключении зарядки телефон перезагрузился! То что я обрадовался — это ничего не сказать:)
    Далее построчно поудалял строки и выявил, что главное это монтирование /system:
    mount ext4 /dev/block/mmcblk0p1 /system wait ro

    /dev/block/mmcblk0p1 — у разных прошивок может быть свой! Чтобы узнать его нужно на работающем телефоне в терминале (Terminal Emulator в play market) на рутованном телефоне глануть точки монтирования (fstab ещё в linux называется):
    cat /proc/mounts
    и найти строку по /system

    То есть главное ДОЛЖЕН БЫТЬ ПОДМОНТИРОВАН РАЗДЕЛ /system

    Всё это будет работать только если подмонтирован /system

    2-х дневная разработка сократилась бы в 100 раз если бы я сообразил про монтирование с самого начала, потому что все мои попытки правки и класса charger и функции on charger работали бы в большинстве вариантов если бы при этом был подмонтирован /system.

    PS: при решении вопроса уже ближе к концу мне не давал покоя умный тезис из интернета:
    "Файл charger — это небольшое приложение, единственная задача которого — вывести на экран значок батареи. Он не имеет никакого отношения к Android и используется тогда, когда устройство подключается к заряднику в выключенном состоянии. В этом случае загрузки Android не происходит, а система просто загружает ядро, подключает RAM-диск и запускает charger. Последний выводит на экран иконку батареи, изображение которой во всех возможных состояниях хранится в обычных PNG-файлах внутри каталога res." размышляя над которым я пытался сначала скопировать в бут всю папку /system/bin а потом уже перешёл на более простой метод монтирования.

    Во-первых, давайте посмотрим, как Makefile генерирует наш boot.img:

    Загрузочный образ - это не файловая система в обычном понимании, а специальный формат, адаптированный под Android, который состоит из заголовка загрузки, сжатого ядра, RAM-диска и загрузчика второго уровня (необязательно). mkbootimg.h Смотрите в файле.

    После загрузки файл img пропускает заголовок файла 4k, он включает два пакета gz, один - boot.img-kernel.gz: ядро ​​Linux, другой - boot.img-ramdisk.cpio.gz

    Примерный состав композиции следующий

    Заголовок загрузки включает параметры командной строки и т. Д., А адрес - 000 ----- 0xFFF.

    ramdisk начинается с 1F8B0800000000

    Ядро 0000A0E1, повторить 8 раз в начале

    Нам нужно обратить внимание на структуру данных заголовка загрузки. Здесь мы сосредоточимся на нескольких наиболее важных значениях. Эти значения определены в boot / boardconfig.h. Разные микросхемы соответствуют разным конфигурациям boardconfig в зависимости от производителя. Здесь наши значения соответственно. Да (соответственно физический адрес оперативной памяти, загруженной в kernel / ramdis / tags):

    Приведенные выше значения соответствуют терминам, упомянутым в начале статьи, например, kernel_addr - это ZTEXTADDR, RAMDISK_ADDR - это INITRD_PHYS, а TAGS_ADDR - это PARAMS_PHYS. Загрузчик прочитает ядро ​​и ramdisk из раздела boot.img по адресам, определенным в оперативной памяти соответственно, а затем перейдет к ZTEXTADDR, чтобы начать выполнение.

    Образ виртуального диска - это самая простая небольшая файловая система, которая включает в себя все основные файлы, необходимые для инициализации системы, такие как: инициализация процесса init и init.rc (может использоваться для установки многих параметров системы) и другие файлы. Ниже приведен список файлов, содержащихся на типичном виртуальном диске:
    . / init.trout.rc
    . / default .prop
    . / proc
    . / dev
    . / init.rc
    . / init
    . / sys
    . / init.goldfish.rc
    . / sbin
    . / sbin / adbd
    . / system
    . / data

    Если вы хотите разделить, вы можете использовать winhex для загрузки. img open

    Найдите предыдущий блок данных от 0000A0E1 до 1F8B0800000000 и сохраните его как ramdisk.img

    Найдите блок данных от 1F8B0800000000 до конца файла и сохраните его как ядро

    out/host/linux-x86/bin/mkbootimg --kernel out/target/product/msm7630_surf/kernel --ramdisk out/target/product/msm7630_surf/ramdisk.img --cmdline "console=ttyMSM1,115200n8 androidboot.hardware=qcom" --base 0x00200000 --pagesize 4096 --output out/target/product/msm7630_surf/boot.img

    В соответствии с приведенной выше командой мы можем сначала просмотреть исходный файл инструмента mkbootimg: system / core / mkbootimg.c. Прочитав его, мы можем ясно увидеть внутреннюю структуру boot.img, которая состоит из заголовка загрузки / ядра / ramdisk / второго этапа, среди которых первые 3 элемента являются обязательными, а последний элемент является необязательным.

    header + padding + kernel + padding + ramdisk + padding + .
    4 * 2, магия, фиксируется как "ANDROID!"
    4 * 1, длина ядра, прямой порядок байтов без знака
    4 * 1, адрес ядра, должен быть базой + 0x00008000 (база равна 0x200000)
    4 * 1, длина RAM-диска, прямой порядок байтов без знака
    4 * 1, адрес RAM-диска, должен быть базовым + 0x01000000
    4 * 1, длина второй ступени, малый конец беззнаковый, 0
    4 * 1, адрес второй ступени, должен быть base + 0x00f00000
    4 * 1, адрес тегов, должно быть base + 0x00000100
    4 * 1, размер страницы, прямой порядок байтов без знака, 2048 или 4096

    Телефоны и планшеты Android, как правило, намного более открытые, чем их аналоги с такими операционным системами, как iOS, Tizen или Windows 10 Mobile. Если вам не нравится прошивка, установленная изготовителем устройства на вашем устройстве Android, вы можете заменить ее собственной. CyanogenMod, Paranoid Android и проект Pure Nexus - примеры пользовательских прошивок, которые пользуются большой популярностью среди пользователей Android.

    Пользовательская прошивка также является единственным способом установки новых версий Android на устройствах, которые больше не поддерживаются их производителями. Если вы не владеете устройством, принадлежащим к серии Nexus или Android One, я уверен, что вы уже это знали.

    В этой статье я помогу вам понять, что такое Android-прошивка и как работает устройство Android. Я также расскажу вам об инструментах, которые вы можете использовать для замены прошивки на своём устройстве.

    Предостережения

    Замена прошивки - это рискованная операция, которая потенциально может привести к невозможности использования вашего устройства. В большинстве случаев это также снимает гарантию с вашего устройства. Перед тем, как продолжить, убедитесь, что у вас есть резервная копия ваших данных и копия исходного образа вашего устройства, и преступим к экспериментам с прошивкой.

    1. Что такое прошивка для Android?

    Первоначально прошивка была термином, используемым для обозначения крошечных критически важных программ, установленных в памяти, доступной только для чтения, или ПЗУ, на электронном устройстве. Изменение прошивки было либо невозможным, либо требовало специального оборудования, которое обычно было недоступно обычным конечным пользователям.

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

    Прошивку Android также часто называют Android ROM, потому что по умолчанию пользователи не могут напрямую писать в нее.

    2. Что содержит прошивка Android?

    Прошивка, установленная на устройстве Android производителем, содержит сборку операционной системы Android и две дополнительные программы с закрытым исходным кодом, которые обычно незаменимы, загрузчик и радио прошивка.

    Что такое загрузчики

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

    Как он решает, что является подлинным? Он проверяет, был ли загрузочный раздел подписан с использованием уникального ключа OEM, что является сокращением от ключа Original Equipment Manufacturer. Ключ OEM, конечно же, принадлежит производителю устройства, является закрытым, и вы не можете понять, что это такое.

    Из-за проверки подлинности вы не можете напрямую установить пользовательский ПЗУ на устройстве Android. К счастью, в наши дни большинство производителей устройств позволяют пользователям отключать проверку. На Android-жаргоне они позволяют пользователям разблокировать загрузчик.

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

    Обычно для запуска команд разблокировки используется инструмент fastboot, который является частью Android SDK. Например, если у вас есть устройство Nexus, вы можете разблокировать его загрузчик, выполнив следующую команду:

    В этой статье вы узнаете больше о fastboot. Обратите внимание, что если у вас есть устройство с загрузчиком, которое невозможно разблокировать, нет простого способа изменить или заменить его прошивку.

    Что такое радио прошивка

    Это может показаться вам неожиданностью, но ваш смартфон Android фактически запускает другую операционную систему на независимом процессоре, называемом процессором основной полосы. Радио прошивка относится к операционной системе, которая работает на процессоре основной полосы частот.

    Как правило, это RTOS - операционная система реального времени отвечает за управление возможностями сотовой радиосвязи устройства. Другими словами, это то, что позволяет вашему устройству совершать звонки и подключаться к Интернету с использованием беспроводных технологий, таких как 2G, 3G и 4G LTE.

    RTOS - это проприетарный кусок кода и популярные производители базовых процессоров, такие как Qualcomm, MediaTek и Spreadtrum держат его в секрете. Операционная система Android обычно взаимодействует с RTOS с использованием сокетов и обратных вызовов.

    Как правило, замена радио прошивки вашего устройства - плохая идея.

    Что такое билды Android

    Android-сборка - это единственная часть прошивки, созданная с открытым исходным кодом. Следовательно, это единственная часть, которую вы можете изменить и расширить. Когда вы слышите, как энтузиасты Android говорят, что «я сделал новый ПЗУ на своем устройстве», вы можете быть уверены, что речь идет о новой сборке Android.

    Сборка Android обычно используется в виде ZIP-файла, который может использоваться fastboot. Он имеет следующее содержимое:

    android-info.txt - текстовый файл, определяющий предварительные условия сборки. Например, он может указывать номера версий загрузчика и радио прошивки, необходимые для сборки. Вот пример файла android-info.txt:

    boot.img - это двоичный файл, содержащий как ядро Linux, так и ramdisk в виде архива GZIP. Ядро - это исполняемый файл zImage для загрузки, который может использоваться загрузчиком.

    С другой стороны, ramdisk является файловой системой только для чтения, которая монтируется ядром во время процесса загрузки. Он содержит хорошо известный процесс init, первый процесс, который запускается любой операционной системой на базе Linux. Он также содержит различные демоны, такие как adbd и healthd, которые запускаются процессом init. Вот как выглядит дерево каталогов ramdisk:

    system.img - образ раздела, который будет установлен в пустой каталог system, который вы можете увидеть в приведенном выше дереве. Он содержит исполняемые файлы, необходимые для запуска операционной системы Android. Он включает в себя системные приложения, шрифты, фреймворки JAR, библиотеки, медиакодеки и многое другое. Очевидно, что этот файл больше всего интересует пользователей Android, когда они запускают новый ПЗУ.

    Системный образ также является файлом, который заставляет большинство пользователей Android проявлять интерес к пользовательской прошивки. Файлы системных образов, предоставляемые производителями устройств, часто заполняются ненужными приложениями и настройками, неофициально называемыми bloatware. Единственный способ удалить bloatware - заменить образ системы производителя на более желательный образ системы.

    userdata.img - образ раздела, который будет установлен в пустой каталог data, который вы можете увидеть в дереве каталогов ramdisk. Когда вы загружаете пользовательский ПЗУ, этот образ обычно пустой, и он используется для сброса содержимого каталога data.

    recovery.img очень похож на boot.img. Он имеет загрузочный исполняемый файл ядра, который может использовать загрузчик, и ramdisk. Следовательно, образ для восстановления также можно использовать для запуска устройства Android. Когда он используется, вместо Android запускается очень ограниченная операционная система, которая позволяет пользователю выполнять административные операции, такие как сброс пользовательских данных устройства, установка новой прошивки и создание резервных копий.

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

    Кроме того, вы можете использовать adb, инструмент, включенный в Android SDK, для прямого входа в режим восстановления.

    3. Использование fastboot

    Самый простой способ загрузки новой прошивки на вашем устройстве - использовать инструмент fastboot. fastboot следует протоколу fastboot для связи с устройством Android. Однако это может произойти только при запуске устройства в режиме fastboot. Самый быстрый способ войти в режим fastboot - использовать adb:

    Чтобы запустить пользовательский ПЗУ, который доступен в виде ZIP-файла, содержащего все файлы образов, упомянутые в предыдущем разделе, вы можете использовать команду fastboot update . Например, вот как вы могли бы загрузить ROM, присутствующий в файле с именем update.zip:

    Если вы хотите загрузить только определенный образ, вы можете сделать это, используя команду quickboot flash . Например, вот как вы могли бы загрузить только образ системы:

    Аналогичным образом, если вы хотите заменить только загрузочный образ, вы должны использовать следующую команду:

    Всегда полезно проверить, работает ли загрузочный или восстановительный образ, прежде чем он начнет работать на вашем устройстве. Для этого вы можете использовать команду fastboot boot . Например, вот как вы можете проверить, совместим ли пользовательский образ восстановления с именем twrp.img с вашим устройством:

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

    Заключение

    Теперь вы знаете, что такое прошивка Android и как ее заменить. Я хочу, чтобы вы поняли, что замена прошивки - рискованная операция, которая потенциально может привести ваше устройство в непригодность. В большинстве случаев это также снимает гарантию с вашего устройства. Перед тем, как продолжить, убедитесь, что у вас есть резервная копия ваших данных и копия исходного образа вашего устройства, и начинайте экспериментировать с прошивкой.

    Читайте также: