Linux32 - Блог



LINUX32

Свобода выбирать


ArchLinux
Блог >> 2017 >> Сентябрь


15.09.2017

Backup android прошивки из Linux




Доброго дня всем.

Поискав в интернете инструкции по прошивке android-устройств пришел к выводу что 90% всех решений основываются на Windows, что, как минимум странно (ведь андроид сам работает на ядре линукс) и немного обидно: что делать пользователям Linux если нужно прошить смартфон? Ставить Windows?

Так как последний пункт особенно раздражал, было принято решение написать инструкцию на русском языке, собранную по крупицам из интернета (где в основном все на англ.) + свои решения. Инструкцию по созданию backup'а andriod на процессорах MTK в операционной системе ArchLinux. Думаю многим должна быть полезна, в том числе и мне как памятка, доступная практически отовсюду. Далее, как обычно в таких ситуациях, следует предупреждение: все что вы делаете, вы делаете на свой страх и риск. Автор данной статьи никакой ответственности за возможную порчу оборудования не несет.

Итак, приступим.

Основываясь на мануалах по прошивке андроид с MTK под виндовс яcно видно, что основным инструментом здесь выступает программа SP Flash Tool. Насколько я понял эта программа является в какой-то степени аналогом линуксому dd: считывает и записывает данные на смартфон поблочно с тем лишь отличием, что делает это с выключенным смартфоном. К счастью эта программа есть и для linux, найти ее можно здесь. Скачиваете архив, разархивируете, находите файл flashtool, запускаете. Тут все понятно.

Далее. Для работы SP Flash Tool необходим так называемый scatter файл - это обычный текстовый файл с перечнем разделов из памяти смартфона с указанием смещения начала соответствующего раздела относительно физического нуля смартфонной памяти. Смещение это указывается в шестнадцатиричной системе счисления. Выглядит scatter-файл примерно так:

PRELOADER 0x0
{
}
...


На всякий случай уточню: вместо троеточия идут следующие разделы.

Пока все легко. Сложность далее: в получении этого файла. На виндовс этот файл получают с помощью программы MTKDroidTool, которая хоть и работает под вайном, но заставить ее увидеть телефон не вышло. Можно конечно поискать в интернете прошивку для своей модели телефона и из нее взять scatter-файл, но лично я такой вариант не рассматривал, так как для бэкапа "своего" телефона хочется использовать "свои" же файлы. К тому же, находит ведь необходимые данные MTKDroidTool под виндовс, значит и в линуксе их можно достать.

Как оказалось, да. "Достать" эти данные можно из файла /proc/dumchar_info на самом смартфоне. Этот файл (по моим наблюдениям присутствует на большинстве моделей смартфонов на процессоре MTK). Он предоставляет как раз необходимую и наиболее полную информацию, требующуюся для создания scatter-файла. Выглядит примерно вот так:

Part_Name Size StartAddr Type MapTo
preloader 0x0000000000600000 0x0000000000000000 2 /dev/misc-sd
...


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

Получить этот файл из смартфона можно тоже разными способами (например в самом смартфоне скопировать его на SD-карту, а далее с карты на компьютер), но мы пойдем другим путем. Скопируем этот файл со смартфона на компьютер с помощью ADB. Для этого установим android-tools в состав которого входит adb:

# pacman -S android-tools


Естественно, команда выполняется от рута.

Далее, для того чтобы компьютер правильно распознал ваш смартфон, необходимо написать правило udev. Кроме этого на самом смартфоне нужно включить "Отладку по USB". Для этого на смартфонах с android версии до 4.2 в меню необходимо найти и активировать одноименный пункт, а на смартфонах с android версией старше 4.2 нужно открыть Меню -> Настройки -> О модели и 7 раз нажать на строку с номером сборки. После этого станет доступным меню разработчика в котором и находится требуемая настройка.

Правило для udev будем писать в соответствии с инструкцией на ArchWiki. Для его написания нам необходимы "VENDOR ID" и "PRODUCT ID" смартфона. Чтобы их получить подключаем смартфон к компьютеру usb-кабелем и вводим в терминале команду lsusb. В выводе которой нужно найти строку, соответствующую вашему смартфону. Выглядеть она будет примерно так:

Bus 002 Device 006: ID 0bb4:0c8d High Tech Computer Corp.


Из этой строки определяем что VENDOR ID = 0bb4, а PRODUCT ID = 0c8d.

Теперь непосредственно напишем правило udev: создаем файл /etc/udev/rules.d/51-android.rules со следующим содержимым:

SUBSYSTEMS=="usb", ATTRS{idVendor}=="VENDOR ID", ATTRS{idProduct}=="PRODUCT ID", MODE="0660", GROUP="adbusers"


Чтобы это правило вступило в силу перезапускаем все правила udev командой:

# udevadm control --reload-rules


И еще одно: для доступа обычному пользователю (не root) к ADB-устройствам необходимо чтобы этот пользователь состоял в группе adbusers. Поэтому добавим нашего пользователя в эту группу:

# gpasswd -a <имя пользователя> adbusers


Чтобы добавление в группу вступило в силу необходимо перелогиниться в системе.

Итак, после всех этих манипуляций можно проверить, видит ли Arch смартфон. Подключаем смартфон по USB к компьютеру и вводим в консоли:

$ adb devices


Здесь команда уже от пользователя (префиксы $ и # указывают на пользователя и рута соответственно).

Если вывод похож на этот:

List of devices attached
HT07VHL00676 device


Значит все в порядке и телефон обнаружен и распознан компьютером. Если же нет, то еще раз внимательно проверьте корректность созданного правила udev.

Теперь чтобы получить файл dumchar_info достаточно выполнить команду:

$ adb pull /proc/dumchar_info


И файл окажется в рабочей директории.

Далее нужно составить сам scatter-файл. Опять же есть несколько путей для решения этой задачи: например вручную "набирать" этот файл, копируя и суммируя нужные данные из dumchar_info. Но мы пойдем путем автоматизации данного процесса, так как вручную очень легко можно ошибиться в шестнадцатиричных значениях. А в деле прошивки устройств такого рода ошибки с большой долей вероятности могут привести к "окирпичиванию" устройства. Поэтому я набросал скрипт для этой операции. Скрипт собирает и вычисляет необходимые данные в нужной последовательности и сохраняет их в файле с именем <версия процессора>_my_scatter_<дата>.txt. Собственно сам скрипт:

#!/bin/bash

# Проверка введенных данных
if [ $# != 1 ] && [ ! -f $1 ]; then
echo "Введено неправильное имя файла.
Использование: скрипт файл_dumchar_info"
exit
fi

# Получение данных
names=(`grep 0x $1 | awk '{print $1}' | tr '[a-z]' '[A-Z]' | tr '[a-z]' '[A-Z]'`)
sizes=(`grep 0x $1 | awk '{print $2}' | sed 's/x0*/x/g' | tr '[a-z]' '[A-Z]'`)
start=(0X0)

for ((i=1; i<${#names[@]}; i++)); do
start_prev=`echo ${start[$i-1]} | sed 's/^0X//g'`
size_prev=`echo ${sizes[$i-1]} | sed 's/^0X//g'`
start+=(`echo "obase=16;ibase=16; $start_prev + $size_prev" | bc | sed 's/^/0X/g'`)
done

# Вывод предварительного scatter файла для выбора пунктов установки префикса __NODL_
for ((n=0; n<${#names[@]}; n++)); do
echo "`echo $n+1 | bc` ${names[$n]} `echo ${start[$n]} | tr '[A-Z]' '[a-z]'`"
done
echo "
Введите через пробел номера пунктов, к которым необходимо добавить префикс __NODL_. Необходимые пункты можно посмотреть в сети в scatter-файлах для вашей модели телефона:
"
read nn
prefix=($nn)

# Добавление префиксов к именам блоков и обновление массива с именами блоков
for k in ${prefix[@]}; do
names+=([$k-1]=`echo __NODL_${names[$k-1]}`)
done

# Запрос на ввод модели процессора
echo "
Введите модель процессора вашего android-устройства (четыре цифры без пробела):
"
read mtk_ver

# Задаем имя файлу
file_name=$(echo MT${mtk_ver}_my_scatter_`date +%d-%m-%y`.txt)

# Вывод в scatter файл
for ((n=0; n<${#names[@]}; n++)); do
echo "${names[$n]} `echo ${start[$n]} | tr '[A-Z]' '[a-z]'`
{
}" >> $file_name
done
echo "
Выполнено! Ваш scatter-файл `echo $file_name` сохранен в "$PWD.


Скрипт помимо получения scatter файла дает возможность перед его сохранением указать блоки, к которым будет добавлен префикс _NODL (т. е. No Download - не загружать). Используется префикс как служебная информация для SP Flash Tool и означает что отмеченный им блок нужно проигнорировать и не загружать в устройство. Можно, конечно, вручную снять галочки с "ненужных" для загрузки блоков, но раз мы пишем скрипт, то пусть он и это делает. Обычно в категорию "ненужных" попадают следующие блоки: PMT, NVRAM, MISC, FAT, BMTPOOL и некоторые другие. Для каждой модели смартфона такие блоки индивидуальны, поэтому крайне желательно все же найти scatter-файл от какой-нибудь прошивки для вашей модели телефона в интернете и сравнить с только что созданным. На вполне резонный вопрос зачем тогда такая морока с самостоятельным получением scatter-файла, если все равно пользуемся скачанным отвечу, что скачанный файл используется только для выяснения блоков, требующих префикса __NODL_. Основную же информацию о положении и размере этих блоков мы получаем сами и однозначно актуальную для своей модели телефона, в то время как в файлах из интернета смещения и размеры разделов могут отличаться от ваших настоящих, что критично.

Теперь, после получения scatter-файла можно перейти непосредственно к созданию backup'а своей прошивки:

• Запускаете файл flashtool из распакованной папки с прошивальщиком.

• Указываете созданный scatter-файл.

• Далее переходите во вкладку Read back.

• Добавляете строку с параметрами сохраняемого блока нажатием кнопки Add.

• Двойной клик на созданной строке - появится окно для ввода имени создаваемого бэкапа. Назовите его например FULL_ROM и выберите директория сохранения.

• После нажатия Ок появится второе окно с двумя полями. В первом - шестнадцатиричное значение смещения начала копируемого блока от начала физической памяти устройства (кстати, здесь нужно упомянуть что SP Flash Tool не работает с блоками памяти более 4Гб. Такое выходит ограничение). Во втором - шестнадцатиричное значение длины считываемого блока. Для полного дампа памяти телефона в первом поле нужно указать нулевое значение, т.е. 0x0. Во втором значение, по которое будем копировать. Можно указать 0x400000 (это 4Гб в десятичной системе счисления). То есть максимум возможный для flashtool. Если у вас телефон с 4Гб внутренней памяти, то такие настройки обеспечат вам полную копию всего телефона, включая пользовательские приложения и настройки, а также все что хранится на внутренней карте памяти. В большинстве случаев это нецелесообразно: бэкап займет много места и времени на свое создание также потребует значительно. Поэтому во втором поле укажем смещение блока CACHE (например вот так 0x36780000). Этот блок в большинстве случаев следует сразу за блоком ANDROID, на котором, собственно говоря, и заканчивается системная часть прошивки смартфона. Иными словами при таких настройках вы получите полный бэкап телефона без кеша и пользовательских данных (равносильно сбросу к заводским настройкам), занимающий не много места и достаточно быстро считываемый из телефона.

• Далее отключаем телефон от компьютера и выключаем его (телефон).

• В SP Flash Tool нажимаем кнопку Read back и подключаем выключенный телефон к компьютеру. В программе должны пробежать несколько разноцветных полосок. После окончания появится зеленое окошко с надписью ОК. Значит все хорошо и прошивка скопирована. Можно отключать телефон от компьютера и закрывать программу.

Backup готов. Далее можно уже "играться" с прошивками. Если напортачите, то через SP Flash Tool заливаете обратно свой backup и по новой!

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

Жду от вас комментариев с вашим опытом работы с андроидом из линукса. Или замечания к конкретно этой инструкции. В общем, пишите.

Статья


Ваш комментарий:

Имя:
E-mail:
Код с картинки:
Комментарий: