Задача
Все началось с того, что я захотел установить на планшет Digma Optima 7.61 игру GTA San Andreas. К сожалению, виртуальная SD-карта планшета имеет объем менее 1 Гб, а кэш игры весит порядка 2-3 Гб. На планшете установлен Android 4.4.2 и возможность просто взять и сменить память по умолчанию в нем отсутствует. Так же в нем отсутствует файл /etc/vold.fstab (он есть на более старых версиях андроида, и изменив данный файл с root-правами, можно поменять местами виртуальную и реальную карты памяти).
Необходимые инструменты
1. Компьютер или ноутбук с ОС Linux.
2. Утилиты adb и fastboot (входят в состав Android SDK, так же, как заметил tmnhy, входят в репозитории как отдельные пакеты).
3. Набор утилит bootimg_tools (нашел здесь).
Решение
1. Извлекаем с устройства загрузочный образ
— Подключаем устройство к компьютеру через usb-кабель и заходим в shell устройства:
adb shell
— Где-то в папке /dev/block на устройстве нужно найти файл с именем boot. У меня он находился по пути /dev/block/by-name/boot, но данный путь может различаться на разных устройствах.
— Извлекаем загрузочный образ:
dd if=/dev/block/path/to/boot of=/mnt/sdcard/boot-from-device.img
— Выходим из shell'а (exit) и извлекаем образ:
adb pull /mnt/sdcard/boot-from-device.img
2. Затем загрузочный образ нужно разобрать
— Скачиваем и распаковываем bootimg_tools.
— Добавляем bootimg_tools в PATH:
export PATH=$PATH:/path/to/bootimg_tools
— Распаковываем образ:
unpack boot-from-device.img
— Если все предыдущие шаги сделаны верно, то должна появиться папка boot-from-device. Внутри нее должны лежать файлы zImage и ramdisk.cpio.gz, а так же папка ramdisk. Как раз внутри последней лежит содержимое загрузочного образа, которое мы будем патчить.
3. Патчим
Для решения своей задачи я нашел строчку, которую нужно заменить, в файле init.sun8i.rc. Я просто заменил export EXTERNAL_STORAGE /mnt/sdcard на export EXTERNAL_STORAGE /mnt/extsd. Как я понимаю, это как раз и есть то значение, которое возвращает метод Environment.getExternalStorageDirectory() в Android API. В пользу этого предположения говорит тот факт, что после применения патча приложения начали использовать аппаратную карту памяти вместо виртуальной для хранения своих данных.
4. Заменяем загрузочный образ на устройстве
Я написал для этих целей небольшой скрипт:
repack_ramdisk boot-from-device/ramdisk
mkbootimg --kernel boot-from-device/zImage --ramdisk boot-from-device/new-ramdisk.cpio.gz --base 0x40000000 --cmdline 'console=ttyS0,115200 rw init=/init loglevel=4' -o new_boot.img
sudo adb reboot-bootloader
sudo fastboot flash boot new_boot.img
sudo fastboot reboot
Итоги
После проделанных манипуляций игра на планшете успешно заработала.
P.S.
Все вышеописанное вы проделываете со своим устройством только на свой страх и риск. За превращение вашего девайса в кирпич автор ответственности не несет.
Комментарии (25)
kay
09.06.2017 10:46+1Счастливый человек. Если бы всегда было так просто. Обычно "не-китайские" телефоны с залоченным бутлоадером проверяют цифровую подпись образа ядра с initramfs. А вот разлочить бутлоадер не так просто. Некоторым это удавалось: https://bits-please.blogspot.de/2016/05/qsee-privilege-escalation-vulnerability.html
Dmitry_4
09.06.2017 17:06-2Дерьмовая инстанция, ибо 'Подключаем устройство к компьютеру через usb-кабель и заходим в shell устройства' — абсолютно нетривиальное действие и стоит описать предшествующие 150 шагов
iassasin
10.06.2017 01:34Это какие 150 шагов? Приведите парочку для примера. Мне хватило ровно того, что написал автор: подключить по USB девайс и ввести в терминал adb shell.
jatx
10.06.2017 02:14На самом деле, на большинстве устройств сперва нужно включить в настройках "Отладку по USB".
Так же для некоторых девайсов может понадобиться сделать:
sudo adb kill-server sudo adb shell
Но такие подробности я опустил, в предположении, что люди, составляющие аудиторию Хабра, смогут разобраться с этим сами.
AnarSultanov
10.06.2017 00:301. Компьютер или ноутбук с ОС Linux.
Тоже самое прекрасно делается и на виндовс.jatx
10.06.2017 00:38Из описания bootimg_tools:
Note: These tools were made for Linux. They may also work on Cygwin, but I have not personally tested them.
Вы это имеете в виду? Или можете предложить альтернативный метод под Windows?
LESHIY_ODESSA
14.06.2017 17:43Распаковать BOOT под Windows можно с помощью утилиты AndImgTool простым движение мышки. То есть хватаете файл мышкой и «кидаете» на .exe файл. Аналогично кидаете папку и получаете BOOT файл.
ThomasMorg
16.06.2017 09:42Планшет и вправду может превратиться в кирпич, хорошо, что предупреждение сделал, а то начнут вовсю девайсы гробить.
tmnhy
SDK зачем? Если для утилит adb и fastboot, то они присутствуют в репозиториях как отдельные пакеты.
jatx
Спасибо за поправку. Именно для этих утилит. Я как андроид-разработчик пользуюсь SDK, на счет наличия в репозиториях не знал.
nazarpc
В пакетах они старые, для новых версий Android не подойдут
tmnhy
Никогда не сталкивался с этим. Может, тогда по версиям разложите?
nazarpc
С Andoid 7+ пакетные версии из Ubuntu точно не работают, по-моему даже с 6+ не работают. С пятой версией вроде работало.
tmnhy
В ubuntu 16.10 android-tools версии 5.1.1, с 7-кой работает.
Если не брать дебиан, то и в остальных дистрибутивах тоже самое или свежее.
nazarpc
У меня fastboot из этого пакета не работает с Android 7
tmnhy
Я не в плане придраться, просто интересно, разве fastboot не плевать какой андроид установлен? Исходя из назначения и режимов применения этой утилиты.
nazarpc
Вроде как нет. Мне нужно было разблокировать загрузчик на Nexus 6P и старые версии fastboot просто не имели нужных команд, а старые версии этих команд ни к чему полезному не приводили.
saege5b
У меня старый китайский планшет начал стабильно общаться с ПК, с адб буквально месячной давности.
Андроид 4. И даже не хочу гадать что там накрученно было.
superyarik
столкнулся с этим при разработке на RN на ubuntu 16.04. пришлось системное удалять и делать элиас на SDK версию adb