На грани отвала eMMC: Устанавливаем Android на SD-карту на любом смартфоне/планшете! Вторая жизнь для дешевых кит. устр

К сожалению, китайские производители бюджетных девайсов всё туже и туже затягивают пояса для уменьшения конечной цены девайсов. Попытки сэкономить сказываются не только на качестве дисплеев, пластиковых тачскринах, слабых процессорах, но и на памяти. Причём последнее время в устройства до 5–6 тысяч рублей ставят откровенно неликвидную и отбракованную память брендов Foresee и Barum, которая может прослужить как пару месяцев, так и 5 лет. Сегодня мы с вами: узнаем небольшую историю «затягивания» поясов китайцами, во всех подробностях перенесём Android на MicroSD-флэшку (гайд применим для любых производителей и чипсетов), посмотрим, как будет работать Android с такого накопителя и подведем выводы. Интересно? Тогда добро пожаловать!

image

Предыстория


Пожалуй, стоит отметить, что данная статья является ремейком одной из моих самых первый статей, которую я написал еще летом 2022 года. На тот момент я был совсем неопытным автором и написал достаточно скомканный и не подробный текст, однако понимая, что такой гайд может быть полезен многим, я решил переписать его, снабдив большим количеством скриншотов и пояснений к каждому пункту процесса. В действиях описанных ниже нет ничего сложного, а перенести Android таким образом можно почти на любом устройстве (MTK, Spreadtrum/UniSoc, Qualcomm, Kirin, Exynos).

На самом деле, китайские производители и импортеры в РФ практически всё время пытаются забить ультра-бюджетный сегмент гаджетов различными дешевыми смартфонами и планшетами. До 5.000 рублей можно легко купить 10» планшет или 5» смартфон на относительно свежих версиях Android Go. Подавляющее число девайсов работает на весьма известном чипсете — MediaTek MT6580, 4х-ядерный чипсет аж 7 летней давности, финальная форма эволюции очень неплохого на своё время MT6582, а в качестве памяти используются eMCP модули с 1 гб DDR3 ОЗУ и 8 гб ПЗУ. Немудрено, что таких характеристик на 2023 год не просто мало, а очень мало: смартфон из коробки не потянет ни онлайн-банкинг (Сбер, привет тебе с твоим тяжелющим приложением. Запилите лайт версию хотя-бы. Тинькофф/Альфа скорее всего в те же ворота), ни современные игрушки, ни даже клиент ВКонтакте или Telegram! Смартфоны откровенно позиционируются производителями как девайсы начального класса, которые подойдут в роли смарт-звонилки с возможностями что-то загуглить при необходимости. В них даже LTE нет, только 3G, который потихоньку в МСК начинают сворачивать.

image

Почти всё выше написанное применяется и к похожим смартфонам на Ali до 4.000 рублей. То же железо, разве что могут сделать в дизайне свежего флагмана с большим дисплеем неплохого качества. Чип практически 8 летней давности… в 2023… что-то здесь не то, да? В 2013 году выходило просто кучу девайсов за те же 2–3 тысячи рублей (примерно как сейчас 4–5 тысячи рублей), которые работали на очень свежих и бодрых MT6572/MT6577 в те годы. То есть, чипсет брался по году выпуска или чуть-чуть старше и все эти «мегафоны логины», «билайн смарты» легко тянули банки, оф. клиенты соц. сетей и мессенджеры. Но видимо MediaTek изначально сделала огромные заказы на 6580, захотев отнять рынок ультрабюджетных девайсов у Spreadtrum. И таки да, план работает, устройства на 6580 до сих пор продолжают выходить, с одними и теми же чипсетами, одними и теми же чипами памяти и кое-где даже схожими платами (все они наследуются от одной референсной платы). И если 5–6 лет назад в качестве самой дешевой памяти использовали eMCP от Hynix, которая была вполне неплохой: у меня многие девайсы с ней до сих пор живут и здравствуют, то сейчас используется некая Barum и Foresee. Ни по маркировке, ни по CID ничего официального найти не получается, что даёт нам возможность предположить, что это просто перемаркированная бракованная память от Hynix/Samsung с перебитым CID.

На eMMC обычно есть JTAG-поинты, а на заводах их наверняка проверяют на кол-во бэдблоков и перезаписываемость. Лично мне кажется, что сотрудники условного Hynix просто за «дешман» перепродают полуживые eMCP модули производителям смартфонов, а те их ставят в свои смартфоны. Ведь хотя-бы месяц-два они походить должны! Вышенаписанное касается только ПЗУ, ОЗУ бракованную я не видел никогда.

image

Сегодняшним нашим героем станет некий Xgody Y20 — в своё время довольно популярная модель-«лопата» на AliExpress, которую я купил на «сдачу» с покупки свеженькой GTX1050. Смартфон я приобрел за 4.000 рублей, за такие деньги производитель обещал весьма неплохой набор характеристик: 6580, Android 5.1 (в 2018 то году!), 1 гб ОЗУ (здесь наврал) и аж 6 дюймовый IPS дисплей с разрешением 480×800.

На своё время, смартфон был в целом неплох за свою цену нового девайса — 5.1 не особо много ресурсов кушает, там можно было поиграть и в NFS Most Wanted, и в оф. клиенте ВК посидеть, пока он ещё не разжирел, и просто пользоваться «на повседнев». Для меня он имеет особое значение, поскольку это первый смартфон, который я купил на первую лично заработанные 400$, когда в 16–17 лет запилил гиперкеж на юнити для своего товарища. Теперь я храню его как память, вместе с родной коробочкой, но его работоспособность под сомнением…

image

Причем я нашел страницу производителя: Shenzhen Xin Sheng Shang Techonology. XGody — похоже ее личный бренд.

Немного теории


В своё время, я не сделал дамп прошивки с этого девайса, а их выходило по меньшей мере 2–3 ревизии. Прошивка в сети только для одной ревизии, поэтому когда моя система окончательно захламилась, я перепрошил его, не снимая галочки с preloader. На устройствах с MediaTek, Preloader помимо загрузки вторичного загрузчика lk, инициализирует контроллер ОЗУ и ПЗУ. Список поддерживаемых модулей eMCP хранится в виде таблицы CID → настройки ОЗУ. Именно поэтому если прошить «левый» preloader мы будем получать постоянную ошибку в SP Flash Tool — смартфон банально не сможет инициализировать ОЗУ (DRAM_FAILED)! Если производитель захотел заменить eMMC на определенной ревизии, он добавляет в csv параметры ОЗУ eMCP модуля, его CID и пересобирает Preloader. Дошло до того, что прелоадеры сортируют по номеру сборки (preloader_wegc, preloader_magc, preloader_gemini и т. п.), а поддерживаемые CID вычитывают спец. софтом для подбора подходящего preloader’а!

Кто бы сомневался, что китайцы в один и тот же смартфон поставят несколько разновидностей памяти, так случилось и с моим. Похоже к концу производства, в них начали ставить самую дешевую память, поэтому когда я год спустя нашёл подходящий preloader (помог человек с программатором, сейчас найти preloader можно и без программатора — CID флэшки пишется в лог BROM Flash Tool’а), я прошил стоковую прошивку. И всё работало (кроме камеры), вот только девайс начал самопроизвольно зависать через ~час работы. И тут я предположил, что дело может быть именно в eMMC…

Теперь давайте по порядку: если вы когда-то прошили смартфон с неподходящим preloader, то его еще можно оживить, с помощью подбора prleoader’ов с других девайсов. Для этого пытаемся что-нибудь прошить, заходим в логи Flash Tool (Help → Show logs), открываем лог BROM и ищем там «eMMC». Download Agent сам вычитывает ID флэшки и напишет её в лог. Забиваем CID флэшки в гугл, обычно гугл приводит на форумы, где сервисники сливали спец. софтом прошивку и выкладывали логи, где сервисный софт пишет CID флэшки. Прелоадер от этого девайса можно будет взять!

Если после оживления девайса вы получили белый экран — проблема в lk или ядре. lk — эдакий аналог U-Boot в MTK, инициализирует дисплей и показываем первую «заставку» (до появления бут-анимации). Ищем подходящее ядро (boot.img) или lk. Если остался родной рекавери/бут — ядро можно вытащить оттуда и «собрать из двух один». Ну, а теперь к основной теме статьи!

Перенос Android на MicroSD


Давайте определимся с необходимыми работами. Android поделен на 3 основных раздела, которые необходимы для работы системы:

  1. system — /system/ в файловой системе, read-only раздел с основными файлами системы, android.jar, приложениями.
  2. userdata — /data/ в файловой системе, хранит установленные приложения, их данные.
  3. cache — /cache/ в файловой системе, хранит собственно кэш ART/Dalvik (в более старых системах).


Сначала preloader загружает lk, затем lk в зависимости от режима загрузки (charger/normal/recover) выбирает нужный образ с ядром и рамдиском. boot.img — основной образ с ядром, запускающий систему, а recovery.img — рамдиск с рекавери, который содержит абсолютно такое же ядро, но вместо zygote запускает recovery. Точки монтирования основных разделов лежат в vold.fstab, который можно найти в /etc/ каждого образа. Суть переноса проста:

  1. Делим флэшку на 4 раздела с помощью fdisk.
  2. Форматируем 3 раздела в ext4, а 1 — в fat (для пользовательских файлов).
  3. Патчим vold.fstab.
  4. Копируем подмонтированный как loopback устройство system.img на первый раздел флэшки с сохранением всех прав.
  5. Перезагружаемся, ждём первой загрузки и радуемся спасенному девайсу!


В первую очередь нам надо разбить флэшку на разделы. Есть два варианта: с устройства и с ПК. Я лично всё делаю с устройства для наглядности. Для этого нам понадобится TWRP, ADB и флэшка на 8–16 гб. Можно и на 2–4 уместить, но будет немного… тесновато! Флэшку лучше брать 10 класса: скорость eMMC редко ниже чем 100 мб/c, а на флэшке 4–5 класса все будет совсем печально. Прошиваем TWRP с помощью SP Flash Tool:

image


Загружаем скаттер MT6580, выбираем наш recovery.img и жмем Download. Подключаем выключенный смартфон, дальше софт всё сделает сам!

image


После прошивки рекавери, в него нужно зайти с помощью громкости вверх + включения. Девайс предложит выбор режима загрузки — выбираем Recovery. В TWRP сразу открыт доступ к смартфону через adb, поэтому мы можем работать как root пользователь с обычного терминала. Разбиваем нашу флэшку с помощью fdisk. На большинстве устройств mmcblk0 — это eMMC/NAND, а mmcblk1 — это внешняя microsd флэшка.

fdisk /dev/mmcblk1
n
p
1
<желаемый размер в цилиндрах для системы>

n
p
2
<желаемый размер в цилиндрах для юзердаты (лучше побольше)>

n
p
3
<желаемый размер в цилиндрах для кэша (можно ~50мб)>

n
p
4
Enter (разметит остаток флэшки для данных пользвоателя)

w

exit (выходим из шелла)
adb reboot recovery (перезагружаемся снова в recovery).


image


Таблица разделов обновится только после перезагрузки. То, что сыпет ошибками ioctl — норма. Если вы всё сделали правильно, то в /dev/block увидите mmcblk1p1, p2, p3, p4 — это наши разделы. Еще раз вспоминаем: 1 раздел под system, 2 раздел под userdata, 3 раздел под cache, 4 раздел под всё остальное. Порядок следования значения не имеет, но я решил пронумеровать так для удобства.

Теперь нам нужно отформатировать наши разделы и подмонтировать /system/. Копируем только файлы из /system/, если вам не нужны данные на устройстве — наш /data/ достаточно будет отформатировать вместе с /cache/. Осторожно! На старых мобилках busybox на 32х битных системах не умеет форматировать ext2 на больших разделах. Ниасилили. Тут либо копировать раздел напрямую с помощью dd (что мы и сделаем), либо форматировать флэшку с ПК через кард-ридер. У меня cygwin на ПК не установлен, как и виртуалки с линухом, поэтому это вполне неплохая альтернатива:

adb shell
mount /dev/block/platform/mtk-msdc.0/by-name/system /system/
mkdir /systemsd/
mount /dev/block/mmcblk1p1 /systemsd/
dd if=/dev/block/platform/mtk-msdc.0/by-name/system of=/dev/block/mmcblk1p1 bs=1M


image


Со скоростью флэшки не обманули!

В этой версии busybox есть баг с форматированием разделов >2 гб на 32х битных системах. Поэтому если вы не хотите замарачиваться с установкой cygwin/линуха в виртуальную машину, можно просто взять dd. Нулями забить не выйдет — Android автоматом /data/ не форматирует. Если Android не сможет его подмонтировать — получите либо бутлуп, либо в системе ничего не будет сохраняться.

dd if=/dev/block/platform/mtk-msdc.0/by-name/userdata of=/dev/block/mmcblk1p2 bs=1M
dd if=/dev/block/platform/mtk-msdc.0/by-name/cache of=/dev/block/mmcblk1p3 bs=1M


Теперь нам осталось пропатчить vold в родном boot.img, чтобы система загружалась с microsd флэшки. Для этого берем AndImgTools или готовую «кухню» (я использую MTKImgTools) и распаковываем родной boot.img из прошивки:

image

В Unpack/boot/ramdisk/fstab.mt6580 заменяем:

/dev/block/platform/mtk-msdc.0/by-name/system /system ext4 ro wait
/dev/block/platform/mtk-msdc.0/by-name/userdata /data ext4 noatime,nosuid,nodev,noauto_da_alloc,discard wait,check,resize,encryptable=/dev/block/platform/mtk-msdc.0/by-name/metadata
/dev/block/platform/mtk-msdc.0/by-name/cache /cache ext4 noatime,nosuid,nodev,noauto_da_alloc,discard wait,check
/dev/block/platform/mtk-msdc.0/by-name/protect1 /protect_f ext4 noatime,nosuid,nodev,noauto_da_alloc,commit=1,nodelalloc wait,check,autoformat
/dev/block/platform/mtk-msdc.0/by-name/protect2 /protect_s ext4 noatime,nosuid,nodev,noauto_da_alloc,commit=1,nodelalloc wait,check,autoformat
/dev/block/platform/mtk-msdc.0/by-name/nvdata /nvdata ext4 noatime,nosuid,nodev,noauto_da_alloc,discard wait,check,autoformat


На:

/dev/block/mmcblk1p1 /system ext4 ro wait
/dev/block/mmcblk1p2 /data ext4 noatime,nosuid,nodev,noauto_da_alloc,discard wait,check,resize
/dev/block/mmcblk1p3 /cache ext4 noatime,nosuid,nodev,noauto_da_alloc,discard wait,check
/dev/block/platform/mtk-msdc.0/by-name/protect1 /protect_f ext4 noatime,nosuid,nodev,noauto_da_alloc,commit=1,nodelalloc wait,check,autoformat
/dev/block/platform/mtk-msdc.0/by-name/protect2 /protect_s ext4 noatime,nosuid,nodev,noauto_da_alloc,commit=1,nodelalloc wait,check,autoformat
/dev/block/platform/mtk-msdc.0/by-name/nvdata /nvdata ext4 noatime,nosuid,nodev,noauto_da_alloc,discard wait,check,autoformat


Обратите внимание на encryptable. Этот флаг нужно убрать, иначе система упадет в бутлуп. Шифрование «нинужно»!

image

Собираем boot.img, прошиваем с помощью SP Flash Tool и тестируем что получилось! По самому распространенному списку ошибок:

  1. Ребут сразу после начальной заставки, до анимации загрузки — либо поврежден boot.img, либо вы неверно скопировали /system/
  2. Бутлуп: отформатируйте правильно /data/
  3. Система очень сильно лагает после загрузки: это же первая загрузка, будьте терпеливей. Система с SD стартует заметно медленнее.
  4. Жалуется на невозможность расшифровать пользовательский раздел: Либо форматировать с помощью mke2fs (только twrp), либо пропатчить таблицу разделов самого twrp и сменить ФС уже с его помощью!


Кстати! Забавный нюанс: во время подготовки оригинала статьи, какая-то китайская флэшка на 16 гб с алика у меня померла прямо во время записи образа dd. Так что будьте осторожнее! :)

Юзабельно ли?


image


Друзья! Очень важно понимать, что после первой загрузки Android нужно закэшировать приложения, а после каждой загрузки — прогрузить все ассеты минимально необходимых приложений в ОЗУ. Для особой наглядности, я назову этот процесс «пропердеться» :) После 1–2 минутной загрузки, система начинает работать неплохо, но не особо отзывчиво. Очень важно не забывать, что даже быстрая MicroSD в десятки раз медленней самой дешевой eMMC памяти, поэтому система будет работать не особо быстро.
Если бы в устройстве было хотя-бы 2–3 гб ОЗУ, то теоретически систему можно было бы загнать в рамдиск и распаковывать с флэшки при каждой загрузке. Да, загрузка системы будет занимать минут 5, но сама система будет прямо таки летать!

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

image


Неплохо даются и соц. сети. Пользоваться легким клиентом ВК можно без проблем, Telegram и WhatsApp я бы не рискнул — они нехило наседают на хранилище. Но попробовать можно.

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

image


Поиграть тоже можно, но в основном в эмуляторы. Никаких вам пубгов на таком железе! Зачем было городить 9 андроид на чипсет 8 летней давности — мне не понять, но 5ка и 6ка бегают хорошо! Есть возможность установки кастомной облегченной прошивки, я лично запускал на этом девайсе «линейку» и ходил… до первого зависона. После полного переноса прошивки на microsd, зависания пропали —, а значит девайс мы оживили и дали ему вторую, пусть чуть-чуть и тормозную жизнь! Почти из коробки работают все прошивки для 6580 с той же версией ядра — у моего 3.10.72, что даёт возможность накатить Android 5, 6 и 7. Но по понятным причинам, я остановлюсь на «пятерке». Также не рекомендую ставить на такое железо MIUI, прошивки с Meizu и.т.п — MIUI едва вывозят сами редмики, а тут вы на слабое железо его поставит.

Заключение


Как вы уже поняли, оживить таким образом получится только девайсы, у которых eMMC ещё не совсем упала в readonly. Должны быть доступными хотя-бы первые 50 мб USER раздела eMMC. На самом деле, я далеко не первооткрыватель такого способа переноса Android на флэшку: похожим образом работают кастомные свежие прошивки для девайсов 2010–2011 годов, как например Xperia Arc: там часть системы тоже отправляется на microsd, поскольку не «помещается» во внутреннюю память, а в 2011–2012 году, таким образом ставили прошивки на Galaxy Young/Ace, дабы освободить немножечко места во внутренней памяти!

После такого даунгрейда, девайс заметно теряет в отзывчивости и работает гораздо медленнее. Но если вам срочно нужен смартфон, а возможности приобрести другой нет, или вам девайс дорог как память — почему бы не оживить его таким способом? А вы как считаете?

p-u9l27ynelxi92bcmdxhu76ma8.png

© Habrahabr.ru