Задача


Все началось с того, что я захотел установить на планшет 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)


  1. tmnhy
    09.06.2017 08:55
    +1

    SDK зачем? Если для утилит adb и fastboot, то они присутствуют в репозиториях как отдельные пакеты.


    1. jatx
      09.06.2017 09:02

      Спасибо за поправку. Именно для этих утилит. Я как андроид-разработчик пользуюсь SDK, на счет наличия в репозиториях не знал.


    1. nazarpc
      09.06.2017 14:57

      В пакетах они старые, для новых версий Android не подойдут


      1. tmnhy
        09.06.2017 15:06

        Никогда не сталкивался с этим. Может, тогда по версиям разложите?


        1. nazarpc
          09.06.2017 15:08

          С Andoid 7+ пакетные версии из Ubuntu точно не работают, по-моему даже с 6+ не работают. С пятой версией вроде работало.


          1. tmnhy
            09.06.2017 15:21

            В ubuntu 16.10 android-tools версии 5.1.1, с 7-кой работает.
            Если не брать дебиан, то и в остальных дистрибутивах тоже самое или свежее.


            1. nazarpc
              09.06.2017 15:22

              У меня fastboot из этого пакета не работает с Android 7


              1. tmnhy
                09.06.2017 15:33

                Я не в плане придраться, просто интересно, разве fastboot не плевать какой андроид установлен? Исходя из назначения и режимов применения этой утилиты.


                1. nazarpc
                  09.06.2017 15:34

                  Вроде как нет. Мне нужно было разблокировать загрузчик на Nexus 6P и старые версии fastboot просто не имели нужных команд, а старые версии этих команд ни к чему полезному не приводили.


                1. saege5b
                  10.06.2017 14:32

                  У меня старый китайский планшет начал стабильно общаться с ПК, с адб буквально месячной давности.
                  Андроид 4. И даже не хочу гадать что там накрученно было.


        1. superyarik
          10.06.2017 02:18

          столкнулся с этим при разработке на RN на ubuntu 16.04. пришлось системное удалять и делать элиас на SDK версию adb


  1. kay
    09.06.2017 10:46
    +1

    Счастливый человек. Если бы всегда было так просто. Обычно "не-китайские" телефоны с залоченным бутлоадером проверяют цифровую подпись образа ядра с initramfs. А вот разлочить бутлоадер не так просто. Некоторым это удавалось: https://bits-please.blogspot.de/2016/05/qsee-privilege-escalation-vulnerability.html


  1. teke_teke
    09.06.2017 11:56

    Рут обязателен?


    1. jatx
      09.06.2017 11:57

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


    1. sabio
      09.06.2017 15:31

      Рут, как таковой, не нужен. Но нужен разлоченный бутлоадер (от которого до рута уже один простой шаг).


  1. Dmitry_4
    09.06.2017 17:06
    -2

    Дерьмовая инстанция, ибо 'Подключаем устройство к компьютеру через usb-кабель и заходим в shell устройства' — абсолютно нетривиальное действие и стоит описать предшествующие 150 шагов


    1. iassasin
      10.06.2017 01:34

      Это какие 150 шагов? Приведите парочку для примера. Мне хватило ровно того, что написал автор: подключить по USB девайс и ввести в терминал adb shell.


      1. jatx
        10.06.2017 02:14

        На самом деле, на большинстве устройств сперва нужно включить в настройках "Отладку по USB".
        Так же для некоторых девайсов может понадобиться сделать:


        sudo adb kill-server
        sudo adb shell

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


        1. Dmitry_4
          10.06.2017 05:58

          Кто сам с этим может разобраться, тем эта инструкция нафиг не нужна.


  1. AnarSultanov
    10.06.2017 00:30

    1. Компьютер или ноутбук с ОС Linux.

    Тоже самое прекрасно делается и на виндовс.


    1. 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?


      1. AnarSultanov
        10.06.2017 13:47

        Ответил вам ниже.


  1. AnarSultanov
    10.06.2017 13:45

    Здесь можно взять бинарники под Windows, которые все это умеют.


  1. LESHIY_ODESSA
    14.06.2017 17:43

    Распаковать BOOT под Windows можно с помощью утилиты AndImgTool простым движение мышки. То есть хватаете файл мышкой и «кидаете» на .exe файл. Аналогично кидаете папку и получаете BOOT файл.


  1. ThomasMorg
    16.06.2017 09:42

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