Отличия Android устройств или почему нельзя поставить свежую прошивку.

Со времен возникновения IBM PC люди привыкли, что на компьютере можно ставить разные ОС, в том числе после Windows XP вы можете накатить Windows 10. Секрет заключался в том, что производители железа следуют единым стандартам с момента появления IBM PC: в этом компьютере прошивалась не ОС, как это было на многих компьютерах того времени, а микропрограмма, которая выполняла проверку компьютерного оборудования, загружала MBR (master boot record), где была программа, которая поможет загрузить дисковую операционную систему(ДОС).
Повсеместное распространение компьютеров с IBM PC совместимой архитектурой привело к тому, что у нас повсюду есть компьютеры, на которые можно поставить Linux, Windows, ДОС, FreeBSD, Mac OS X и кучу всего остального. Почему же подобное нельзя вытворять с Android смартфонами и планшетами? Дать ответ на этот вопрос является целью этой статьи.

Причина первая: нет стандартной процедуры загрузки

Смотрите, если мы хотим понять сложность этой ситуации, раз нам нужно от смартфона то же что и от компьютера, а это возможность ставить разные ОС, то нам нужно сравнить смартфон и компьютер по разным аспектам, в том числе и по процедуре загрузки ОС. Когда мы говорим о персональном компьютере, то тут все просто: есть BIOS, а есть UEFI. Последнюю я лично считаю ОС, для загрузки ОС. Оба стандарта регламентируют устройство таблицы разделов, оба описывают процесс загрузки, оба позволяют загружать компьютер с любого указанного устройства. Разработчикам современных ОС не нужно разрываться в многообразии стандартов и они делают программы установки, рассчитанные на оба варианта. Когда мы говорим об процессе загрузки телефона, то тут никто BIOS не предложил, а есть куча вариантов:

  • В Google Nexus предлагается fastboot совместимый загрузчик.
  • В Samsung(и наверняка у многих контор) использует свой загрузчик.
  • Устройства на MediaTek и другие китайские устройства загружаются с помощью Das U-Boot.
  • У аппаратов на AllWinner бутстрап из программы, которая ищет на флэшках раздел с U-Boot, загружает его, а последний загружает Android.

Есть куча извращенных способов загрузки, о которых я не знаю, суть в следующем: как и в компьютере есть кусочек ПЗУ, который является частью адресного пространства, при включении питания процессора, и в нем записана программа, которая что-то загружает. У каждого устройства она своя.

Для примера, взглянем на выхлоп dmesg на Samsung Galaxy Tab 2 7.0:

device-2014-11-05-132219

Нас интересует здесь строка запуска ядра ОС:
Kernel command line: root=/dev/mmcblk0p1 rw rootdelay=2 init=/init...

Загрузчик сказал ядру монтировать устройство /dev/mmcblk0p1 как корневую систему и использовать /init как демон загрузки. Вообще, разработчики кастомных прошивок, которые устанавливаются через Recovery, поставляют прошивки как архивы файлов, где есть файлы, предназначаемые для установки в раздел system и boot.img, который шьется в раздел boot, они не заменяют загрузчик, а делают так, чтобы прошивка загрузилась с этим загрузчиком. /dev/mmcblk0p1 — это раздел, куда шьется boot.img, и этот boot.img — является initrd и файловой системой, где записаны ядро, модули ядра, демон и скрипты инициализации. Это наносит ограничения на спектр доступных ОС: это должно быть Multiboot ядро, которое знает, что такое /dev/mmcblk0p1, и у него в initrd должна быть программа /init.  Я не знаю весь парк *nix систем, то то что FreeBSD и Linux имеют разные имена блочных устройств, я знаю точно. То есть, если мы попробуем поставить отличное от Linux multiboot ядро, оно не будет знать, что такое /dev/mmcblk0p1. Возможно, я вас утомил, но этого достаточно, для того, чтобы сказать, что не все так просто. Пойдем дальше.

Причина вторая: модули ядра(драйвера)

Вот у меня два устройства: Galaxy Tab 2(С CM11 и blackhawk next kernel) и Lenovo P770. Попробуем на них выполнить lsmod.
device-2014-11-05-132130
2014.11.04-21.46.59

Скажите, а вы видели на скриншотах загруженные модули с одинаковым названием? Ну pvrsrvkm похоже, а дальше что. Эти программы напечатали список модулей ядра, если перевести на язык windows пользователя, то список драйверов. Каждый мобильник сделан на своем чипсете и каждому чипсету требуется свой набор драйверов, причем драйвера, которые подходят для одной версии ядра, не подходят для другой. Если производитель делает закрытые модули ядра, а затем забивает на них, то потом на ваш телефончик с MT6577(или другим китайским процессором, да и не китайским, наверное, тоже), никто портировать Android 4.4 не сможет, потому что модулей ядра найти не получается.

В целом, проблема похожа на проблему с драйверами на ПК и тут можно возразить следующее: а если модули ядра все-таки есть, но производитель ленится выпускать обновления прошивки, можно было бы сделать единую прошивку, а затем недостающие модули докачать. Ответ — можно, но я возражу так: а вам удобно будет докачивать драйвера на телефоне, у которого не работает Wi-Fi и сотовая сеть? А если ещё нет драйверов для видеоадаптера и оболочка Android не запуститься?

Причина третья: разделы дисков

Вы знаете как поставить винду на компьютер? Наверное, да. Вы берете и делаете таблицу разделов. Обычно, там бывает раздел C:, реже С: и D:. Все разделы форматируете в понятный для винды формат ФС, затем происходит копирование файлов в раздел C:, установка загрузчика и немного магии. В общем, все просто, с установкой Windows на IBM PC совместимый компьютер проблем не возникает и ставится винда везде одинаково. В случае андроидами это не так. Вы знаете где находятся файлы пользователя Android смартфона. А где находятся файлы установленных пользователем приложений и настроек? А где находится ядро(я сказал где)? А где находится сама система? А в случае установки сторонней прошивки, ОС где-то должна найти такую информацию о телефоне, как IMEI, если телефон двухсимочный, то два IMEI, если трехсимочный, то три IMEI, серийный номер телефона, MAC адрес Wi-Fi адаптера. Вы знаете где она находит эту информацию? Хранится все это на разных разделах флешки, распаянной на материнской плате телефона. Формат таблицы разделов, количество разделов, их имена и расположения ведомы только производителю и организованы как ему вздумалось. Посмотрим на примере моих двух гаджетов. Вбиваем команду mount и видим список примонтированных к ФС на данный момент разделов/устройств:
device-2014-11-05-132056
2014.11.04-21.46.33

Если выбрать более-менее реальные разделы, а не временные файловые системы и ФС ядра, то нас интересуют:

На планшете Samsung Galaxy Tab 2:
/dev/block/platform/omap/omap_hsmmc.1/by-name/EFS /efs
/dev/block/platform/omap/omap_hsmmc.1/by-name/CACHE /cache
/dev/block/platform/omap/omap_hsmmc.1/by-name/DATAFS /data
/dev/block/platform/omap/omap_hsmmc.1/by-name/FACTORYFS /system
/dev/block/vold/179:25 /mnt/media_rw/sdcard1
/dev/fuse /storage/sdcard1
/dev/fuse /storage/emulated/0
/dev/fuse /storage/emulated/legacy

На телефоне Lenovo P770:
/emmc@android /system
/dev/block/loop0
/emmc@usrdata /data
/emmc@cache /cache
/emmc@sec_ro /system/secro
/dev/block/vold/179:97 /storage/sdcard0
/dev/block/vold/179:97 /mnt/secure/asec
/dev/block/vold/179:6 /storage/sdcard1

Из этого следует несколько жестких реалий:

  1. На Samsung Galaxy Tab 2 7.0 какую прошивку не ставь, примонтировать раздел с файлами как флешку на компьютере не получится, потому-что такого раздела нет, а есть т.н. Internal Storage, который находится в том-же разделе, где приложения и настройки приложения в папке /data/media/0, которая с помощью FUSE монтируется в ФС и строит из себя внутреннюю SD-карту. Когда вы монтируете раздел как флешку, на планшете, он отмонтируется, а с настройками и приложениями этого делать нельзя, поскольку планшет работать не будет, а если в этом разделе вы занимались вандализмом, то работать планшет не будет, даже после того как вы примонтируете этот раздел.
  2. Да, китайцев не смущают блочные устройства в корне ФС.
  3. У каждого устройства файловая система монтируется по-своему, и у каждого устройства должен быть свой fstab в прошивке.

Причина четвертая: запланированное устаревание

Мы с вами живем в обществе потребления. Производители не должны производить надежные устройства, которые работают десятки лет. Наоборот, они должны спроектировать такое устройство, которое по окончании гарантийного срока должно гарантированно сломаться, иначе если оно будет работать дальше, новое устройство никто не купит. Можно делать это по-разному: вставлять детали с ограниченным ресурсом(кнопки, например), делать аккумулятор несъемным и т.д. Если такое устройство сделать не получается, нужно постоянно внедрять новые технологии, характеристики, а все, что было до этого назвать отстоем. Не надо в таком случае сопровождать ПО телефона, выпущенного год-два назад. Рано или поздно появятся приложения, которые не идут на старом андроиде, а пользоваться новыми хочется, а производитель скажет «а у нас Galaxy Note 4, купите его», «а у нас революционно-новый iPhone 6 Plus, купите его».

Заключение

А что в итоге? Зачем ты нам все это написал? Почему я не могу поставить Windows RT на свой любимый, китайский планшет? Подождите! Я это к тому, что чтобы на рынке мобильников и планшетов подобное стало реальностью, там должен появиться свой «IBM PC», чтобы потом, когда он станет стандартом, на любой телефон этого стандарта(то есть не iPhone) вы могли бы поставить любую ОС. Сейчас такого нет, но я думаю, что в ближайшем могут появиться телефоны с UEFI прошивкой, которая позволит ставить что угодно. Они и сейчас есть на Windows Phone смартфонах, но они залочены и имеют функцию Secure Boot, однако UEFI это стандарт и реализовать его может любой производитель.

3 комментария к “Отличия Android устройств или почему нельзя поставить свежую прошивку.

  1. Спасибо за статью, Дмитрий!

    Давно задавался вопросом устаревания прошивок и почему нельзя взять и накатить последнюю версию Android на свой аппарат.
    Я так понимаю в новой версии и новое линукс ядро и из старой прошивки драйвера и модули не выковоришь и если и выковоришь, то они не подойдут к новому ядру?

    1. Да, обычно модули собираются специально для ядра. Более того, производитель может устанавливать свой набор патчей, не соблюдая GPL, и делать свои модули с закрытым исходным кодом.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*