Гейминг за 300: как я купил и оживил дешевую игровую консоль на Android. Можно ли поиграть, сэкономив на шаурме?
Несмотря на незаурядное название, наверняка многие олдовые читатели моего блога будут рады видеть статью в «старом» формате с оживлением и попыткой использования чего-то очень дешевого, грязного и нерабочего. В процессе подготовки подробного материала о том, как работали 2D игры на телефонах из прошлого, я не терял времени и искал различные интересные девайсы на онлайн-барахолках «за копейки». Так уж получилось, что на моей карте осталось 60 рублей, ещё 250 рублей задонатил читатель и я увидел её: Android-игровую консоль «на запчасти», которую мне удалось забрать всего за 300 рублей. Сегодня мы с вами: поговорим, есть ли смысл брать дешевые консоли на Android, во всех подробностях отремонтируем и отреставрируем нерабочий, грязный девайс «из подвала» и проведем бенчмарки эмуляторов, дабы понять — реально ли получить игровую консоль по цене шаурмы. Интересно? Тогда жду вас под катом!
❯ Предисловие
Друзья! Если вы хотите не только читать, но и смотреть, то для этой статьи доступна видео-версия. А те, кто любят читать текст - листают вниз!
Пожалуй, тематика портативного гейминга была актуальна всегда. Ещё в нулевых, многие мои читатели наверняка уже играли на своей личной игровой консоли: будь это тетрис, полноценная PSP, а то и редкая в СНГ Nintendo DS! С резким падением цены на дисплеи и относительно мощные чипсеты, китайские производители начали делать огромное количество своих собственных консолей. Но понятное дело, что в одиночку запускать собственную платформу без игровой библиотеки смысла нет и поэтому китайские вендоры решили поступить проще всего: они портировали эмуляторы NES, Sega Mega Drive и иных популярных консолей из прошлого и просто устанавливали пиратские ромы в подобные устройства. Одной из самых популярных ретро-консолей, которая в своё время произвело фурор на рынке портативного гейминга была известная в узких кругах Dingoo A320, которая стоила копейки для того функционала, который она предлагала (менее 100$ на релизе в 2009 году).
Та самая Dingoo A320 в форме кирпичика
Казалось бы, чем же могла быть интересна самая обычная, «стандартная» дешевая игровая приставка с кучей ретро-игр? И ответ прост: тем, что ОС устройства поддерживала запуск сторонних приложений, а производитель умудрился поделится (или слить, обычно такие вещи под NDA разработчика чипсета) исходный код прошивки устройства и SDK для разработки нативных программ для этой консоли. Стоит ли говорить о том, что энтузиасты сразу принялись портировать популярнейшие игры с открытыми исходниками и множество эмуляторов? Но настоящий успех к этой консоли пришёл лишь спустя год, когда энтузиасты портировали… полноценный Linux на это устройство и библиотеку SDL1.2, дав возможность запускать вообще любой софт, собранный под MIPS для Linux. Конечно-же, на волне популярности со временем у консоли появились и свои клоны, не имеющие отношения к Dingoo A320.
Спустя время, даже корейская Ritmix решилась выпустить RZX-50 на том-же чипсете, что и Dingoo A320 и сразу с Linux на борту, а хабровчанин, нынешний администратор форума «MotoFAN», под ником exl даже работал над разработкой и выпуском этого устройства в РФ! Благодаря дешевизне, такие игровые устройства раскупали как горячие пирожки себе или детям, создавая отдельный рынок дешевых ретро-консолей. Вплоть до того, что в 2012 году появилась первая игровая консоль на перспективной ОС Android — JXD S601 и всего чуть больше, чем за 100$!
В подарке читателя затесался RZX-50!
Идея китайцев была простой: они взяли дешевое, но относительно неплохое железо для планшетов и просто приделали ему аппаратные кнопки, проще уже не придумаешь! Многие Android-игры уже тогда поддерживали управление физическими кнопками (поскольку в те годы ещё выходили QWERTY-смартфоны, например HTC Desire Z), не говоря уже об эмуляторах, из-за чего, по мнению производителей, такие девайсы должны были сметать с витрин учитывая копеечную цену устройств. И в целом, так и происходило: со временем, некоторые бренды в РФ начали называть такие консоли своими именами и продавать в салонах сотовой связи за цену несколько выше, чем в Китае…
Я уже восстанавливал похожий девайс практически ровно год назад!
Помимо этого, JXD даже заморочились и реализовали свой собственный «магазин»… пиратских ромов! Да, в отдельном приложении можно было скачать нелегальные образы игр и сразу же закинуть их в папку эмулятора… Таким образом, получался «топ за свои деньги» тех лет. Покупаешь одновременно и игровую консоль, и планшет, из-за чего для рядового пользователя покупка подобного девайса была весьма неплохим решением: и дитю поиграть, и самому юность в играх для ретро-консолей вспомнить.
Продержались подобные устройства на рынке примерно до 2015 года. К сожалению, в таких консолях было слишком много недостатков и их нужно было вручную доводить до юзабельного состояния, как это часто бывает с дешевыми устройствами: например, многие вендоры почему-то реализовывали аналоговый стик как цифровой (!) в системе, прошивка очень часто была крайне лагучей и страдала от отсутствия оптимизации, а силиконовая токопроводящая резинка для кнопок быстро изнашивалась и кнопки имели уже далеко не такой плавный и мягкий ход как в новом устройстве. К слову, похоже рынок игровых консолей на Android понемногу возвращается: пару лет назад появилась консоль от Anbernic, в которой пофиксили эти недостатки и бонусом снабдили устройство нормальным OLED-дисплеем и чипсетом Unisoc, но цена в 15 тысяч рублей за Android-смартфон с кнопками наверняка вас отпугнет (это реально очень дорого).
Отпугнула и меня. В моей юности у меня тоже была подобная консоль на Android и я, оказавшись в один прекрасный день с 60 рублей на карте, начал листать онлайн-барахолки в поиске чего-нибудь интересного в пределах своего города. И нашёл: некий мужик продавал за копейки устройства на запчасти, среди которых оказалась и моя консоль: JXD S601.
Я предложил 300 рублей, продавец согласился, читатель задонатил ещё 250 рублей на контент и я выкупил консоль в абсолютно неизвестном состоянии, которая оказалась ещё грязнее, чем было на фото. Тем и интереснее!
❯ Реставрируем
Как я уже говорил выше, консоль я купил в совершенно непонятном состоянии: грязная, слишком легкая, резистивный тачскрин был в пузырях, а кнопка триггера вообще не работала. Кроме того, внутри консоли что-то болталось, но и мы не из робкого десятка и готовы отреставрировать старенькую консоль! Разбирается она очень просто: четыре винтика с обратной стороны консоли и расщелкиваем заднюю крышку пластиковой картой. Правда в моем случае, все винты были закисшими и зализанными, но главное что клипсы задней крышки не пострадали.
Разобрав консоль, я увидел вот такую картину (скриншот из видео): кто-то менял аккумулятор, просто припаяв новую банку к старой BMS без изоляции прямо поверх конденсаторов на линиях питания процессора. Само собой, это не дело, благо у меня был аккумулятор такого форм-фактора. Я выпаял остатки BMS и уже подготовил новый АКБ для подкидывания.
Что было особенно неприятно — прошлый мастер потерял динамик и оторвал полностью камеру с шлейфом:
Упомянутая мной кнопка продолжала болтаться по корпусу и её умудрились выломать даже при том, что она сидела с завода на герметике. Видимо уж очень активно её нажимали. Ну, это поправить несложно: убираем припой с посадочной площадки кнопки, вставляем её пинами вниз и припаиваем. Теперь кнопка держится надежно!
Затем я очистил спиртом контакты кнопок и пробрызгал WD'шкой стик и пошёл набирать воду в тазик, дабы отмыть корпус от грязи. После мытья корпуса, я просушил его феном.
Перед финальной сборкой консоли, я решил проверить плату на работоспособность, подключив дисплей и подпаяв питание и…
Да, даже дисплей оказался разбитым :( Но и это не беда, ведь в таких консолях используются экранчики от… навигаторов! Подкинув новый дисплей и убедившись что плата рабочая, я принялся собирать всё обратно…
Но не тут-то было! Консоль оказалась на пароле и очень сильно тормозила, каждое действие занимало ~5 секунд. Ну, тут уже и причина разбитого дисплея очевидна: видимо консолью пользовался ребенок, который психанул от лагов и разбил замечательный девайс. Благо фиксится легко: качаем прошивку, распаковываем в корень MicroSD-флэшки, включаем консоль нажатием «Питание + Меню» и ждём окончания процесса прошивки.
Наконец-то консоль снова в рабочем состоянии! Ремонт обошелся мне… ну, можно сказать 100 рублей за навигатор. Сейчас они вообще никому не нужны и стоят копейки… На ремонт я потратил где-то час своего времени — не так уж и много, зато фана от восстановления достаточно :)
Давайте же посмотрим, на что способна консоль по прямому назначению — в играх!
❯ Тесты
Как я уже говорил выше, фактически подобные консоли — это планшеты с аппаратными кнопками. Само собой у них есть и Wi-Fi, что позволяет их использовать как бюджетный планшет из начала 2010-х годов… например, накатить клиент ВК и YouTube, заюзать встроенный клиент-почты или использовать консоль как плеер.
Запускаем CPU-Z и видим, что характеристики у нашего девайса следующие:
Чипсет: AMLogic AML8726-M3 с одним ядром Cortex-A9 на частоте 600МГц. В качестве GPU используется Mali-400MP.
ОЗУ: 512Мб DDR3.
Flash-память: NAND-модуль на 4Гб.
Дисплей: 4.3", 480x232, TN. Резистивный тачскрин, само собой на одно касание.
Система: Android 2.3 с возможностью апгрейда до 4.0.
Видеовыходы: аналоговый TV-Out.
Для подобного устройства весьма неплохо! Уж, полагаю, подобных характеристик должно хватать и для достойной эмуляции PlayStation 1. Давайте проверим!
Начинаем с самого простого, конечно же NES: я использовал эмулятор emu.NES, настройки стандартные. Эмулятор сразу же подхватил аппаратные кнопки, всё работает шустро и без проблем:
Переходим к Sega Mega Drive, в этом случае я использовал эмулятор emu.MD. Ром «соника» запускается и работает шустро, без каких-то особых проблем или фризов. Но возможно, для кого-то окажется слишком большим инпут-лаг — тут всё сильно индивидуально.
Дальше — больше, переходим к эмуляции PS1. В качестве игры я выбрал Driver, эмулятор epsxe: игра идёт довольно неплохо, в почти стабильные 25-30 кадров. Не все современные консоли с алика могут позволить себе подобный уровень производительность в 3D играх на PS1!
И не забываем, конечно-же, о нативных играх! Здесь тоже всё весьма шустренько: можно погонять в Android-классику тех лет типа Temple Run и иную мобильную годноту тех лет. Ностальгия!
❯ Заключение
Вот такую игровую консоль я купил за 300 рублей. Да, многие читатели скажут, мол, твоё время и затраты на поиск подходящего дисплея это ещё плюс пару тысяч рублей… но лично мне в кайф было пополнить свою коллекцию консолей ещё одним рабочим устройством. Надеюсь и вам было интересно!
Если захотите поискать такие устройства на барахолках по дешману, то найти их можно по названиям брендов (func, exeq, spider) и по описанию (android консоль, android приставки и т. п.). А если вам интересна тематика ремонта и моддинга различных дешевых девайсов, в том числе и телефонов, программирования, DIY — то подписывайтесь на мой Telegram-канал, в котором есть ламповый чат!
Материал подготовлен при поддержке TimeWeb Cloud. Подписывайтесь на меня и @Timeweb.Cloud, дабы не пропускать новые статьи каждую неделю!
В среду выйдет новый подробный материал из рубрики "сам себе экосистема"
Где я подробно рассказываю о том, как реализовал клиент современного мессенджера Telegram на Android 1.5+ и выше. Таким образом, Telegram будет работать даже на самом первом Android-смартфоне в мире, T-Mobile G1, причём на стоковой прошивке!
Сможете найти на картинке цифру среди букв?
Справились? Тогда попробуйте пройти нашу новую игру на внимательность. Приз — награда в профиль на Пикабу: https://pikabu.ru/link/-oD8sjtmAi
Исходников нет, но мы не сдадимся: как и зачем я портировал более старый Android, чем стоял «с завода»?
Моддинг-сцена с разработкой и портированием кастомных прошивок для Android-устройств существует вот уже более 10 лет. В основном, энтузиасты пытаются проапгрейдить свои устройства путем портирования более свежих версий Android, чем предлагает производитель девайса. Чего уж говорить, если Galaxy S III, которому уже 12 лет стукнуло, получил неофициальный апгрейд до Android 14. Порой мне в голову приходят различные, весьма странные моддерские мысли: например, почему бы не портировать на старенький смартфон… ещё более старую версию Android, дабы посмотреть «что будет». Казалось бы «портировал и портировал», но в процессе работы я столкнулся с множеством интересных нюансов и особенностей работы Android, о которых хотел бы рассказать и вам — моим читателям! Сегодняшняя статья будет в классическом «научпоп»-стиле без кода, зато с подробными объяснениями одной из техник портирования Android-прошивок путем патчинга скриптов для конфигурации системы и подмены Board-specific библиотек, дабы система «увидела» всё необходимое железо! Интересно? Тогда жду вас под катом!
❯ Мотивация
У меня, как и у многих моих читателей, одной из первых версией Android в жизни была 2.x. Наверное, я уже никогда не смогу забыть первые впечатления от использования своего новенького, пусть и бюджетного и слабого Android-смартфона после простеньких китайских кнопочников. Эти ощущения были прекрасными: вот я разблокирую смартфон, потянув «замочек» вправо, свайпаю рабочие столы и тапаю на значок приложения браузера, выполненный в стиле скевоморфизма, загружаю полноценную страницу Википедии через GPRS-сеть (мой первый смартфон не имел 3G) и плавно скроллю страницу, не забывая смахнуть шторку вниз и проверить статус уведомлений в пока ещё совсем простенькой панели нотификаций… Это были по настоящему ламповые впечатления, которые не смог превзойти ни один современный девайс: ни AOSP, ни MIUI, ни OneUI.
Моим первым смартфоном была китайская реплика Samsung Galaxy S III Mini, купленная в самом начале 2013 года. Возможно, кто-то из вас помнит, как подобные дешевые смартфоны и планшеты «Sumsanc» можно было купить на рыночных развалах, в метро и прочих местах, где допускается торговать несертифицированными гаджетами. Даже с учётом накрутки, эти смартфоны стоили всего 2 000 рублей, что было просто «подарком» для цены абсолютно нового гаджета. Девайс был крайне простым для начала 2013 года и имел следующие характеристики:
Процессор: Spreadtrum SC6820. Одно ядро Cortex-A5 на частоте до 1ГГц, Mali400 MP в качестве GPU. Чипсет был крайне высоко-интегрированным для своих лет: в одном корпусе располагалось ARM-ядро, GPU, контроллер питания, GPS, множество периферии (например, DAC), а также Baseband-часть GSM-радиотракта. BT/Wi-Fi реализовывались в отдельном комбочипе разработки RDA.
Память: 256Мб DDR1 ОЗУ/256Мб NAND-памяти в одном чипе eMCP от Hynix. Предположительно, эти чипы остались на складах ещё со времен первых Android-смартфонов, но очень быстро потеряли актуальность и их, вероятно, отдавали «за бесценок» что позволило ещё сильнее снизить цену производства таких смартфонов.
Дисплей: безоговорочно, TFT, обычно с разрешением не выше 480x320, что для 3" дисплея было нормальным, но для 5" — уже несколько маловато. Тем не менее, сами дисплеи были нормальными и глаза от них не «вытекали». Тачскрин обычно ёмкостной, на 2 касания.
Android: 2.2, на некоторых похожих моделях встречался 2.3.
Аккумулятор: ~1.500мАч, не больше. По форм-фактору напоминает BP-4L, без проблем подходит от многих S60 смартфонов Nokia тех лет.
Не густо, да? Уже в апреле того же года вышел Galaxy S4 с Snapdragon 600, 2Гб ОЗУ и 32Гб встроенной памяти, а мы тут с одноядерным чипсетом и 256Мб ОЗУ сидим. Но мне, будучи школяром, это было за счастье — чего я на нём только не делал, и на PHP какие-то WAP-сайты динамические пытался писать и на FTP заливать, и даже ADT Bundle скачал, дабы попытаться что-то своё запилить под собственный смартфон! В общем, я был счастлив, несмотря на лаги девайса. Именно того девайса у меня уже давным-давно не осталось… но память я всё ещё храню и стараюсь дать новый дом таким китайчикам, которые в большинстве своем оказались на свалке истории в новом мире современных смартфонов!
Но на самом деле, смартфоны 10+ летней давности могут быть интересны и своим форм-фактором: в современном мире едва ли можно найти хоть какие-то телефоны с полноценной QWERTY-клавиатурой (исключение — смартфоны UniHertz, которые стоят недешево) и уж тем более, боковые слайдеры. Поэтому мой интерес к подобным девайсам очень легко объяснить!
Однако, порой мне самому хочется снова пережить эти эмоции и ещё раз походить с подобным девайсом «на каждый день», даже когда на Android 2.2 особо никакие сервисы уже не работают. Отчасти, я решаю свои проблемы сам и пишу клиенты нужных мне сервисов, если они действительно нужны, дабы рано или поздно всё таки вдохнуть новую жизнь в «старенькие» девайсы. И казалось бы, это можно списать на синдром утёнка и банальную ностальгию, но мои ощущения «ламповости» отнюдь не мимолетны и всё равно меня тянет именно на те смартфоны, с тем самым интерфейсом, которые я когда-то увидел впервые!
Пожалуй, сказать что я решил портировать старый Android на отнюдь не новый смартфон «просто так» было бы ложью. Я всё ещё верю в то, что смогу в одиночку хотя бы частично вдохнуть новую жизнь в эти девайсы и позволить им работать с современными сервисами, дабы они могли приносить пользу не только мне, но и другим людям, которые намеренно занимаются дауншифтингом или вынуждены сидеть на девайсах с старыми версиями Android! Сегодняшним нашим подопытным станет один из представителей подобных noname-смартфонов тех лет, реплика Galaxy S III Mini на том самом железе, на котором работал мой первый смартфон. Однако с завода на нём стоял Android 2.3 — слишком свежая, по моему мнению, версия системы, которую я конечно-же захотел откатить до Android 2.2!
Задача облегчалась тем, что смартфоны на этом чипсете с Android 2.2 уже выходили, что позволило мне портировать прошивку путем несложных патчей скриптов инициализации и копирования Platform-specific файлов, дабы завести все необходимые для смартфона модули. А поскольку о таком простом способе портирования свежих и старых прошивок знают далеко не все мои читатели — я решил написать об этом отдельный подробный материал! Давайте же перейдём к практической части нашей статьи.
❯ Первые шаги
Перед тем, как начать портирование системы, нам необходимо разбираться в том, как вообще происходит процесс загрузки Android и какие процессы при этом загружаются. Вкратце, описать весь процесс загрузки можно так:
Загрузчик: при включении смартфона, первичный загрузчик BootROM, аппаратно-прошитый в чипсет ещё на этапе изготовления чипа, инициализирует некоторую периферию, загружает вторичный загрузчик из NAND (коим может быть SPL — Second Program Loader, занимающийся инициализацией контроллера DDR и UART) и передаёт ему управление. Вторичный загрузчик в свою очередь передаёт управление U-Boot — в задачи которого входит также инициализация периферии, обработка устройств постоянной памяти (например, NAND или контроллер SD), загрузка ядра Linux и конфигурация самого процесса загрузки. U-Boot можно считать эдакой альтернативной UEFI/BIOS в мире не-x86 устройств. В смартфонах на базе чипов MediaTek и Qualcomm, роль U-Boot выполняет LK — маленькая ОС, в задачи которой входит инициализация периферии и передача управления ядру Linux с помощью программы aboot.
Ядро Linux: после загрузки образа ядра с initrd (небольшая файловая система, которая загружается сразу в память и содержит в себе скрипты для конфигурации всего остального) и передачи управления ядру, Linux начинает выполнение программы с PID 0 — /init, в задачи которой входит выполнение скриптов инициализации userspace-окружения системы в init.rc. При этом смартфон уже фактически готов к работе — в одной из своих статей я показывал, как можно приостановить загрузку Android и выполнять свой код, используя все ресурсы смартфона для своих целей.
zygote и app_process: помимо запуска необходимых для работы смартфона служб, динамической загрузки драйверов (с помощью insmod) и определения режима загрузки (например, если телефон подключили выключенным к зарядке — необходимо показать анимацию этой самой зарядки), init.rc запускает две программы, одна из которых необходима для функционирования системы. Первая — это bootanimation, которая проигрывает анимацию включения смартфона и app_process, который в одном из режимов работы превращается в zygote — самый важный процесс для работы Android, который предварительно при старте системы загружает системный Java-байткод, отвечающий за отрисовку интерфейса, проигрывание звука и т. п. из framework.jar и другие системные ресурсы (например темы и изображения), а затем при запуске каждого приложения просто клонирует сам себя (с уже загруженными ресурсами) и начинает выполнение байткода любого запущенного Android-приложения или службы.
Каждое запущенное приложение или служба — это отдельный app_process, в том числе и лаунчер, и Google-сервисы и клиент любого мессенджера.
Всё выглядит просто и логично, не так ли? Подытожив, можно сказать что для того, чтобы система минимально стартовала, нам необходима подходящее ядро для нашего устройства, рабочий init.rc и адекватно запускающийся init.rc. Кроме того, Android зависит от некоторых платформо-специфичных библиотек: в основном, они находятся в /lib/hardware и без них система может не запуститься или что-то может не работать. Особенно осторожно надо подходить к libhardware.so.
Как я уже сказал выше, прошивку мы будем портировать от другого смартфона на том-же чипсете и что забавно — такую же реплику, просто более-раннюю! «Из коробки», мой смартфон работает на Android 2.3, значительно более стабильной, чем изначальный порт 2.2 на эту платформу. Отличий 2.3 от 2.2 достаточно: например, на 2.2 совсем иной цвет шторки, по умолчанию стоит Light-тема, нельзя закрывать уведомления смахиванием и в целом система несколько отличается внешне. Для работы нам нужно будет два образа прошивки: ту, которую будем портировать и та, которая стоковая. Прошивки в смартфонах на платформе Spreadtrum распространяются в формате pac, однако нет никаких проблем подменить образ раздела в ResearchDownload — фирменной утилите для прошивки смартфонов на этом чипсете.
Я решил взять прошивку от FeiTeng N9300 Mini, родная для моего смартфона — M-Horse 9500 Mini. В случае моего девайса, разметка и список разделов между устройствами никак не отличалась, поэтому изначально я напрямую прошил раздел system.img, дабы посмотреть что будет с устройство. Не забывайте, что ядро и init.rc хранится в образе boot.img — поэтому прошивка раздела system безопасна!
❯ Первый запуск
После прошивки чужого раздела system, смартфон стартовал… однако работал несколько странно: во первых, у нас не было сети, во вторых не работал тачскрин (при родном то ядре), а в третьих, Android ни в какую не видел аккумулятор, вися на 0% и моментально отключаясь, если смартфон не стоит на зарядке, а при попытке воткнуть кабель — смартфон показывал индикацию зарядки, но потребление было на нуле.
Поскольку тачскрина у нас нет, root доступ через adb придется включать «ручками» — для этого нам необходимо перепаковать наш родной раздел boot. Для распаковки и запаковки образов, я пользуюсь MtkImgTool — весьма удобная «кухня» для работы. Вытаскиваем boot.img из pac, закидываем в Unpack/Image/ и распаковываем с помощью Boot -> Unpack -> boot.img
В Unpack/boot/ramdisk/default.prop нам необходимо изменить ro.debuggable на 1, а ro.secure на 0. Это даст возможность отлаживать устройство даже если Android фактически не загрузился.
Теперь у нас есть root-консоль устройства, даже если смартфон висит на заставке. Прошиваем обратно образ, пишем adb shell в консоли и смотрим, что же тут не так… Вообще, драйвер тачскрина обычно статически слинкован с ядром, но в случае устройств Spreadtrum — они вынесены в динамические модули ko, которые можно найти в папке /lib/modules/, либо /sps/. Давайте глянем init.sp6820a.init.3rdparty.rc, который отвечает за специфичную для этой модели смартфона инициализацию.
Ага, видим insmod gt868.ko? Это команда загрузки драйвера тачскрина, в нашем случае — это вышеупомянутый GT868. Иногда встречаются другие модели тачскринов, но главное отличие прошивки 2.2 от 2.3 — разные названия папок с драйверами и некоторые службы. Достаём из родного образа драйвер gt868.ko, используя всё тот-же MtkImgTools, распаковывая его как обычный ext2 раздел:
Пишем в консоли устройства:
adb push / gt868.ko
adb shell
insmod /system/lib/modules/gt868.ko
И наслаждаемся тем, что у нас теперь появился тачскрин! Android сам подхватил новое устройство ввода, поскольку драйвер тачскрина — обычное устройство в /dev/input/. Чтобы драйвер грузился при загрузке, его достаточно добавить в init.sp6820a.3rdparty.rc, предварительно закинув в раздел /system/. Перед этим, раздел нужно перемонтировать для возможности записи:
on boot
insmod /system/gt868.ko
adb shell
busybox mount -o remount,rw /system/
mkdir /lib/modules/
exit
adb push gt868.ko /lib/modules/
После модификации rc-скрипта, нужно обратно запаковать boot.img с помощью MtkImgTools и прошить его с помощью ResearchDownload — тачскрин будет работать даже после перезагрузки!
❯ Поднимаем зарядку и сеть
Переходим к отсутствию связи с аккумулятором и нулевым потреблением АКБ. Здесь мне пришлось несколько покопаться и почитать логи ядра с помощью команды dmesg. Я обратил внимание на то, что некая служба пишет что-то об аккумуляторе, но разобраться было несложно: в папке /system/bin я нашёл программу charge, которая, очевидно, отвечает за настройку КП для старта зарядки. Что она точно делает — мне неизвестно, возможно корректирует какие-то значения в sysfs, возможно с помощью ioctl общается с драйвером КП и даёт разрешение на старт зарядки и обновление информации в sysfs. В любом случае, после замены /system/bin/vcharged на оный из родной прошивки, зарядка заработала.
Для этого мы снова перемонтируем /system/ в режим записи и копируем vcharged, не забыв вернуть обратно необходимые права:
adb push charge /system/bin/
adb shell
chmod 777 /system/bin/charge
Перезагружаем устройство и… зарядка с индикацией появилась!
Вроде всё работает на первый взгляд: и звук, и вибро, и Wi-Fi с Bluetooth… однако сети-то нет! Девайс не определял наличие SIM, а вместо IMEI у нас был null/null:
Чтобы её поднять, нам необходимо разобраться в том, как работает подсистема взаимодействия с радиомодулем в Android, которая называется ril — Radio Interface Library. RIL предоставляет API для системы, дабы оперировать не напрямую AT-командами (которые могут быть проприетарными, а на некоторых чипсетах, как, например, Qualcomm вообще отсутствовать), а удобным набором функций — например о запросе статуса радиомодуля, начале звонка, поиска сети и т. п. RIL состоит из сервиса rild в /system/bin/ и библиотеки libril.so, которую можно найти в папке /system/lib/. При запуске системы, TelephonyManager открывает сокет с rild и опрашивает его состояние. Именно из TelephonyManager система берет информацию о силе сигнала, название оператора, IMEI и другие данные.
Путем ковыряния в dmesg я понял, что система флудит из-за невозможности запустить проприетарный сервис Spreadtrum — sprd_monitor. При попытке позвонить в 112, смартфон бесконечно пытается включить радиомодуль. Я ковырялся в UI-части исходного кода Android, дабы понять логику работы, но проблема крылась как раз в упомянутых выше службах sprd_monitor. Берём их из /system/bin/ оригинальной прошивки, закидываем их в устройство, не забыв установить права и отправляем систему в ребут:
adb push engappclient /system/bin/
adb push engmodemclient /system/bin/
adb shell
chmod 777 /system/bin/engappclient
chmod 777 /system/bin/engmodemclient
Ошибки в dmesg пропали, IMEI появился, но устройство до сих пор не хочет никуда звонить и просто висит на экране звонка. В настройках смартфон говорит о том, что уровень сигнала недоступен, а значит, радиомодуль до сих пор не работает :(
Но и мы так просто не сдаемся! Поковыляв по файловой системе, в директории /system/opl/telephony/bin/ я нашел скрипт, отвечающий за инициализацию радиотракта, который вызывает родной 3rdparty.rc! Запускаем sh-скрипт и обнаруживаем, что сеть появилась и девайс дозвонился в 112, а также увидел SIM-карту!
sh init.tel
Теперь всё полностью работает :) Дабы радиотракт запускался при старте устройства, я перенес часть инита из boot.img от прошивки, которую мы портировали. Для кого-то, казалось бы, это всё достаточно сложно и долго. Но у меня ушел всего один день на полную отладку и запуск такой кастомной прошивки на своем устройстве! Можно сказать, это самый базовый и краткий экскурс в такое нелегкое дело, как моддинг Android-устройств.
Но мы ведь это всё не просто так делали! Давайте глянем, как будет работать такой девайс на Android 2.2 в 2024 году — спустя 14 лет после выхода системы. Всё ли так плохо, как кажется?
❯ Знакомимся с девайсом
Думаю, многие читатели вспомнят этот ламповый интерфейс, обои с одуванчиком и лаунчеры а-ля TouchWiz на тех смартфонах, где интерфейс Samsung был не предусмотрен. А эти «бульк»… их сложно забыть!
Конечно, изначально может показаться, что устройство плохо подходит для выполнения современных задач: браузер не способен загрузить большинство страниц, а из альтернатив есть только Opera Mini, где вообще нет динамического контента, а официальные клиенты ВК, WhatsApp и YouTube уже давно не работают. Опечаленный читатель может подумать, что девайс, как и многие его ровесники уже давно превратились в звонилки…
Но это отнюдь не так! Ведь как я уже говорил, я стараюсь своими силами вдохнуть в подобные девайсы новую жизнь, реализуя на них клиенты нужных мне сервисов сам! Да, пусть примитивно и корявенько, далеко не ынтырпрайз-уровень, но эти приложения выполняют свои функции и что, немаловажно, весят очень мало (до 100Кб) и работают крайне шустро! Клиент ВКшечки просто летает, несмотря на то, что фактически реализован только мессенджер с нотификациями и музыка.
Пожалуй, многие читатели удивятся — но на таких девайсах есть YouTube! Мой самопальный клиент не поддерживает стриминг из сети (да и многие девайсы объективно не потянут), поэтому предварительно загружает видео на MicroSD-флэшку и затем уже их воспроизводит. Как приятный бонус — видео потом можно посмотреть в любой момент в галерее.
Я помню насколько было лампово слушать музыку с таких девайсов. И если претензии к основному динамику не очень актуальны, то к качеству звука в наушниках были придирки — звук был громкий, но ему не хватало низких частот, из-за чего он звучал несколько плоско, хотя мне и этого хватало — ведь я слушал музыку в наушниках по 200-300 рублей с рынка! Я всё ещё помню те времена, как качал mp3-треки по 2-3 мегабайта через 2G-интернет… слушаешь один трек — как раз загрузится другой и так по кругу наполнял свою фонотеку. Эх времена то какие были! Тем не менее, для некоторых базовых мультимедийных возможностей девайс подходит и сейчас, например в машину в качестве BT-хоста с музыкой.
А ещё на таких девайсах порой клёво скачать какой-нибудь Temple Run образца 2011 года и вспомнить самое начало смартфонного гейминга тех лет… ведь далеко не все игры того времени запускаются на свежих версиях Android!
❯ Заключение
В остальном же, подобные девайсы отнюдь не бесперспективны! Несмотря на совсем не новое железо, они всё ещё могут выполнять многие задачи, стоит лишь снова запилить необходимые приложения для них! Мессенджеры, соц. сети, музыкальные сервисы и даже просмотр видео — всё это доступно даже для таких, казалось бы, «устаревших» девайсов, когда есть запал энтузиазма и жгучее желание походить именно с этим конкретным устройством как с основным!
Для кого-то это просто проявление синдрома утенка или картинки «вот кому-то делать не.»… ну а для меня — это крайне интересное, захватывающее и кайфовое времяпровождение: начиная от аппаратного ковыряния с такими девайсами и копания исходников ядер/драйверов, заканчивая написанием оптимизированных клиентских приложений, которые весят не 100-200Мб, а 100-200Кб :)
Друзья, если у вас есть подобные китайчики и вы не разделяете желания пытаться вдохнуть в них жизнь, но выбрасывать их жалко — можете задонатить их мне :) Как сами видите — девайсы попадают в хорошие руки. Из недавнего — я взял нерабочую, утопленную китайскую копию 14 Pro Max из под СЦ в качестве основного смартфона. Также у меня есть канал в Telegram, куда я выкладываю бэкстейджи статей, различные заметки о ремонте, моддинге, программировании и реверс-инжиниринге и свои мысли. Кому интересно — залетайте!
Понравилась ли вам статья? Какими были ваши первые Android-смартфоны? Пишите в комментариях, будет интересно почитать!
Микросмартфон за 100 рублей: Покупаем смартфон 11-летней давности и… пишем под него приложения
Размер экрана — краеугольный камень мира современных смартфонов. Кто-то считает, что дисплеи должны становиться только больше, а рамки — меньше, кто-то любит «средние» дисплеи диагональю в 5+", ну а кто-то остаётся ярым поклонником и приверженцем компактных смартфонов с крошечными дисплейчиками. В наше время, купить новый смартфон с относительно небольшим дисплеем за приемлемые деньги почти нереально — самые бюджетные модели будут слишком тормозными для современного пользователя. Некоторое время назад, я купил себе бюджетный крошечный смартфон 2012 года выпуска — Samsung Galaxy Pocket, причём всего за 100 рублей. Конечно же мне захотелось довести его до ума — а доводить пришлось руками и навыками прожженного программера! Какой смартфон можно получить за 100 рублей? Читаем в статье!
Минутка предыстории
С самого появления смартфонов на рынке, весь мир шагал к тотальному увеличению дисплеев и уменьшению рамок. В какой-то момент, большие смартфоны даже получили отдельное название — падфоны или смартпэды. Такой ход событий было не трудно предугадать: ведь производители дисплейных матриц осваивали всё более и более высокие разрешения и предлагали больше вариантов производителям смартфонов.
Однако несмотря на всеобщее засилие больших «лопат», в мире всё ещё оставались поклонники маленьких и компактных телефонов, которыми очень удобно пользоваться одной рукой. Сейчас подобные устройства представляют только небольшие бренды, известные достаточно в узких кругах — в основном, их можно купить на маркетплейсах, в обычных салонах связи их не найти. Мне известно о нескольких подобных устройствах, которые сейчас присутствуют на рынке. Первый из них «закос» под iPhone — Soyes XS11:
Но тут уж, если честно, хочется назвать такой смартфон не просто компактным, а совсем малюсеньким. На нём вполне удобно выполнять задачи звонилки, но совсем неудобно набирать текст — поэтому под наши задачи, он не особо подходит. Кроме того, эти девайсы работают на базе бюджетного смартфонного железа 6-7 летней давности, поэтому их производительность будет достаточно невысокой по меркам современного пользователя. Конечно же есть и более серьёзные варианты — например, компания Unihertz (да, тот самый продолжатель идей BlackBerry) делает смартфоны Jelly 2: дисплей с диагональю 3", Helio P61 под капотом и Android 11 на борту. Вот только цена, мягко говоря, кусачая — 18 тысяч рублей на момент написания статьи. Это слишком дорого!
Но если душа прямо таки лежит к компактным смартфонам, почему бы не обратиться к рынку Б/У устройств и не присмотреть что-то из… прошлого десятилетия? А вариантов ведь реально много — тут и LG Optimus L3 (3.2"), и Samsung Galaxy Pocket Neo (2.8"), Samsung Galaxy Star (3"), Samsung Galaxy Fame (3.5"), Samsung Galaxy Young. Все перечисленные девайсы стоят реально копейки — можно купить живой вариант до 400-500 рублей!
Я решил взять себе целых два смартфона: Samsung Galaxy Mini и Samsung Galaxy Pocket первого поколения. Оба достались мне в одном лоте за 2.000 рублей (с 20 телефонами) и обошлись мне по сто рублей, причём оба смартфона были рабочими! Чуть позже я докупил отдельно Galaxy Star (250 рублей), Galaxy Fame (250 рублей) и Galaxy Pocket Neo (~400 рублей) для полноты коллекции — вышло совсем недорого. Итак, что за характеристики мы получаем в смартфоне за 100 рублей:
Android: 2.3 Gingerbread.
Чипсет: Broadcom BCM21553 с одним ядром Cortex-A5 на частоте 832мгц. Видеочип: VideoCore IV, он же использовался в Raspberry Pi.
ОЗУ: 256 мегабайт (предположительно — DDR1).
Встроенная память: 3 гигабайта + слот для SD.
Дисплей: 2.8", 240x320, емкостной тачскрин.
Сеть: Поддержка 2G/3G. Об LTE и речи не идёт.
Выглядит не особо густо, да? И разрешение весьма низкое — большинство софта не запустится, а о клиентах современных сервисов и мечтать не приходится… или приходится?
Конечно же шаловливым ручкам захотелось вернуть жизнь этому миниатюрному красавцу и я решил использовать его как второй смартфон — при этом с клиентом ВК и музыкой, которые я запилил сам.
Разработка под старые версии Android
На самом деле, разработка под старые версии Android не особо отличается от современных версий системы. Кое-где приходится костылить, велосипедить и юзать AppCompat для реализации современных фишек на старых версий системы, но, будем честным, подобного и в последних версиях Android достаточно.
Даже сейчас нет никакой проблемы скачать последнюю версию Android Studio, подключить смартфон с включенной отладкой и отлаживать приложение прямо на девайсе — logcat тоже есть. Единственный нюанс — поиск драйверов и ручное закрытие приложений в таскменеджере, если вы деплоите под Android 2.x (Android Studio не умеет сам закрывать приложение, чтобы переустановить пакет).
В целом, за всё время разработки под старые устройства, я пришёл к следующим выводам:
Поскольку большинство устройств имеет одно ядро, для плавности интерфейса нужно минимизировать любую работу в фоне.
Взаимодействие с современными веб-сервисами может быть осложнено из-за отсутствия поддержки TLS1.2 и устаревших сертификатов (проверка сертификатов легко обходится специальным костылем, а вот TLS — нет).
У Android до 3.0 вся отрисовка интерфейса программная и она опять же, будет сказываться на скорости работы фоновых служб. Чем менее интерфейс комплексный, тем лучше.
Пушей нет — да, вообще. Однако это ничуть не помешает нам сделать уведомления практически в реальном времени с помощью… очередного костыля!
Допиливаем ВК
Я уже писал клиент ВК в рамках одной из прошлых статей. Теперь нам нужно довести его до ума — подогнать под разрешение экрана и переработать интерфейс для большей удобности, а также добавить недостающие разделы — я тот ещё любитель полистать мемчики, сидя в автобусе.
Честно сказать, вся концепция интерфейса требовала полной переработки — боковое меню банально очень неудобно использовать на подобных устройствах из-за малых размеров каждой строчки. Поэтому я решил не изобретать велосипед, а обратился к дизайнерам Apple и первоисточнику: официальному клиенту ВК для iOS 6, родом из 2012 года!
Приложение для Android выглядело +- также в те годы. Видите вкладки с разделами снизу? Они то нам и нужны — это самый удобный способ навигации на таких смартфонах! Накидав макет в layout'е, я приступил к реализации:
Изначально мне хотелось, чтобы всё приложение было плавным и анимированным: для этого я обратился к фреймворку анимаций Android. Суть очень простая — это обычный интерполятор значений от a до b за определенный промежуток времени. При этом мы не можем анимировать произвольное свойство — только те, который уже реализованы в системе (переход, поворот, масштабирование, альфа-канал). Более наглядно это можно представить вот так:
Да, это всё анимация :) Получаем примерно такой результат:
Обратите внимание, что запуск большого количества анимаций будет вызывать перерисовку даже в том случае, если элемент не видно на экране — от чего у нас будут дикие тормоза! Осторожнее с этим.
После этого, я решил доработать раздел с музыкой: я все еще пользуюсь грязными хаками для получения доступа к API музыки, поскольку «левым» клиентам такой возможности не дают. Публично его расписывать не буду, поскольку это скорее всего нелегально, да и сами ребята из ВК об этом знают (но не думаю, что будут применять какие-то санкции по отношению к «маленьким» разработчикам) — но если нужно, пишите в личку, расскажу всю концепцию.
Во первых, мне хотелось добавить возможность скачивать треки на внутреннюю память/флэшку. А во вторых, мне хотелось добавить фоновое воспроизведение — до этого возможность свернуть приложение и послушать музыку уже была, однако Android мог в любой момент прибить окно с музыкой и оставить нас с носом, остаётся только реализация в виде foreground-сервиса:
В Android есть два типа служб: background (фоновые) и foreground (видимые пользователю). Первый тип служб система может прибить когда угодно — например мало памяти или экономия заряда АКБ. А вот второй тип служб система не прибивает практически никогда, поскольку они обозначают выполнение важной операции в фоне — например скачивание файла или обновление системы. Однако у них есть одно ограничение — они должны быть привязаны к собственному уведомлению, которое нельзя закрыть. В процессе реализации возникло еще пару проблем — Wakelock'и (механизм, предотвращающий уход девайса в «сон») и WiFiLock'и (тоже самое, но для WiFi).
Точно таким же способом я реализовал механизм уведомлений — как я уже говорил раньше, пушей на старых смартфонах нет вообще ни в каком виде, поэтому пришлось реализовывать свой механизм «обновления»: каждые 3-5 секунд запрашиваем список последних 5 диалогов с сервера и сравниваем с предыдущим результатом, если есть новые сообщения — создаём нотификацию (листинг слишком длинный - пришлось перезалить на pastebin):
После этого, я начал рутинную работу по реализации интерфейса для данных с сервера — паблики, друзья, профили, лента и.т.п. В некотором смысле, реализация лента весьма занимательна: вообще, для очень больших списков существуют т.н виртуализация ListView — это когда ListView отображает только видимый пользователю кусок датасета (набора данных — например, список записей на стене) и на старых версиях Android она доступна. Однако мне было интересно реализовать вариант, который потреблял бы минимальное количество ОЗУ и где я точно знал бы, когда пользователь видит тот или иной фрагмент приложения. Поэтому я реализовал… пагинацию свайпами! Вот так привет из нулевых!
Для этого я использовал GestureDetector — встроенный в систему класс для обнаружения простых жестов — свайпов и.т.п. ВК при запросе ленты отдаёт специальную метку для получения следующей страницы новостей (поскольку она может динамически меняться и нужно хранить её стейт), мы эти метки просто сохраняем и переключаемся по странницам новостей с помощью обычных свайпов вправо-влево:
Выглядит весьма забавно.
Юзабельно ли всё это на деле?
Давайте смотреть, может ли юзать такой смартфон в наши дни. Берём наш девайс в руки, логинимся и оцениваем его производительность «вхолостую».
Работает весьма шустренько, учитывая что это бюджетник 2012 года. Как насчет нашего самопального клиента ВК? Смотрим:
Работает весьма бодро. Не сказать что также плавно, как последний айфон, но и совсем плохим результат явно не назвать!
Смартфонный функционал у девайса тоже вполне ничего: 1-2 SIM (в зависимости от версии), нормальная синхронизация контактов с ПК (однако Kies вроде-бы не работает на Windows 10, но есть vcf):
Встроенный почтовый клиент продолжает работать без каких либо проблем. Однако настраивать некоторые почтовые сервисы нужно вручную и с помощью «паролей приложений» — напрямую залогинится возможности нет. В случае «покета», придется поставить стоковый клиент из Android 2.3 вручную.
Мультимедийные возможности тоже радуют: встроенный плеер тачвиза мне всегда очень нравился. Есть и настройки эквалайзера.
Единственное, что откровенно подводит — браузер. Последним вариантом осталась Opera Mini 7 — она позволяет смотреть сайты, но не поддерживает динамический контент, только статику. Ну, зайти на википедию или почитать статью на Хабре хватит. Родной браузер уже не в состоянии что либо загрузить :(
Ну а в общем, производителньость смартфона весьма радует, согласитесь? Нельзя сказать, что он уж слишком тормозной — по крайней мере, современные ультрабюджетные смартфоны (до 4-5 тысяч рублей) зачастую показывают себя гораздо хуже чем и флагманы прошлых лет, и даже бюджетники!
Заключение
И всё таки, я считаю что мне удалось в каком-то смысле вдохнуть новую жизнь в старенький девайс. Если использовать подобный девайс как второй — на случай, если сел основной смартфон, то такой миниатюрный красаввчик может неождианно выручить даже в довольно сложной ситуации. Кроме того, эти смартфоны всеядны к аккумуляторам — достаточно подпаять + и — и они будут работать хоть от BL-4C.
Главная ценность Galaxy Pocket — в его компактных размерах. А поскольку по настоящему дешевых, маленьких и шустрых смартфонов становится всё меньше и меньше, то нам остаётся лишь продлять жизнь моделям прошлых лет! Есть ли в этом смысл и получил ли смартфон новую жизнь? Пишите в комментариях!
Клиент ВК можно сказать на 4pda. Там лежит самая последняя версия (для скачивания нужна регистрация на форуме). Если по каким-то причинам не хотите регистрироваться на форуме — я выложил актуальную версию в комментариях.
Эта статья поддерживается командой ITGLOBAL.COM
Мы — первый облачный провайдер в России, а также интегратор, поставщик ИТ-услуг, продуктов, сервисов и разработчик собственного ПО.
• Наш сайт
• Наш блог про виртуализацию и Enterprise IT
• Истории успеха наших клиентов
Этот китайчик просто любит жизнь: реставрируем игровую консоль с помойки за 250 рублей
Ни для кого не секрет, что иногда на онлайн-барахолках можно встретить продавцов, которые продают различные устройства с помойки. И ведь иногда прямо слёзы наворачиваются от того, какие крутые штуки люди умудряются выкидывать. Зачастую подобные девайсы требуют серьёзного обслуживания, но и стоят копейки: недавно я увидел симпатичную игровую консоль PGP Aio Droid Letto, которая привлекла моё внимание своими миниатюрными размерами и симпатичным дизайном, а ещё тем, что была в ужаснейшем состоянии и стоила всего 250 рублей. А поскольку я обожаю копаться в различных девайсах и давать им вторую жизнь, я сразу же её заказал! Сегодня мы с вами: приведем корпус устройства в подарок, подберем дисплей от GPS-навигатора, найдём прошивку на безымянное устройство и перепрошьём с помощью замыкания ножек NAND, а также посмотрим, годится ли на что-то консоль по цене кофе в столице!
Покупка
Мои давние читатели знают, что я просто обожаю различные старые китайские консоли. Денди, сеги, портативные устройства: уже как минимум с 10'ок игровых консолей я отремонтировал и написал о них статьи. Как уже было упомянуто выше, нашим сегодняшним героем станет некая PGP Aio Droid Letto 2012 года выпуска — ODM устройство, на которое налепили шилдик PGP. В своё время, подобные консоли были довольно популярны (в первую очередь — из-за своей цены) и как минимум несколько китайских заводов разрабатывали и продавали их локальным брендам под реализацию. Средняя цена была 2.000-6.000 рублей, что было весьма немного.
Листал я себе онлайн-барахолку в поисках игровых консолей и увидел Letto за преусловный прайс 250 рублей. Как уже говорил в интро — меня привлек приятный дизайн и компактность: я любитель поиграть в дороге, но даже PS Vita/PSP может оказаться великоватой для кармана летних шорт. А тут идеальный вариант! Ну и конечно же я видел плачевное состояние консоли и мне хотелось в ней покопаться и попытаться довести до ума.
Заказ сделан, консоль пришла из Анапы в Ейск за несколько дней и вот, уже дома я начинаю осматривать покупку и разбирать консольку. И конечно же без серьезного ремонта не обошлось!
Хардварный ремонт
Разобрать устройство довольно легко: лишь выкрутить 4 винтика, которые уже кто-то до меня потерял и расщелкнуть корпус. Перед нами открывается плата, которая не похожа на топляка, но явные следы попадания влаги имеют. Кроме того, она очень пыльная.
Поскольку устройство действительно могло лежать в грязном месте, я решил сначала полностью отмыть корпус в два этапа: мылом и спиртом. Причём спиртом мы не только дезинфицируем устройство, но и оттираем неприятное и липкое софт-тач покрытие, которое разлагается от времени.
После мытья и сушки корпуса, я решил заодно и заменить дисплей. Родной оказался с царапинами и неприятной трещиной на тачскрине. И вот тут есть маленький лайфхак: кто сказал, что дисплеи для таких устройств нужно покупать по названию модели втридорога? Секрет вот в чём: в небольшие консоли, китайцы обычно ставили стандартные матрицы с разрешением 480x232 и интерфейсом TTL RGB от… автомобильных навигаторов и фоторамок! Почти все дисплеи с этим интерфейсом унифицированы и имеют одинаковый шлейф (40 пин) и распиновку, а поскольку тачскрин у таких модулей резистивный (резистивный тач требует всего 4 сигнальных линии), то он сразу же включен в общий шлейф дисплея, делая дисплеи навигаторов и китайских консолей взаимозаменяемыми! Вот вам и идея, куда можно применить старый нерабочий авто-навигатор :)
Включаем устройство и проверяем новый дисплей. Всё работает отлично — цветопередача стала немного лучше по сравнению с родным дисплеем, а ещё на этом этапе выяснилось, что устройство висит на заставке. Но нам ещё есть что сделать по хардварной части.
После осмотра платы, на фронтальной стороне можно увидеть сгнивший SMD-элемент. Скорее всего, это ключ и я изначально предположил, что он отвечает за питание камеры (т.к находился близкой к ней). К сожалению, после того, как я счистил коррозию, оказалось что один пятачок и ножка ключа сгнили :( И чуть позже это стало серьёзной проблемой.
Не забываем почистить аналоговой стик от грязи и пыли. Подойдет спирт или контакт-клинер.
Программный ремонт
Поскольку консоль висела на заставке, нам предстояло найти прошивку и прошить устройство. Тут нам очень помогает Wayback Machine: ищемоф. сайт устройстваи пытаемся найти кликабельные ссылки на прошивку. В моём случае, ссылка была наяндекс диски файл был на месте!
Однако в архиве нет никакой инструкции: лишь софт для прошивки и сама прошивка. У меня был опыт с GP33003, поэтому я быстро разобрался: нам придется замкнуть пару ножек на чипе NAND. Для этого гуглим модель NAND и ищем даташит. В даташите смотрим на распиновку и ищем пины I/O — это сигнальные линии, в моём случае они находятся снизу, 5 и 6. Суть манипуляций проста: при загрузке, первичный загрузчик (Boot ROM) пытается загрузить вторичный загрузчик из встроенной памяти. Если зажата одна из сервисных кнопок (а таковых у этой консоли нет) или вторичный загрузчик найти не удалось (если плата только-только с конвейера), то он переводит консоль в режим прошивки с помощью фирменного софта. Замыкая сигнальные линии, отвечающие за ввод-вывод (и таким образом, выдавая билиберду вместо нормальных данных), мы обманываем первичный загрузчик и как-бы делаем вид, что в памяти нет системы и плата только-только с конвейера.
По итогу девайс определился и пошёл прошиваться фирменной программой без каких либо проблем. 5 минут и вуаля! Устройство уже загрузилось и предложило откалибровать тачскрин!
Собираем девайс и всё проверяем: кнопки работают, стик работает, всё замечательно! Или не совсем… а звук то где? Я полез менять динамик, предположив, что возможно он не перенес солёной ванны но всё оказалось куда печальнее. Ведь тот самый сгнивший ключ как раз относился к аудиотракту… Звука нет совсем, даже на подключение наушников устройство не реагирует… Вот обидно то, а? И Bluetooth у нас тоже нет. И ведь судя по всему, отлетел пятачок IN, а не GND :(
Но это не помешает нам попробовать потестировать консольку в эмуляторах и проверить её в играх. GP33003 — вполне бодрый чип, который тянет большинство эмуляторов вплоть до PS1. Попробуем поиграть в игры для NES, SMD, SNES и PS1. Справится ли она с ними?
Играем
Сначала я решил погонять парочку предустановленных игр: Fruit Ninja и Trial X. И обе игрушки шли отлично: за Trail X можно даже повспоминать про давно ушедшие годы Gravity Defied. Игра идёт стабильно, без каких-либо лагов. В целом, спокойно можно ставить нативные игры до ~2013-2014 года — они здесь пойдут хорошо.
Эмулятор PS1 в лице EPSXE без проблем дал настроить хардварные кнопки и попробовать поиграть в Time Crisis. FPS хороший, а как я понимаю, это далеко не самая легкая игра для PS1. Никаких лагов нет, но плавность звука, по понятным причинам, проверить нельзя. Автопропуск кадров делает своё дело (при этом рывков нет).
А вот эмуляторы классики, такие, как PS1 или SMD работают без нареканий. Ну если уж тяжелющий эмуль PS1 потянул, то с чего бы ему не тянуть 8 и 16 битки? Проблем никаких нет, все кнопки можно забиндить без танцев с бубном (виртуальный джойстик можно убрать).
И конечно же, консоль можно использовать в качестве простенького планшета. В ВК ленту полистать, или видос посмотреть (тут был бы HDMI кстати) — короче доступны почти все фишки планшетов 2012-2013 годов. Вполне неплохо, да?
Заключение
Копаться в этом девайсе было весело. Увы, но малину подпортил сгнивший ключ: со звуком от консоли было бы гораздо больше толку. Однако сама по себе концепция устройства очень классная и я понимаю, почему современные анберники в похожем дизайне и форм-факторе расходятся как горячие пирожки: это действительно удобно! И даже несмотря на довольно старое железо, если у вас есть подобный девайс, он всё ещё может оказаться вам полезным.
А вам как этот гаджет? Жду ваше мнение в комментариях! Кстати, если вдруг у вас есть подобные китайские консольки и вы не хотите с ними замарачиваться/не можете сами оживить — я их последнее время начал коллекционировать и оживлять из принципа. Авось кому-то данная в статье информация окажется полезной и вы сможете оживить свой ништяк?
Сам себе экосистема: Как я адаптировал старый смартфон под современные реалии и написал клиенты нужных мне сервисов
Время неумолимо бежит вперед: выходят новые гаджеты, постепенно заменяя старые, превращая их в тыкву или в лучшем случае, в «тапочек» для звонков. Сейчас смартфоны стали практически одинаковы во всем: дисплей на всю площадь передней панели, почти полное отсутствие аппаратных кнопок, беспроводная зарядка… Это всё, конечно, здорово, но ведь иногда так хочется взять в руки старый, но такой необычный в наше время QWERTY-смартфон и попытаться его использовать как основной, да и цены на них могут приятно удивить: БУ девайс можно купить за несколько сотен рублей (~5-10$). Одна проблема — клиенты приложений на версии Android 1.6-2.0 безбожно устарели и давно не работают. Но иногда желание воскресить старый девайс превыше потребительского качества и тут я пришёл к мысли… а почему бы не написать с нуля свои клиенты популярных приложений? ВК с музыкой, YouTube, трекинг посылок. Так я и сел писать необходимые в повседневной жизни приложения, с нуля, на голом API Android, без каких либо фреймворков (и даже AppCompat). Получилось ли у меня это? Узнаем в статье!
Мотивация
На самом деле копаться в старых девайсах и пытаться найти им применение — это очень интересное и затягивающее дело. Ведь зачастую попытки оживить девайс заключаются в прочтении большого количества мануалов, документации, копании в терминале, а иногда даже компиляции загрузчиков/ядер! И подобные занятия интересны на всех уровнях: хардварный, системный, прикладной и пользовательский. В предыдущих статьях мы с вами моддили девайсы на всех этих уровнях: ремонтировали «железные» болячки, написали несколько статей о системном моддинге и компиляции загрузчиков под неизвестные китайские устройства, а также узнавали о пользовательском опыте установки готовой кастомной прошивки на 7-летнее устройство.
Но до сегодняшнего дня мы с вами обходили прикладной уровень моддинга устройств: т. е. написание самых обычных, повседневных программ, без которых сложно представить жизнь современного человека. Ещё во времена выхода первого Galaxy S в 2010 году, многие из нас уже сутками красноглазили в Java версии «аськи», кто-то уже сидел в ВКонтакте, хоть и большинство не заглядывали в смартфон каждые пару минут для проверки нотификаций.
К 2012 году смартфонная жизнь уже стала похожа на ту, к которой мы привыкли сейчас — соц. сети, мессенджеры, пуши, потоковое видео — многие из нас успели привязаться к такой жизни и… к конкретно тем самым девайсам!
2012 год давно миновал, тенденции в разработке приложений кардинально поменялись, а учитывая, что многие мои читатели не любят выбрасывать девайсы в мусорку (и правильно делают), наверняка кто-то регулярно заглядывает на полочку к своим пыльным «бывшим» гаджетам и рассматривает их с теплотой… но с сожалением понимает, что их время прошло. Или не прошло? :) Ну, тут как посмотреть. Если есть навыки и огромная мотивация, то программер может многое, в том числе и запилить все самые необходимые приложения сам!
Я давно лелеял эту идею, подумывая, как бы лучше её реализовать. Да и почти всю свою жизнь, я писал на C#, практически не «щупав» API Android и его UI фрейморк. В один день у меня очень сильно зачесались руки написать что-нибудь эдакое под него и причём сразу — весьма серьёзное!
Всем этим устройствам более 10 лет. Самым молодым из них является реплика Lumia 1020, которую мы тоже успели замоддить!
Так и родилась идея написать клиент YouTube. А потом и ВК. Ну и трекинг в придачу. Ну а чего б и нет, на всё про всё я выделил себе неделю: за это время я должен успеть закончить пусть и сыроватые, но вполне юзабельные клиенты для моих любимых сервисов. И я начал думать…
Планирование
Написание приложений под старые мобильные ОС, как и под любые другие платформы, требует планирования того, что и как будет работать с учётом ограничений целевой платформы. У меня было сразу несколько ограничений, что только раззадоривало пыл:
В большинстве своём, на старых версиях Android работают одноядерные чипсеты, а значит, лимитированная многопоточность. Никакой работы в UI-потоке кроме обновления интерфейса, а поскольку в первых версиях этой системы интерфейс менее отзывчив, чем в более свежих — нужно сохранять баланс между функционалом, симпатичностью и скоростью работы. Мои приложения должны оптимально работать в следующих условиях: 256мб ОЗУ, из которых свободно в среднем 30-40мб (Сбер, привет тебе с вылетами на 2гб ОЗУ), 1 ядро ~600мгц, видео-ядро уровня Mali300-Malii400. Негусто? Ну, нам сойдет.
Вторым ограничением стало тотальное устаревание корневых сертификатов, а как многие из нас знают, просто так их на мобильных системах не обновить. Поэтому придётся идти на хаки — делать сервер-реле, который преобразует трафик из https в http там, где нельзя просто отключить проверку верификации SSL (это как раз кейс с API VK). Решено — отдельный сервер-реле, который отправляет запрос на сервер ВК и обратно возвращает нам обычный результат в JSON.
Ну а третьим ограничением стал сам Android. targetSDK = 5 (Android 1.5 Cupcake), никакого AppCompat (кушает драгоценное свободное место), никаких сервисов Google (их тут нет лет 5 уже). Всё на чистом API системы, почти в тех же условиях, в каких 13-14 лет назад писались первые приложения для Android.
Если я его раздобуду когда-нибудь, то в лепешку расшибусь, но портирую на него свои приложения. Тогда я с гордостью скажу, что мои приложения работают на 100% Android устройств %)
Полный энтузиазма я сел писать код. Основную часть статьи я решил поделить на каждое приложение отдельно с конкретными объяснениями: где, что и как я делал. Хочется заранее сказать — я не особо давно пишу под Android, зато много писал под WinForms, поэтому какие-то решения могут показаться странными. А некоторые решения обусловлены версией Android. Например, нотификации в первых версиях Android не было Notification.Builder, а сам Notification был больше похож на структуру. Приложения, конечно же, мы будем писать на Java.
ВКонтакте
Первым делом я начал писать клиент ВК и сразу определился со своими хотелками, которые были весьма скромными: возможность листать диалоги, читать сообщения и отправлять их (с полной поддержкой QWERTY-клавиатур, т. е. отправка на Enter), плюс возможность слушать музыку без ограничений. На ВК бочку ни в коем случае не гоню, просто публичного API совсем нет, даже с ограничениями, хотя было бы здорово…
Мне снова хотелось почувствовать те эмоции, которые я когда-то ощущал от прослушивания музыки будучи школяром со своим первым Android-смартфоном. В 2013 году я прилетал со школы и слушал плейлист на практически таком же девайсе с идентичным железом и версией Android. Я хорошо помню, как пользовался прелестями многозадачности Android на 2G интернете (3G чипсет просто не поддерживал): одну песню слушаешь, поставил вторую качаться, пока песня доиграет — уже и вторая скачалась. :)
Итак, хотелки выбраны, пора начинать писать приложение. Для дебага у меня было 3 устройства: Galaxy S4 (Android 4.2 JB), китайский Galaxy S3 Mini I9300 (Android 2.2, на фото выше) и Samsung Galaxy S I9000 (Android 2.3), ну и конечно же эмулятор с 4.4 KitKat. Android Studio и сейчас умеет без проблем собирать приложения вплоть до версии Android 2.2 даже с последними Build Tools и Target SDK — главное выкинуть appcompat, androidx, и юнит тесты из build.gradle. Без каких-либо проблем он цепляет и сами устройства по adb. Даже отладчик без проблем работает.
Первым делом я начал писать активити (полноэкранная форма в терминологии Android, или «экран» приложения) с диалогами — он должен раз в n секунд подгружать данные и строить «морду» для всего этого. По сути, почти весь код клиента — это получение ответа от API ВК, разбор JSON на датасет и визуализация этого датасета на экран. Для этого я ввёл два объекта: VK, который делает асинхронные запросы на сервер, оборачивает работу с сервером-реле и парсит JSON и VKObjectProcessor (это скорее всего отрефакторится до VKDataSet чуть позже).
Архитектура приложения получилось довольно простой и примитивной. При старте активити авторизации проверяет данные приложения (PersistStorage) на наличие API-токена и при его отсутствии запрашивает авторизацию. Как это уже стало классическим среди различных «самопальных» клиентов, мой клиент «прикидывается» официальным приложением ВК — для этого используется связка app_id и app_secret приложения ВКонтакте для Android.
После авторизации приложение перенаправляет нас на страницу диалогов. Поскольку у нас нет ни пушей, ни лонгполлинга, метод обновления остается один — в заданные интервалы. Для этого у нас есть Handler, который раз в 3.5сек берет список диалогов с сервера, проверяет, обновились ли данные и если да — обновляет датасет, отправляя сигнал обновления интерфейса (который построен на ListView). Кроме того, у нас есть кэш аватарок — точно так же распаралелленый на несколько потоков, а загруженные на данный момент превьюшки хранятся в хэшмапе.
При этом сообщения реализованы схожим образом — на данный момент возможности горячей подгрузки сообщений «сверху» нет, поэтому обновляются последние 50 сообщений скопом и сразу. Шустро ли всё это работает? Вполне неплохо. Конечно, основное процессорное время уходит на разбор тяжелых JSON, но тут отчасти вина ВК — мало того, что кастрировали функционал getHistory в последних версиях API, так ещё и нет возможности возвращать только те поля, которые нужны.
Как же я поступил с аудиозаписями? Музыка через API — настоящая заноза для разработчиков клиентов, с которой пришлось «подолбаться». Правда, недолго — раз у нас для основных запросов уже есть сервер-реле, то почему бы не сделать ещё и для музыки? Суть обхода простая: если сгенерировать специальный API-токен, то можно свободно обращаться к методам, связанным с музыкой без необходимости притворяться официальным клиентом и «подписывать» запросы md5 ключом. Примитивный PHP-скрипт как раз и предоставляет такую возможность, позволяя получить доступ к базе музыки ВК, однако ограничение типичное — у пользователя должны быть открыты аудиозаписи:
Тут был код на пхп, о его скушал пикабу!
По итогу у меня получился рабочий плеер с поиском музыки и добавленными треками. Опять же — производительность остаётся отличной! Ссориться с ребятами из ВК не хочу, поэтому добавлять возможность качать треки пока не стал — но вам стоило бы быть подружелюбнее к разработчикам кастомных клиентов! :)
Что мы получили по итогу? Довольно простенький клиент ВК, который практически не потребляет ОЗУ и шустро работает. Да, здесь не хватает кучи различных фич — как минимум, прсомотра ленты и стены. Но ещё успеется — если проект будет интересен не только мне, то продолжим наращивать фишечки потихоньку! Уже ближе к релизу я слегка причесал клиент, добавив более «вкшный» дизайн и приделал анимированное боковое меню. Про Animation ещё кто-то помнит? :)
YouTube
С разработкой клиента YouTube были свои особенности: во-первых, в отличии от клиента ВК, видео через реле просто так не загрузишь, слишком много трафика, а во-вторых, YouTube уже не «отдаёт» видео в форматах, которые поддерживают старые устройства — в основном, это h263 до 720p. К сожалению, потоковое видео с софтовым декодированием уложит на лопатки большинство «одноядерников» тех лет.
Ситуация осложнялась тем, что ни VideoView, ни стандартные плееры всех смартфонов, на которых я отлаживал приложение, не умели игнорировать ошибки SSL и просто валились с ошибкой. Пришлось что-то придумывать: ведь видосики хочется смотреть на крутейшем AMOLED дисплее Galaxy S!
Посидел я, подумал и придумал. Для поиска по базе YouTube, получения информации и прямых ссылок на видео я решил использовать альтернативный фронтэнд YouTube, который называется Invidous API — крутая штука со своим API, которая сама распределяет пул токенов самого ютуба и отдаёт ответы в виде JSON. Форматы запросов очень простые: <url инстанса Invidous>/api/v1/метод, например «search?q=test®ion=RU&hl=ru» — выдаст нам результат поиска «test» в Российском регионе. Очень удобно, да? А ещё Invidous — не какой-то отдельный сервис, а целая сеть т. н. инстансов — какой хочешь, такой и юзай! Поскольку большинство инстансов «прячется» за свежими сертификатами, пришлось идти на довольно известный костыль с отключением верификации хостнеймов у HttpUrlConnection:
А туть был костыль на Java.
А поскольку у нас нет возможности воспроизводить потоковое видео онлайн, то я решил его просто предварительно загружать через собственный менеджер закачек, с возможностью последующей очистки кэша. Поскольку таким устройствам 2060p качество не нужно, я выбираю 240p-360p mp4 в avc кодеке, в среднем ролики по 30 минут весят около 30-40 мегабайт. При HSDPA+, загрузка подобного видео займет около минуты-двух — не так уж и много, можно и подождать. Закинул тестовую версию в беседу любителей ретро-мобилок — люди были в восторге. ;)
Поскольку Invidous отчасти строится на анонимности — авторизации тут нет. Однако свою задачу посмотреть видосики он выполняет нормально — поэтому весь UI приложения я поделил на 4 вкладки: тренды, популярное, история и поиск. Подписки, как и историю можно реализовать на стороне клиента — для некоторых такой подход покажется плюсом, для кого-то — нет, однако минимальный задел для клиента уже есть — мы можем смотреть видео!
А где скачать?
Приложения и бэкэнд полностью открытые, исходный код доступен по лицензии GPLv3. Следить за статусом проекта можно на моём GitHub!
Последние версии можно скачать в релизах проекта.
Из текущих хотелось:
Портировать на Android 1.6. Несмотря на то, что приложение в целом имеет targetSDK = 5, на 2.1 оно работать отказывается. В Android, после 2.1, слегка поменялся бинарный формат xml разметок, из-за чего приложение на старых системах вылетает с исключением. Но это решаемо: eclipse adt в зубы, импортируем проект и вперед! ;)
Кроме того, я экспериментировал с попытками как можно сильнее уменьшить нагрузку как на сеть, так и на процессор путём облегчения датасетов. Если один JSON от ВК весит в среднем 30-60кб (который 1 ядерный чипсет частотой 600мгц может «долго» жевать, негативно сказываясь на UI), то примитивный KeyValue формат, который содержит только нужные поля умещается в 5-6-7кб в текстовом виде и благодаря своей примитивности (весь парсинг — два substring, один indexof и поиск ключа по хешмапе) совсем не «налегает» на процессор. Благодаря этим наработкам, я запилил и примитивный клиент ВКшечки для j2me.
В целом, можно сделать единый формат датасетов для мессенджеров, а на бэкэнде реализовывать всё что угодно — Telegram, ВК, да хоть личные сообщения на хабре, а для платформ только делать «морды»: так можно завести современные мессенджеры и на Sailfish, и на J2ME, и на Symbian, и на WinMobile, практически без пота и крови :)Полная адаптация под кнопочное управление. Сейчас с клиента можно без проблем писать сообщений с любой клавиатуры, в том числе и QWERTY. Однако основной интерфейс всё ещё не полностью адаптирован под кнопки и требует выполнения некоторых действий пальцем.
Заключение
Как по мне — получилось вполне неплохо. Да, приложения кое-где сыроваты и явно не дотягивают по функционалу до их больших версий. Но кое в чем они всё таки выигрывают: они лёгкие и быстрые, а самое главное — ещё могут продлить жизнь любимого девайса для кого-то. И я считаю — это классно! Среднее потребление ОЗУ обеими клиентами: 5-10мб. Вес APK: 30-50кб на момент выхода статьи. Вот что значит писать под голое API без модных фреймворков! ;)
Что до остального функционала — кое-что в Android продолжает неплохо работать и в наше время. Например, DLNA-стриминг в доме, E-Mail клиент или банкинг через смски. Я уверен, это покрывает 80% потребностей большинства пользователей — так разве после этого можно назвать старые смартфоны бесполезными?
Я писал эту статью с целью показать вам, что старые девайсы отнюдь не тыква, если есть щепотка энтузиазма в глазах и любовь к гаджетам, а заодно и поделиться с вами своими приложениями. Часто в комментариях мне пишут, что хотели бы пользоваться своими смартфонами и дальше, если бы не устаревающие версии Android. А вы как считаете? Жду ваше мнение в комментариях.
Статья подготовлена при поддержке компании TimeWeb Cloud. Подписывайтесь на меня и @Timeweb.Cloud, чтобы не пропускать новые статьи про девайсы каждую неделю! А ещё не забудьте проставить плюсик на хабре, если статья вам понравилась - это поможет с финансированием и выходом новых статей!
Если вы профи в своем деле — покажите!
Такую задачу поставил Little.Bit пикабушникам. И на его призыв откликнулись PILOTMISHA, MorGott и Lei Radna. Поэтому теперь вы знаете, как сделать игру, скрафтить косплей, написать историю и посадить самолет. А если еще не знаете, то смотрите и учитесь.
Редчайший открытый смартфон на Linux: Neo Freerunner. Каким был прадедушка PinePhone?
Автор: bodyawm
Оригинальный материал
Дополнительные фото и видео в источнике материала.
Слышали ли вы когда-то о PinePhone? Да, это проект открытого смартфона с полностью открытым ПО, который рассчитан не столько на конечного потребителя, сколько на всяческих гиков. Но ведь PinePhone был далеко не первым, а о его предке из далекого 2007 года помнят немногие. Мне удалось раздобыть редчайший Open-Source Linux смартфон, имя которому — Neo Freerunner aka GTA-02! Мы посмотрим, на что был способен этот коммуникатор в своё время, оживим его и подведем итоги: подходило ли такое устройство конечному потребителю. Интересно? Тогда добро пожаловать под кат!
❯ Предыстория
Идея создания телефона, который будет полностью открытым во всех отношениях — и в плане железа и в плане софта, витала в воздухе задолго до появления PinePhone или даже Google Nexus (его к открытым телефонам можно причислить лишь отчасти). Например, Motorola делала значительный вклад в развитие Linux на телефонах, таких как Moto RAZR v8 или A1200. Я не знаю, где сегодня можно найти исходный код ядра для этих смартфонов, но полагаю, Motorola предоставляла его по первому требованию. Однако такое решение было профитным во всех смыслах: была единая программная платформа, для портирования которой необходимо было лишь портировать Linux под конкретный BSP, а коммьюнити поддерживала эти телефоны ещё долгое время, умудрившись запустить на них даже OpenMoko:
Не была в стороне и TrollTech, тогдашний владелец и разработчик фреймворка Qt, который представил свой телефон (к слову, очень сильно напоминающий Sony Ericsson тех лет и был скорее девкитом, нежели полноценным устройством) GreenPhone, работающий на Linux и использующий интерфейс Qtopia, который был построен на базе Qt.
В какой-то момент TrollTech прекратили разработку GreenPhone, а его наработки передали сообществу OpenMoko, который и стал основной сегодняшнего аппарата.
Выделялась и Nokia, регулярно представлявшая новые модели в своей линейке интернет-планшетов (да, тогда они назывались именно так) под названием N. Работала она на базе собственной ОС Nokia — Maemo и имела корни от классического Debian. Несколько позже Nokia выпустит легендарный N900 — смартфон с большим на тот момент дисплеем, выдвижной клавиатурой и классическим Linux на борту.
К сожалению, как закончилась история для Nokia, мы уже с вами знаем: компания попыталась развивать свою новую Linux платформу MeeGo, но — пришёл дяденька из Microsoft на место CEO и резко сменил вектор развития компании с Linux смартфонов на устройства с Windows Phone. Однако старые гаджеты этой компании всё ещё ценятся на вторичном рынке, в том числе и планшеты серии N.
Кроме TrollTech, Motorola и Nokia, в Linux-сообщество смартфонов активно пыталась влиться и Google, причём изначально это были не коммуникаторы с тачскрином, а стандартные QWERTY смартфоны. Несколько лет назад на американской барахолке всплыло объявление о продаже вот таких девкитов от Google, которые работали на самых первых версиях Android, ещё до первой публично доступной 1.5, не имевшие даже тачскрина. Этот прототип был разработан в кооперации с настоящим мастодонтом мира коммуникаторов — HTC, который ещё долго помогал Google с дальнейшим развитием платформы.
Но всё же, устройства представленные выше, имели исходный код ядра (без бинарных блобов драйверов). Вероятно, также имели исходный код оболочки, однако они всё ещё оставались закрытыми проприетарными устройствами. И тут приходит тайваньская компания FIC — First International Computer, которая вместе с сообществом OpenMoko представляет первый полностью открытый смартфон. И имя этому первенцу: Neo 1973 (GTA-01)! Но что в данном контексте означает открытый? В чём было отличие от Motorola A1200?
Отличие в том, что производитель публично предоставлял всю документацию и исходный код на своё устройство. Она включала в себя: схему платы, разводку, исходный код загрузчика (изначально U-Boot, затем Qi), исходный код ядра почти со всеми драйверами, исходный код оболочки. И всё это под открытой лицензией сообщества. Например: если бы Motorola захотела производить свой Neo FreeRunner, она смогла бы это сделать без каких либо проблем или отчислений FIC. Всего было 4 итерации — GTA-01, GTA-02, GTA-03 и финальная, разработанная сообществом GTA-04.
Работали Neo 1973 и FreeRunner на базе чипсета Samsung S3C2442 с тактовой частотой 400Мгц (это было очень популярное решение для недорогих коммуникаторов, но чип уходил корнями в 2003), имела 64мб встроенной памяти и 128мб ОЗУ, встроенный GPS, Wi-Fi и даже OTG!
К сожалению, проект прожил всего лишь два года. В 2009 году OpenMoko прекратило работу над проектом и остались лишь сторонние разработчики, время от времени выпускавшие обновления и кастомные прошивки для своих устройств. В России официально устройство не продавалось, оно было слишком нишевым, но компания «Линуксцентр» завезла партию, которую распродала интересующимся энтузиастам. Кроме того, я видел ветку на ЛОРе (профильный российский форум о GNU/Linux), где люди хотели скооперироваться и вручную заказать партию устройств. Цена была равна 399$, что по тому курсу примерно 12 тысяч рублей.
И сегодняшнее устройство ко мне попало тоже не просто так, я не зря сказал что оно очень редкое. Маловероятно, что вы найдёте его на онлайн-барахолках. Мне было интересно посмотреть и пощупать это устройство вживую, своими руками, поэтому в один момент я решил создать топик с поиском данного девайса на linux.org.ru и купить его специально для статьи. Пожалуйста, не воспринимайте ссылку на ЛОР как рекламу, это один из самых популярных *nix форумов в РФ и в рекламе он не нуждается (специально для тех, кто читает данную статью не на Хабре).
Откликнулся пользователь id0, который предложил бесплатно подарить мне данное устройство, с моей стороны необходимо было оплатить автобус до отделения почты и пересылку. Сказано — сделано, доставка оплачена, а гаджет выслан, за что говорим id0 большое спасибо! В день, когда устройство было доставлено, ко мне пришла ещё и Nokia N70 в родной коробочке, которую вы можете видеть на видео.
Смартфон вышел почти 15 лет назад, но от него сохранился даже родной аккумулятор. И даже здесь FIC пошли в сторону унификации: местный аккумулятор — вольная вариация на тему BL-4C/BL-5C и сюда отлично подходит аккумулятор от большинства кнопочных Nokia. Неудивительно, что родной аккумулятор уже не держит, поэтому сюда отправляется мой любимый BL-6C!
Включаем устройство и хоба! В отличии от красивых бутанимаций этих ваших андроидов, здесь обычная консоль linux. И именно благодаря ей, я смог найти причину kernel panic, когда оживлял это устройство (Android при panic либо виснет, либо уходит в ребут, при этом dmesg никто не покажет).
Я почти уверен, что в своё время такая картина вызывала изумление, а возможно и восторженный возглас со стороны юниксовода! Конечно были проекты по портированию Linux на обычные коммуникаторы (например, на IPaq HX4700), но тут это всё из коробки!
Но всё было не так гладко, к сожалению, устройство было в состоянии кирпича. Система загружалась, но висла на этапе загрузки оболочки и система, как бы это правильно выразить, сама себя заряжала.
❯ Ремонт
Смартфон нужно было перепрошивать. Вики OpenMoko всё ещё работает, но все ссылки давно уже не рабочие и найти рабочий образ родной системы практически нереально. Система на OpenMoko устроена так: у нас есть загрузчик, это либо U-Boot, либо Qi (есть возможность менять их), есть ядро Linux и есть сама система — rootfs. И дистрибутивы тоже предлагались отдельно: отдельно скачивай u-boot, отдельно ядро, отдельно rootfs. И к сожалению ссылки на них давно не работают, даже в веб-архиве их нет! Увы.
Но в вики можно найти упоминания кастомных прошивок: GameRunner, QtMoko и SHR. И образ rootfs SHR мне удалось найти в закромах веб-архива! Для прошивки у нас есть два пути: загрузка с карточки micro-sd (да, прямо из коробки!) и прошивка образа в внутреннюю память с помощью режима dfu (это не тот же самый режим dfu, что в iPhone), и утилиты dfu-util.
Эта утилита умеет и дампить память, но заставить её работать на Windows у меня не вышло. Однако я заказал EEEPC для экспериментов за целых 700 российских рублей (~10$), куда я скорее всего поставлю Ubuntu и уже там постараюсь восстановить оригинальную прошивку. Поэтому наш сегодняшний путь — это установка на MicroSD флэшку. Я опишу мини-гайд по установке системы на MicroSD, а в конце предоставлю полный образ флэшки, который можно записать с помощью Win32DiskImager. Тут стоит понимать, что скорость NAND памяти смартфона не сильно выше скорости типичной MicroSD флэшки, поэтому на производительности это не скажется. А вот когда я переносил Android на MicroSD флэшку, там система откровенно думала!
Итак, для работы системы, флэшку необходимо разбить на два раздела: первый это FAT, второй EXT2/EXT3/JFFS. Под Windows этого сделать не выйдет: ставьте виртуальную машину (у меня, как назло, нормально не работала ни puppy, ни dsl), либо поступите как я.
Когда функций кардридера в хабе мне не хватает, я прибегаю к использованию одного из своих смартфонов, на котором у меня стоит TWRP с ROOT доступом через adb. В этом случае, для работ я использовал его, но все команды в статье должны работать под любым десктопным linux дистрибутивом. Только поменяйте имена разделов с /dev/block/mmc, на /dev/sdb или /dev/sdc. На этом смартфоне потихоньку помирает флэш-память и именно на нём я переносил систему на MicroSD! Использовать мы будем флэшку на 2гб, но обязательно либо SD, либо SDHC. SDXC Neo FreeRunner навряд-ли поддерживает.
Вставляем флэшку в слот MicroSD, загружаем вспомогательное устройство в рекавери, заходим в консоль и пишем adb shell. Теперь пишем:
fdisk /dev/block/mmcblk1
Удаляем существующие разделы с помощью d и создаём два раздела: один будет служить хранилищем для ядра и ваших личных данных, произвольного размера и второй под rootfs, на него нужно примерно 500 мегабайт. Записываем таблицу разделов и при необходимости перезагружаем устройство (на некоторых устройствах ioctl с требованием обновить таблицу разделов не проходит). Теперь форматируем первый раздел в FAT:
mkfs.fat /dev/block/mmcblk1p1
А второй в ext:
mke2fs -t ext2 /dev/block/mmcblk1p2
Под Windows закинуть ядро в FAT раздел не получится, он обязательно ломает суперблок второго раздела по какой-то причине! Поэтому создаём две точки монтирования:
mkdir /a/
mkdir /b/
И закидываем в них linux и рутфс. Ядро должно называться uImage.bin и должно находится в корне первого раздела. Рутфс необходимо распаковать из tar.gz. Делаем это так:
adb push uImage.bin /a/
adb push rootfs.tgz /b/
cd /b/
tar -xvf rootfs.tgz
Готово. Выключаем устройство, вытаскиваем флэшку, вставляем в Neo FreeRunner и зажимаем кнопку включения с кнопкой AUX. Появится меню загрузчика. Нам нужно выбрать загрузку с SD карты и перед нами будет такая картина (извиняюсь за грязь на устройстве, у него софттач покрытие, которое со временем начинает собирать на себя вообще всё подряд. Нужно оттереть спиртом):
Устройство загрузилось и работает, а система мимикрирует под iOS своим локскрином! Вообще, это кастомная прошивка, поэтому оценивать юзабилити устройство именно по ней не совсем корректно, но всё же прошивке есть что предложить.
❯ Обзор
Итак, это именно Linux, в качестве оконной системы здесь настоящие «иксы» и есть полноценная многозадачность, с возможностью расположить несколько окон на одном экране. Система работает очень нешустро, полная загрузка проходит примерно за полторы-две минуты, а звонилка открывается примерно секунды две, но возможно это издержки кастомной прошивки и на стоковой прошивке всё было хорошо. Во время написании статьи, мне один раз даже пришлось перезагружать устройство!
Вот так в этой прошивке выглядит главное меню. И это практически весь доступный софт: клиент pidgin, плеер, видеоплеер, целых два терминала, настройки, wifi, заметки и это практически всё! Открытие приложений занимает несколько секунд, но, полагаю, на OpenMoko дела обстояли гораздо лучше. Там таких тормозов не было, а SHR кроме GTA-02, работал ещё и на GTA-04 и HTC Hero вроде-бы.
Несмотря на наличие Wi-Fi модуля, подключится к домашней сети мне не удалось. Со стоковой прошивки, устройство к Wi-Fi подключалось. Надеюсь, хотя-бы GPRS тут работал!
Зато здесь куча настроек: темы, твики, настройки масштабирования, есть практически всё. Загрузка каждого подпункта занимает около секунды.
Но у устройства достаточно высокое разрешение экрана. Такое же, было, например у Nokia 5800, которая вышла в том же году.
Здесь есть аудиоплеер с эквалайзером, но даже он не умеет сам искать музыку хотя бы в домашней директории! Нужно руками добавлять папки. Выглядит не очень удобно.
Ну а ещё здесь, конечно же, есть терминал. По сути, это чуть ли не основной способ управления устройством, но виртуальная клавиатура очень неудобная. Если бы у этого устройства была бы QWERTY клавиатура, всё заиграло бы иными красками. Если систему грузить не с флэшки, то есть возможность передать в commandline ядра перенаправление консоли на usb, что позволит управлять мобилкой с ПК.
И это все приложения, что есть в данной прошивке. Я серьёзно! Однако статья уже получилась достаточно объёмной, поэтому Quake мы сюда собирать не будем!
❯ Заключение
Устройство имело перспективы, но было достаточно сырым. Скорее это была достаточно дорогая игрушка, ведь те, кто хотел себе коммуникатор, покупали в первую очередь решения на WinMobile. Те, кто хотел себе смартфон, брали устройства на Symbian. Те, кто хотел себе телефон, брали простую звонилку. Несколько более допиленной вышла небезызвестная Nokia N900, работавшая на ОС Maemo, но в ней из коробки даже поддержки USSD не было. Но вот, спустя столько лет вышел PinePhone и есть pmOS. Осталось ли его юзабилити на таком же уровне или всё стало гораздо лучше!? А какое ваше мнение?
Подпишись на наш блог, чтобы не пропустить новые интересные посты!