Выбор инструментов
Метод, который я здесь представляю, основан на исходном коде CyanogenMod для Android.
В то время как AOSP от Google только предоставляет инструмент для создания в boot.img
файл, CyanogenMod также добавляет unpackbootimg
инструмент , позволяющий вам распаковать его. Этот инструмент, похоже, не предназначен специально для CyanogenMod, так что, скорее всего, он будет работать и для других ПЗУ.
Существует, однако, относительно большое количество альтернатив для распаковки boot.img
файла, которые работают более или менее одинаково.
По сути, такой инструмент распаковки извлечет содержимое boot.img
файла и отобразит набор параметров, которые вам нужно будет передать в Google.mkbootimg
инструменту для создания файла, конфигурация которого (в основном параметры ядра и адреса памяти) будет соответствовать исходному.
Вот несколько примеров, я не проверял их лично, поэтому не могу рекомендовать их, и я представляю их только для справочных целей:
Все эти инструменты (и другие, которые вы можете найти в любой поисковой системе) должны работать одинаково, но некоторые могут работать лучше, чем другие в обработке какого-то конкретного крайнего случая, с которым вы можете столкнуться на своем собственном устройстве. Однако большинство из них, по крайней мере на арене с открытым исходным кодом, не поддерживаются регулярно, поэтому, на мой взгляд, лучше всего иметь рабочие, поддерживаемые и документированные инструменты - использовать инструменты CyanogenMod.
Некоторые производители выпускают ПЗУ, более или менее далекие от стандарта AOSP (необычные адреса, заголовки, формат файла и т. Д.). Если приведенная ниже стандартная процедура не работает, возможно, одно из этих альтернативных программных решений поможет. В противном случае вам придется проверять наличие проблем, характерных для вашего устройства: некоторым, кажется, требуется определенная процедура или даже специальные инструменты (например, этот вопрос относится к устройствам MediaTek).
Установка инструментов
Скомпилировать набор инструментов CyanogenMod для boot.img
упаковки и распаковки довольно просто.
- Если вы уже установили полное дерево исходного кода Android (вы можете проверить мой другой ответ, чтобы получить больше информации об этом), перейдите в
system/core/mkbootimg/
каталог (в качестве напоминания, исходный код Google AOSP предоставляет только инструмент для создания boot.img
файла, они не предоставить любой инструмент для распаковки),
Если у вас этого нет и не нужно для каких-либо других целей, более простым и быстрым решением будет клонирование только репозитория CyanogenMod android_system_core :
git clone https://github.com/CyanogenMod/android_system_core.git
cd android_system_core/mkbootimg/
Оказавшись в нужном каталоге, скомпилируйте и установите:
gcc -o ./mkbootimg -I ../include ../libmincrypt/*.c ./mkbootimg.c
gcc -o ./unpackbootimg -I ../include ../libmincrypt/*.c ./unpackbootimg.c
sudo cp ./mkbootimg ./unpackbootimg /usr/bin/
Обратите внимание , что Google заменяет C mkbootimg
с версией Python , так что в будущих версиях нет компиляции может потребоваться больше для этой команды.
Вам также необходимо установить инструменты Android на свой компьютер, чтобы он мог общаться с вашим телефоном. Вам потребуются adb
(Android Debug Bridge, утилита оболочки, позволяющая взаимодействовать с подсистемой отладки Android), adbd
(связанный демон) и fastboot
(утилита оболочки, позволяющая взаимодействовать с системой загрузчика вашего телефона).
Ваш любимый дистрибутив Linux может предоставлять их в виде одного или отдельных пакетов, но обычно они всегда называются «android-tools»:
- Debian / Ubuntu:
sudo apt-get install android-tools-{adb,adbd,fastboot}
- Fedora / CentOS:
sudo yum install android-tools
- OpenSUSE:
sudo zypper install android-tools
Получить boot.img
файл
Извлеките файл 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, для других устройств может потребоваться более сложная процедура),
- Подключите его к компьютеру (и оттуда к гостевой виртуальной машине, если вы используете инструменты Android из виртуальной машины).
Если это еще не сделано, я рекомендую вручную запустить сервер ADB на стороне компьютера, это позволит вам напрямую проверить ключ RSA на стороне устройства, не влияя на поведение следующих команд ADB:
adb start-server
Затем переключите ADB в корневой режим:
adb root
Наконец, вы должны иметь возможность напрямую извлечь boot.img
файл из устройства с помощью такой команды (исходный и целевой путь и имена приведены в качестве примеров, адаптируйте их к вашим потребностям и предпочтениям):
adb pull /dev/block/platform/sdhci-tegra.3/by-name/LNX ./boot.img
Команда скопирует весь раздел, как используемый, так и свободный, поэтому не удивляйтесь, что результирующий boot.img
файл будет больше, чем исходный boot.img
файл, поставляемый со стандартным файлом .zip ПЗУ, сам контент остается схожим
После завершения передачи отключите телефон и не забудьте отключить отладку и root-доступ из меню разработчика.
Распакуйте оригинальный boot.img
файл
Распакуйте сам boot.img
файл, используя скомпилированную ранее команду:
unpackbootimg -i ./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
и его можно извлечь, используя команды ниже:
mkdir ./ramdisk
cd ./ramdisk/
gzip -dc ../boot.img-ramdisk.gz | cpio -imd
Для сжатого ОЗУ LZ4 замените последний шаг на lz4 -d ../boot.img-ramdisk.lz4 | cpio -imd
.
Теперь вы можете свободно вносить необходимые изменения, прежде чем продолжить. Однако, может быть, стоит выполнить полную процедуру распаковки - повторной загрузки - один раз, не меняя ничего, чтобы убедиться, что ваши инструменты работают должным образом. В противном случае, в случае возникновения проблемы, вы не будете уверены, что причиной является ваша модификация или какая-то несовместимость (см. Мои замечания в начале о некоторых производителях, которым требуются нестандартные процедуры или инструменты).
Перестройте, чтобы получить новый new-boot.img
файл
Процесс создания ПЗУ CyanogenMod использует внутренний инструмент mkbootfs
для создания boot.img
файла (это происходит в build / tools / releasetools / common.py ). Тем не менее, шаги по созданию этого инструмента кажутся мне бесполезно сложными, в то время как использование предоставленной системы, cpio
кажется, работает так же хорошо. Основное различие между ними, как я понимаю после (очень) быстрой проверки в mkbootfs
исходном коде, заключается в том, что последний применяет некоторые меры безопасности, не включая точечные файлы и /root
каталог в результирующий архив, в то время как cpio
процедура на основе-ниже просто слепо положит все выбранное дерево каталогов в архив.
Вывод: излишне сложный для компиляции с очень небольшим количеством преимуществ, так что давайте использовать инструменты, предоставляемые системой!
Начните с создания нового RAM-диска, из ramdisk
каталога, созданного выше, введите:
find . ! -name . | LC_ALL=C sort | cpio -o -H newc -R root:root | gzip > ../new-boot.img-ramdisk.gz
Или, если вам нужно создать архив LZ4:
find . ! -name . | LC_ALL=C sort | cpio -o -H newc -R root:root | lz4 > ../new-boot.img-ramdisk.lz4
Цель здесь - создать новый файл RAM-диска со свойствами, максимально приближенными к исходному (например, установка владельца часто отсутствует в процедурах, используемых в форумах и блогах, однако это требовалось на моем устройстве).
Теперь перейдите в родительский каталог, чтобы создать сам new-boot.img
файл.
cd ..
Как видно выше, unpackbootimg
команда CyanogenMod генерирует файл, соответствующий каждому ожидаемому параметру mkbootimg
. Поэтому все, что вам нужно сделать, - это нажать a, mkbootimg -h
чтобы получить список всех параметров, а затем установить для каждого из них соответствующее значение, используя соответствующий файл. Обратите внимание, что некоторые параметры ожидают путь к файлу, а другие ожидают получить содержимое файла в качестве значения. Смотрите пример полученной команды ниже:
mkbootimg --kernel ./boot.img-zImage \
--ramdisk ./new-boot.img-ramdisk.gz \
--second ./boot.img-second \
--cmdline "$(cat ./boot.img-cmdline)" \
--base "$(cat ./boot.img-base)" \
--pagesize "$(cat ./boot.img-pagesize)" \
--dt ./boot.img-dt \
--ramdisk_offset "$(cat ./boot.img-ramdisk_offset)"
--second_offset "$(cat ./boot.img-second_offset)" \
--tags_offset "$(cat ./boot.img-tags_offset)" \
--output ./new-boot.img
Здесь не заданы только два параметра:
--board
Насколько я понимаю, это просто информационное поле, позволяющее вставить название модели в полученное изображение.
--id
: Это значение не ожидает, оно просто выводит уникальный идентификатор после построения изображения (объединяя метку времени и контрольную сумму).
Прошить new-boot.img
файл на устройство
- Запустите устройство в режиме быстрой загрузки (он же режим загрузки, обычно удерживая кнопки питания и увеличения громкости).
- Подключите USB-кабель.
Убедитесь, что устройство правильно обнаружено:
sudo fastboot devices
Попробуйте загрузиться с использованием нового ПЗУ (пока не перепрошивая его, поэтому в случае возникновения проблемы вам просто нужно перезагрузить телефон, чтобы вернуть его в рабочее состояние, замените ./new-boot.img
имя файла своим собственным):
sudo fastboot boot ./new-boot.img
Если телефон успешно работает с новым загрузочным образом, вернитесь в режим fastboot и постоянно его прошивайте:
sudo fastboot flash boot ./new-boot.img
sudo fastboot reboot
Вывод
Поначалу эта процедура может показаться сложной, но как только вы ее получите, вы увидите, что на самом деле это не так.
«Устрашающий» аспект связан с тем, что не существует единой «системы Android»: многие производители и поставщики ПЗУ вносят изменения, которые могут варьироваться от незначительной разницы в пути до совершенно нестандартной среды.
Что вам нужно сделать, это определить положение вашего конкретного устройства, а затем, какие несколько команд, которые подходят для вашего случая. Получив их, вы можете придерживаться их и даже легко писать сценарии, если они вам часто нужны.
Я добровольно иногда вдавался в подробности относительно низкого уровня, потому что это облегчит вам решение проблем. Если вы воспользуетесь какой-нибудь «более простой» непрозрачной утилитой для создания и прошивки своего нового boot.img
файла и увидите, что ваше устройство не может запустить его, вам будет сложнее определить, какой шаг пошёл не так. Здесь на каждом этапе вы сможете сравнивать данные, которыми вы манипулируете, с данными, исходящими из исходного boot.img
файла, или данными, которые видны на телефоне, или, например, попытаться восстановить boot.img
файл либо с оригиналом, либо сгенерированным вновь. Файл RAM-диска, чтобы проверить, имеет ли это какое-либо значение (это позволяет точно определить, возникла ли проблема в boot.img
результате процедуры генерации файла RAM-диска или).