monobogdan

monobogdan

Топовый автор
На Пикабу
Дата рождения: 25 сентября 2001
maxup Nux76 user7333722
user7333722 и еще 49 донатеров
поставил 6 плюсов и 1 минус
отредактировал 2 поста
проголосовал за 2 редактирования

Собираем на ТАЗ для проекта

Именно Вы, читатели, помогаете с подготовкой новых статей - все деньги отправляются на покупку девайсов для будущих статей и оборудования! Спасибо всем, кто помогает - и морально, и материально!

800 29 200
из 30 000 собрано осталось собрать
Награды:
За участие в Авторской неделеболее 1000 подписчиков Высокий разум
40К рейтинг 1751 подписчик 0 подписок 156 постов 114 в горячем
TECHNO BROTHER

Красивый?

?
Всего голосов:
Показать полностью 1

Вот эти красавцы помогают готовить новые статьи!

Вот эти красавцы помогают готовить новые статьи!
Android

Жизнь после отвала eMMC. Часть 2: даём новую жизнь устройствам с полностью мёртвой памятью. Загружаем Android с MicroSD

Жизнь после отвала eMMC. Часть 2: даём новую жизнь устройствам с полностью мёртвой памятью. Загружаем Android с MicroSD Опрос, Покупка, Гаджеты, Смартфон, Обсуждение, Microsd, Android, Моддинг, Телефон, Девайс, Linux, Электроника, Emmc, UFC, Nand, Мобильные телефоны, Ремонт, Ремонтники, Видео, YouTube, Длиннопост

Отвал флэш-памяти типа eMMC - весьма частая болячка смартфонов и планшетов, которая массово преследует современные девайсы на протяжении вот уже более 10 лет. Симптомы проблемы знакомы многим читателям: смартфон виснет на заставке, системные приложения регулярно вылетают, или настройки системы внезапно перестают сохраняться. Сам процесс замены флэш-памяти требует навыков перекатки и пайки BGA-чипов, оборудования (трафареты для реболла, программатор с колодками, опционально подогрев) и понимания того, как работает загрузчик той или иной аппаратной платформы, поэтому в СЦ за эту процедуру могут взять достаточно большую сумму. На некоторых девайсах менять память уже совсем невыгодно, особенно когда другой такой-же аппарат стоит полторы тысячи рублей на барахолке, но воспоминания о любимом девайсе порой гораздо дороже, чем сумма за ремонт смартфона. Год назад я уже писал материал о загрузке Android с MicroSD при условии того, что eMMC ещё подает хоть какие-то признаки жизни, а сегодня я вам расскажу о способе загрузить систему с флэшки уже после того, как чип флэш-памяти отказал и ушёл в read-only. Сегодня мы с вами: узнаем о том, какие типы флэш-памяти существуют и причины их отказа, разметим MicroSD-флэшку и запишем на неё образ системы, пропатчим пути монтирования в boot.img, а также узнаем, как теперь запускать наш смартфон и посмотрим, сможет ли он работать достаточно шустро с MicroSD флэшки! Интересно узнать, как вернуть жизнь таким легендам, как Google Nexus? Тогда добро пожаловать под кат!

❯ Почему отказывает флэш-память?


Как я уже говорил в вводном абзаце, проблема внезапно отваливающейся флэш-памяти существует вот уже более 10 лет. Ещё с выходом iPhone 3Gs/4, мастера познакомились с такой болячкой, как внезапное падение устройства в режим DFU и отказ прошиваться через iTunes. Ближе к выходу Galaxy S III, HTC Desire и Wildfire, LG Nexus возникла потребность в программаторах, поскольку чипы eMMC в этих смартфонах очень часто помирали «сами по себе» из-за косяков производителя флэш-памяти. Более опытная часть моих пользователей может вспомнить такие проблемы, как отказ входа в HSPL (загрузчик HTC), бесконечная загрузка с отказом прошиваться в режиме Odin на самсунгах, падение смартфонов на базе чипсетов Qualcomm в режим 9008 (QHSUSB_BULK), а также внезапное прекращение работоспособности девайса даже при наличии адекватного потребления и реакции на кнопку включения.

Жизнь после отвала eMMC. Часть 2: даём новую жизнь устройствам с полностью мёртвой памятью. Загружаем Android с MicroSD Опрос, Покупка, Гаджеты, Смартфон, Обсуждение, Microsd, Android, Моддинг, Телефон, Девайс, Linux, Электроника, Emmc, UFC, Nand, Мобильные телефоны, Ремонт, Ремонтники, Видео, YouTube, Длиннопост

В относительно современных смартфонах используется два типа чипов флэш-памяти с разными протоколами: NAND и eMMC (в современных чаще используется UFS — наследник eMMC с дифференциальным протоколом, вместо MMC). Устройства конца 2000х годов чаще использовали флэш-память типа NAND с Legacy-протоколом, который требовал ручного управления SPARE-страницами и расчета кода коррекции ошибок (ECC), чем занималось отдельное периферийное ядро в процессоре, называемое NAND-контроллером. Момент, когда нужно «приговорить» флэш-память и перевести её в режим read-only решал не сам контроллер, а драйвер NAND в прошивке устройства — и обычно он был весьма лоялен даже к «сыпящейся» памяти. Кроме того, NAND-контроллер позволял практически напрямую взаимодействовать с чипом флэш-памяти, благодаря чему в загрузчиках типа U-boot есть команда для очистки таблицы Bad-блоков и низкоуровневого форматирования флэш-памяти, дабы в дальнейшем контроллер попробовал пересчитать бэды и, потенциально, вернул некоторое число блоков обратно в строй. Такой тип «флэшек» помирал значительно реже, в основном из-за того, что софт (на моём опыте) практически никогда не уводил флэшку в read-only, «добивая» её до последнего. Из минусов такого подхода — если флэш помирала совсем, то данные из нее можно было достать только с помощью программатора, да и то не факт.

Жизнь после отвала eMMC. Часть 2: даём новую жизнь устройствам с полностью мёртвой памятью. Загружаем Android с MicroSD Опрос, Покупка, Гаджеты, Смартфон, Обсуждение, Microsd, Android, Моддинг, Телефон, Девайс, Linux, Электроника, Emmc, UFC, Nand, Мобильные телефоны, Ремонт, Ремонтники, Видео, YouTube, Длиннопост

В моей довольно большой коллекции нет ни одного смартфона с Legacy NAND, где флэш бы действительно «приехала», хотя на форумах мастеров иногда встречаются старые сообщения о замене флэши на телефонах Nokia.

Второй тип памяти появился примерно в начале 2010х годов и имя ему — eMMC. Фактически, eMMC — это адаптация интерфейса MMC для использования в виде обычных чипов памяти, а не карточек, совместимая с спецификацией ~SDHC. Если выпаять чип с телефона и припаять сигнальные линии к обычному SD-кардридеру на ПК — он будет работать и определяться как полноценный диск! Таким образом, на некоторых смартфонах можно заменить eMMC на MicroSD напрямую припаяв флэшку на место чипа к соответствующим сигнальным линиям. Однако работать такое будет только если у вашего смартфона «бутербродная» компоновка, где ОЗУ припаяна поверх процессора (MTK и Spreadtrum в пролете). В eMMC используется память типа NAND, которой управляет не чипсет, а встроенный в сам чип памяти контроллер, работающий с протоколом MMC и имеющий собственную прошивку и карту бэд-блоков. Такая флэш-память может самостоятельно уходить в режим read-only когда это посчитает нужным контроллер, зачастую не давая смартфону загрузится, но при этом потенциально сохраняет данные пользователя и позволяет их прочитать дома (сделав дамп памяти устройства и смонтировав раздел userdata в Linux). Однако всё равно иногда данные теряются безвозвратно. Нюанс в том, что состояние eMMC определяет сам контроллер в чипе — поэтому «оживить» его дома и вывести из read-only невозможно. Однако я слышал, что на некоторых «бракованных» чипах памяти (в основном Samsung 2012-2013 годов), которые ушли в read-only слишком рано, можно подпаяться к тест-поинтам программатором и прошить чуть более свежую прошивку с другой ревизии этого же чипа памяти. Флэшка, бывало, оживала.

В некоторых случаях, eMMC были бракованными с завода и помирали сами по себе (!) через короткое время (около года) после покупки устройства. Я знаю как минимум два примера массового брака флэш-памяти: смартфоны HTC 2011-2012 годов, которые время от времени страдали от валящихся чипов Hynix (это касается не всех устройств, многие дожили), хотя я лично видел не так много HTC'шек с дохлой памятью, так что здесь читатели-сервисники с опытом работы в те годы могут только подтвердить или опровергнуть мои слова. А вот подтвержденный пример — смартфоны и планшеты Samsung 2012-2014 годов. Galaxy S3 с артефактами на дисплее при включении, S4 Mini в 9008 или повисшие на заставке, S4 с теми же симптомами, S4 Zoom, которые практически все померли «сами по себе» после обновления до 4.4 KitKat, N8000… Добавьте к этому слабые NC-пятаки, которые срывает при попытке снять чип феном, близко расположенный «бутербродный» процессор, который легко «убить», если орудовать феном, компаунд… и по итогу многие мастера просто спиливали чип дремелем. А что ещё делать!?

Жизнь после отвала eMMC. Часть 2: даём новую жизнь устройствам с полностью мёртвой памятью. Загружаем Android с MicroSD Опрос, Покупка, Гаджеты, Смартфон, Обсуждение, Microsd, Android, Моддинг, Телефон, Девайс, Linux, Электроника, Emmc, UFC, Nand, Мобильные телефоны, Ремонт, Ремонтники, Видео, YouTube, Длиннопост

По итогу, нам остаётся искать софтварные способы загрузить систему с внешней MicroSD флэшки. И я нашел два таких способа! Первый — предварительно подготовить образ boot.img и прошить его в смартфон вместо recovery, дабы если память ушла в read-only, мы могли просто «дуалбутнутся» во второй образ с пропатченными точками монтирования системных разделов на MicroSD. А о втором, к сожалению, знают лишь единицы, хотя это просто замечательный способ, который позволяет загрузить систему уже «пост-фактум» после ухода флэшки в read-only и требует некоторых манипуляций с fastboot! Давайте же рассмотрим его подробнее.

Жизнь после отвала eMMC. Часть 2: даём новую жизнь устройствам с полностью мёртвой памятью. Загружаем Android с MicroSD Опрос, Покупка, Гаджеты, Смартфон, Обсуждение, Microsd, Android, Моддинг, Телефон, Девайс, Linux, Электроника, Emmc, UFC, Nand, Мобильные телефоны, Ремонт, Ремонтники, Видео, YouTube, Длиннопост

Нашим подопытным будет рабочий смартфон Alcatel OT-5020D 2013 года выпуска, который пока не подает признаков помирающей eMMC: к сожалению, смартфонов с полудохлой памятью и разлоченным бутом у меня не оказалось, дохлые флэшки я иногда меняю и сам :) Но тем не менее, грузиться мы в любом случае будем с флэшки и вы сможете повторить все шаги в статье, дабы загрузить систему с MicroSD самому!

❯ Подготавливаем систему


Друзья! Для следующих действий, вам понадобится разблокированный загрузчик или устройство, на котором с завода загрузчик не заблокирован. Главный критерий — наличие режима fastboot.

  • Какие устройства не подойдут: многие смартфоны на базе чипов Spreadtrum, а также часть смартфонов Samsung на Exynos. Ни те, ни другие частенько не имеют режима fastboot от слова совсем. У Samsung есть режим загрузки с MicroSD (т. н. T-Flash Mode), но ядро он не грузит.

  • Какие устройства подойдут, но требуется подготовка: все смартфоны от Sony (исключение — Xperia Tipo, забагованный fastboot), Google Nexus (некоторые модели страдали из-за отвалов флэши), современные китайские новодельные noname-смартфоны (с вот таким патчем), Xiaomi, Meizu. Чипсеты: MediaTek 67xx/Qualcomm Snapdragon, возможно Kirin. Таким устройствам требуется предварительная разблокировка загрузчика.

  • Какие устройства подойдут даже при условии уже мертвой флэш-памяти: большинство девайсов на базе чипсетов MediaTek прошлого десятилетия, особенно бюджетных: MT6572, MT6582, MT6592, MT6580, MT6570, MT6575, MT83xx, некоторые Spreadtrum. Это касается Fly, Explay, ZTE и многих других ультрабюджетных смартфонов тех лет. Загрузчик там разблокирован с завода, никакого секьюрбута и верификации загружаемых образов нет. Но не везде можно загрузится в fastboot напрямую (попробуйте громкость вверх и громкость вниз при включении — если сразу грузится в рекавери, то нужно до отказа eMMC включить ADB, если показывает менюшку fastboot, recovery, normal boot — значит все ок).

    Не подойдут: MT6573, MT6571 — там U-Boot (но его тоже можно попробовать заставить грузиться с SD).


Список устройств для потенциальной возможности загрузки с SD весьма большой! Как понять, что eMMC «всё»?

  • Смартфон не реагирует на зарядку и кнопку включения при заряженной АКБ: это не 100% показатель, но если поднимаются питальники с КП и потребление от кнопки есть ~0.1-0.3А — значит процессор вероятно пытается стартовать. Но не откуда. В таком случае, девайс поднять не получится — доступа к fastboot нет, флэшка полностью посыпалась. Исключение — некоторые Qualcomm'ы при наличии прожженного фьюза с завода, разрешающего загрузку с MicroSD могут стартовать ядро, но всё зависит от конфигурации aboot.

  • Смартфон загружается и сразу вылетают приложения, настройки не сохраняются: явный показатель того, что флэша ушла в read-only потенциально не повредив данные. Если смартфон грузится в fastboot — его ещё можно оживить, но не факт что получится вытащить данные (из-за шифрования). Если после сброса до заводских настроек эффект остается тот-же — eMMC приехала 100%.

  • Смартфон висит на заставке, сброс и прошивка не помогает: тоже явная причина: eMMC в read-only. В таком случае, не рекомендуется еще раз шить смартфон в надежде что все заработает, есть шанс что флэша посыпеться окончательно и вы потеряете доступ к fastboot.


Весьма всё просто, согласитесь? Как я уже сказал выше, на некоторых устройствах нужно сначала разблокировать загрузчик. Кое-где это, вероятно, получится сделать и при том что флэша ушла в read-only. Например, на устройствах Sony можно без проблем зайти в fastboot и разлочить устройство с помощью кода, полученного на сайте Sony (используйте VPN, если вы в РФ):

Жизнь после отвала eMMC. Часть 2: даём новую жизнь устройствам с полностью мёртвой памятью. Загружаем Android с MicroSD Опрос, Покупка, Гаджеты, Смартфон, Обсуждение, Microsd, Android, Моддинг, Телефон, Девайс, Linux, Электроника, Emmc, UFC, Nand, Мобильные телефоны, Ремонт, Ремонтники, Видео, YouTube, Длиннопост

Как зайти в fastboot — вам придётся погуглить для конкретно своего устройства. Не нашли? Поищите как это делается на других смартфонах, которые работают на том же чипсете. Почти всегда можно зайти, если у вас включена отладка по USB с помощью команды:

adb reboot bootloader

Краткая справка: на устройствах Sony, в Fastboot можно зайти подключив устройство к ПК с зажатой громкостью вниз, на MTK громкость вверх или вниз, на HTC в HSPL, на Nexus'ах в фирменном загрузчике сразу режим Fastboot, на устройствах Tegra — включение с зажатой громкостью вверх, на смартфонах с чипсетом Intel есть fastboot, насколько помню зайти в него можно с помощью громкости вниз.

Команда для разблокировки загрузчика почти везде одна:

fastboot oem unlock

Вас могут запросить код разлочки или просто предупредить о последствиях такого действия. Как узнать, что бут разлочен?

fastboot getvar all

secure, locking и т. п. — отвечают за статус разлочки. Но даже если таких переменных нет, это не всегда значит, что загрузчик заблокирован. Возможно он разблокирован с завода :)

Теперь нам нужен образ раздела boot — boot.img. Его можно найти в файлах родной прошивки устройства, или, иногда, в zip-файлах кастомов. boot.img содержит в себе ядро Linux и небольшой раздел с файловой системой initrd (рамдиск), которая загружается в оперативную память и содержит в себе программы init, adbd, recovery, а также скрипты инициализации, которые управляют загрузкой Android и процессом зарядки (показывают анимацию, когда вы подключаете устройство выключенным к ЗУ. Да, в таком случае Linux тоже грузится!).
Если у вас есть доступ к fastboot, то попробуйте запустить его с помощью команды:

fastboot boot boot.img

Работать она будет не везде, на MTK её поддержка отключена в загрузчиках некоторых устройств. Если вы увидели на экране устройства USB Transferring — половину дела сделана! Если устройство показало лого и анимацию загрузки или ушло в ребут — потенциально, вы сможете загрузить Android с MicroSD. Если ошибка secure-boot — нужно сначала разблокировать загрузчик. Если unknown command — команда не поддерживается :(

Теперь у нас есть возможность загрузить ядро и пропатчить скрипты конфигурации, дабы изменить точки монтирования раздела /system/, /data/ и /cache/ на MicroSD-флэшку, вместо встроенной памяти.

❯ Записываем систему на MicroSD


Обратите внимание: Android очень интенсивно использует ресурс флэшки и постоянно перезаписывает сектора памяти, поэтому не поскупитесь купить нормальную MicroSD флэшку от, например, Transcend, Kingston или Samsung. Дешевые MicroSD флэшки очень-очень быстро (вероятно, за пару дней — это не шутка) выйдут из строя и придется делать всё заново!

Жизнь после отвала eMMC. Часть 2: даём новую жизнь устройствам с полностью мёртвой памятью. Загружаем Android с MicroSD Опрос, Покупка, Гаджеты, Смартфон, Обсуждение, Microsd, Android, Моддинг, Телефон, Девайс, Linux, Электроника, Emmc, UFC, Nand, Мобильные телефоны, Ремонт, Ремонтники, Видео, YouTube, Длиннопост

Сначала, нам придется разбить флэшку на три раздела: /system/, /cache/, и /data/. Раздел system будет первым, cache — вторым, data — третьим. При этом раздел /sdcard/ не нужен — он автоматически маппится в /data/media/ на современных версиях Android. Сделать это можно как с ПК с помощью MicroSD-адаптера и fdisk/diskpart/gparted, так и с самого смартфона с помощью того же fdisk в busybox. Я решил это сделать с помощью другого вспомогательного смартфона с TWRP, где изначально был root-доступ через adb! Размеры выбирайте следующие: для системного диска чуть больше или по размерам с system.img (раздел read-only и не «растет» со временем), cache — 100-200Мб, userdata — всё оставшееся место на флэшке.

Жизнь после отвала eMMC. Часть 2: даём новую жизнь устройствам с полностью мёртвой памятью. Загружаем Android с MicroSD Опрос, Покупка, Гаджеты, Смартфон, Обсуждение, Microsd, Android, Моддинг, Телефон, Девайс, Linux, Электроника, Emmc, UFC, Nand, Мобильные телефоны, Ремонт, Ремонтники, Видео, YouTube, Длиннопост

Разметили MicroSD? Теперь нам нужно записать на неё образ системы. Тут три пути: если у вас есть Linux-машина, то можете подмонтировать образ system.img из оригинальной прошивки и скопировать все файлы с сохранением прав, закинуть system.img в внутреннюю память другого смартфона с root-доступом и проделать все тоже самое, либо записать с помощью dd образ system.img напрямую в нужный нам раздел флэш-памяти. Я выбрал третий способ:

dd if=/sdcard/system.img of=/dev/mmcblk1p1

Жизнь после отвала eMMC. Часть 2: даём новую жизнь устройствам с полностью мёртвой памятью. Загружаем Android с MicroSD Опрос, Покупка, Гаджеты, Смартфон, Обсуждение, Microsd, Android, Моддинг, Телефон, Девайс, Linux, Электроника, Emmc, UFC, Nand, Мобильные телефоны, Ремонт, Ремонтники, Видео, YouTube, Длиннопост

Разделы cache и userdata можно просто форматировать в ext4:

mke2fs -t ext4 /dev/mmcblk1p2
mke2fs -t ext4 /dev/mmcblk1p3

Готово! Необходимые для базовой работы разделы перенесены на MicroSD. Теперь, когда, у нас есть образ системы, нам нужно распаковать родной boot.img устройства и поменять точки монтирования. Я использую кухню MTKImgTools. Идём в Boot -> Unpack -> boot.img. В Unpack/boot/ появятся файлы нашего раздела boot:

Жизнь после отвала eMMC. Часть 2: даём новую жизнь устройствам с полностью мёртвой памятью. Загружаем Android с MicroSD Опрос, Покупка, Гаджеты, Смартфон, Обсуждение, Microsd, Android, Моддинг, Телефон, Девайс, Linux, Электроника, Emmc, UFC, Nand, Мобильные телефоны, Ремонт, Ремонтники, Видео, YouTube, Длиннопост

Открываем файл init.rc (в случае MediaTek). Ищем строки с монтированием разделов вида emmc@system, emmc@cache, emmc@userdata и меняем их на /dev/block/mmcblk1p1, /dev/block/mmcblk1p2 и /dev/mmcblk1p3. На некоторых чипсетах, править нужно сразу fstab, или init.<чипсет>.rc:

Жизнь после отвала eMMC. Часть 2: даём новую жизнь устройствам с полностью мёртвой памятью. Загружаем Android с MicroSD Опрос, Покупка, Гаджеты, Смартфон, Обсуждение, Microsd, Android, Моддинг, Телефон, Девайс, Linux, Электроника, Emmc, UFC, Nand, Мобильные телефоны, Ремонт, Ремонтники, Видео, YouTube, Длиннопост

Готово! Собираем образ обратно с помощью Boot -> Pack -> boot.img и получаем образ, который нам и надо будет загрузить с помощью fastboot. Копируем boot.img в папку с adb и пробуем загрузить систему. Это будет основная команда для старта загрузки смартфона в будущем:

fastboot boot boot.img

Увидели бутанимацию? Значит система пошла загружаться, нужно лишь подождать первой загрузки 5-10 минут! Система висит на лого или уходит в ребут? Значит, возможно, вы неверно прописали точки монтирования, записали образ system или форматировали раздел userdata. Если система 4.4 и ниже, то можно изменить default.prop, заменив ro.secure на 0 и debuggable на 1. Если вы на Android 5+ — то заменить adbd (не требующий ключи авторизации) в /system/bin на вариант из TWRP и посмотреть logcat и dmesg. Монтируется ли /system/? Загружается ли app_process? На каком этапе стопорится? Всё это пригодится при дальнейшей отладке!

Жизнь после отвала eMMC. Часть 2: даём новую жизнь устройствам с полностью мёртвой памятью. Загружаем Android с MicroSD Опрос, Покупка, Гаджеты, Смартфон, Обсуждение, Microsd, Android, Моддинг, Телефон, Девайс, Linux, Электроника, Emmc, UFC, Nand, Мобильные телефоны, Ремонт, Ремонтники, Видео, YouTube, Длиннопост
Жизнь после отвала eMMC. Часть 2: даём новую жизнь устройствам с полностью мёртвой памятью. Загружаем Android с MicroSD Опрос, Покупка, Гаджеты, Смартфон, Обсуждение, Microsd, Android, Моддинг, Телефон, Девайс, Linux, Электроника, Emmc, UFC, Nand, Мобильные телефоны, Ремонт, Ремонтники, Видео, YouTube, Длиннопост

Например, такая ошибка при запуске adb shell означает то, что раздел /system/ не монтирован.

Ну а на моем девайсе система уже загрузилась и работает. Но насколько шустро? В комментариях читатели часто говорили, что из-за скорости MicroSD система будет не юзабельной. Насколько это правда? Давайте посмотрим!

Жизнь после отвала eMMC. Часть 2: даём новую жизнь устройствам с полностью мёртвой памятью. Загружаем Android с MicroSD Опрос, Покупка, Гаджеты, Смартфон, Обсуждение, Microsd, Android, Моддинг, Телефон, Девайс, Linux, Электроника, Emmc, UFC, Nand, Мобильные телефоны, Ремонт, Ремонтники, Видео, YouTube, Длиннопост

Вывод mount:

Жизнь после отвала eMMC. Часть 2: даём новую жизнь устройствам с полностью мёртвой памятью. Загружаем Android с MicroSD Опрос, Покупка, Гаджеты, Смартфон, Обсуждение, Microsd, Android, Моддинг, Телефон, Девайс, Linux, Электроника, Emmc, UFC, Nand, Мобильные телефоны, Ремонт, Ремонтники, Видео, YouTube, Длиннопост

Как мы и видим, /system/, /data/ и /cache/ на MicroSD. custpack и mobile_info, а также nvram трогать не нужно — если в родной флэше они не повреждены, то у девайса без проблем будет работать и сеть, и Wi-Fi.

❯ Можно ли пользоваться?


Наш девайс работает на базе Android 4.2 — казалось бы, совсем старенький дроид, но тем не менее ещё кое-что, да может. Alcatel OT — это бюджетный девайс из 2013 года, но работает он, на удивление, весьма шустро и приятно!

Жизнь после отвала eMMC. Часть 2: даём новую жизнь устройствам с полностью мёртвой памятью. Загружаем Android с MicroSD Опрос, Покупка, Гаджеты, Смартфон, Обсуждение, Microsd, Android, Моддинг, Телефон, Девайс, Linux, Электроника, Emmc, UFC, Nand, Мобильные телефоны, Ремонт, Ремонтники, Видео, YouTube, Длиннопост

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

Жизнь после отвала eMMC. Часть 2: даём новую жизнь устройствам с полностью мёртвой памятью. Загружаем Android с MicroSD Опрос, Покупка, Гаджеты, Смартфон, Обсуждение, Microsd, Android, Моддинг, Телефон, Девайс, Linux, Электроника, Emmc, UFC, Nand, Мобильные телефоны, Ремонт, Ремонтники, Видео, YouTube, Длиннопост

Как насчет браузера? Ставить последний хром, поддерживающий 4.2 смысла нет — уже и он открывает далеко не все сайты. Но те сайты, что пока ещё открывает стандартный браузер почитать ещё можно: например, opennet. На смартфонах с более свежим Android, браузер будет работать относительно адекватно. Зато с соц. сетями проблем особых нет. Telegram, конечно, может конкретно подвесить смартфон в процессе подгрузки картинок с каналов, но потом все будет нормально. Решение одно: отключить автоматическое кэширование картинок и видео!

Жизнь после отвала eMMC. Часть 2: даём новую жизнь устройствам с полностью мёртвой памятью. Загружаем Android с MicroSD Опрос, Покупка, Гаджеты, Смартфон, Обсуждение, Microsd, Android, Моддинг, Телефон, Девайс, Linux, Электроника, Emmc, UFC, Nand, Мобильные телефоны, Ремонт, Ремонтники, Видео, YouTube, Длиннопост

С записью видео ситуация сложная. Даже в профессиональных камерах для 1080p рекомендуются карточки не ниже 10-класса (10Мб/с) и UHS-класса для 2+K видео. На нексусе, это скорее всего превратит девайс в лагодром даже при записе 720p видео: система в фоне так или иначе регулярно читает и записывает данные и рано или поздно мы упираемся в дисковой кэш.

Об играх с динамическим стримингом ресурсов можно забыть, если флэшка достаточно медленная — будут лаги.

Жизнь после отвала eMMC. Часть 2: даём новую жизнь устройствам с полностью мёртвой памятью. Загружаем Android с MicroSD Опрос, Покупка, Гаджеты, Смартфон, Обсуждение, Microsd, Android, Моддинг, Телефон, Девайс, Linux, Электроника, Emmc, UFC, Nand, Мобильные телефоны, Ремонт, Ремонтники, Видео, YouTube, Длиннопост

А в динамике это всё выглядит так:


Достаточно шустро, для смартфона 2013 года за 4 тыщи рублей?

❯ Заключение


Сегодня мы с вами узнали, каким же образом можно перенести систему на MicroSD! Да, сработает далеко не на всех девайсах, однако сам способ может помочь поднять сотни устройств обратно в строй и сделать их полезными! Это всяко лучше, чем распаивать потенциально рабочие девайсы на «доноров» или, тем-более, отправлять их на мусорку или в чермет. С современными версиями Android ситуация сложнее: и не только из-за большего числа необходимых для загрузки разделов, но и из-за возросших требований к скорости флэш-памяти (упомянутые выше UFS работают на скорости ~500Мб/с), а также, внезапно, стремительно исчезающего слота для MicroSD :(

Надеюсь, материал вам был полезен! Сегодняшняя статья подготавливалась специально в «классическом», более коротком стиле с максимумом конкретики. Если вам больше нравится такой формат, нежели подробный на 15-20+ минут на чтения — напишите в комментариях!

Кстати, если у кого-то из читателей есть ненужные устройства (в том числе с косяками) или дешевые китайские подделки на айфоны/айпады/макбуки и другие брендовые девайсы будучи нерабочими, тормозящими, или окирпиченными и вам не хотелось бы выкидывать их на свалку, а наоборот, отдать их в хорошие руки и увидеть про них статью — пишите мне в Telegram или в комментах! Готов в том числе и купить их. Особенно ищу донора дисплея на китайскую реплику iPhone 11 Pro Max: мой ударник, контроллер дисплея калится и изображения нет :(

А ещё у меня есть Telegram-канал, куда я публикую различные заметки по ремонту, программированию и моддингу девайсов, свои мысли и вовремя публикую ссылки на новый материал!

Полезный материал?
Всего голосов:

Статья подготовлена при поддержке TimeWeb.Cloud. Подписывайтесь на меня и @Timeweb.Cloud, чтобы не пропускать новые статьи каждую неделю!

Показать полностью 18 1 1

Насчет ТАЗика

Короче пост скорее какой-то крик души, поэтому прошу отнестись более взрослую часть моей аудитории с пониманием, а может даже поделится советом. Для тех, кто видит пост в свежем, а не в ленте, то контекст в моём блоге на Пикабу @monobogdan (я более полутора лет пишу статьи о подручном ремонте, аппаратном и программном моддинге, а также о программировании под девайсы прошлых лет. Одна из будущих рубрик, которую точно буду вводить - доработка тачки в плане дооснащения по самому дешману с разработкой своего электронного блока с нуля).

Ни для кого из давних читателей не секрет, что я достаточно молод - на данный момент мне 22. В целом, в таком возрасте у родителей жить пока ещё не зазорно, если бы не одно но: нюанс в том, что меня частенько пытаются гиперопекать и в некоторой степени - пытаются подавлять волю. Батя ровно до момента заработка первых серьезных бабок говорил мол рукожоп, нежизнеспособный и прочие "приятные" словечки в мой адрес, при этом понимая, что я от него завишу. Как только появилась фин. независимость - сразу нападки в этом плане в мою сторону прекратились. Особенно когда я x2-x3 зарабатывать от его ЗП начал :)

Однако ситуация повторяется уже с тачками. Что 4 года назад, при покупке жиги мне говорилось мол "рукожоп, мне потом ее делать за тебя" и прочие приятные слова в мой адрес, что сейчас при разговоре с продавцами "а, да мне под ней лежать", "ты нихуя не умеешь" (только уже не в общем плане, а "гайки крутить") и прочие подобные тезисы. Зная себя, я хорошо поддаюсь обучению, особенно когда мне это действительно интересно - поэтому не сомневаюсь, что и с ТАЗиками через время справлюсь. И понимаю, что не могу оставаться таким "скованным" всю жизнь и зависеть от бати с точки зрения ковыряния в тачках.

Меня часто сравнивают с мурком, как по внешности, так и по любимым увлечениям. И если взять его опыт, то пацан буквально с подросткового возраста без особой помощи от бати ковырял ТАЗы с пацанами и чему-то да научился. Да, пусть современную бэху он в соло не может обслужить (это вообще только единицы могут), но руки у него совсем не из жопы.

Так может и мне положить хуй на мнение своего бати, купить, самому потихоньку подлатывать, а где не смогу без ямы - отгонять к корешам в гаражи и за n-сумму делать?

Просто на ТАЗ у меня конкретные планы: он не должен быть дороже 110 тысяч рублей и с ним я планирую начать параллельно со статьями выкладывать видосы на ютуб, это будет, скажем так, платформа для старта новой рубрики в блоге и проект частично себя окупит. Можно сказать, эдакое вложение в долгосрочную перспективу (новая аудитория, выход на ютуб параллельно со статьями).

Батя же ожидает, что за сотку надо найти и с пихлом живым, и коробкой не выбивающей, и кузовней живой - но извините, девятосиков в целом мало живых осталось, а пример сторонников "НУ ПОДКОПЛЮ ЕЩЕ 100К ВОЗЬМУ X2 ОТ РЫНКА ЗАТО БУДУ ЕЗДИТЬ 100 ЛЕТ И НЕ ЗНАТЬ ПРОБЛЕМ" мы прям в ГСК и видели при осмотре 99: стояла десятка, визуально очень хороша, брали её ~300-350к... и уже снимали ГБЦ :) Я не уточнял, зачем именно, но четко слышал что тачка встала.

Че думаете?

Всего голосов:
Показать полностью 1
Android

Сам себе экосистема. Часть 4: как я реализовал клиент Telegram на Android-смартфоне 14-летней давности?

Сам себе экосистема. Часть 4: как я реализовал клиент Telegram на Android-смартфоне 14-летней давности? Программирование, Гаджеты, Смартфон, Покупка, Android, Java, Код, Приложение, Telegram, ВКонтакте, Научпоп, Клиенты, Программа, Софт, Кейс, Гик, Электроника, Видео, YouTube, Длиннопост

С момента выхода первой части статьи из рубрики «сам себе экосистема» прошёл уже практически год! За это время, мы успели с вами реализовать клиенты VK и YouTube, которые работают на Android 2.2+, а также на Windows Phone 8, написать небольшую 2D-игру с нуля весом менее 1Мб, которая работает практически везде и довести существующее приложение до ума, дабы оно работало даже на смартфоне с дисплеем 240x320! Но на дворе 2024 год, люди стремительно переходят из соц. сетей в продвинутые мессенджеры и уже сложно себе представить современного человека, который не пользовался бы «телегой» или даже «вайбером» в качестве основного средства общения. Поэтому я решил реализовать клиент Telegram на смартфоне 14-летней давности на базе официальной реализации MTProto от команды Telegram — TDLib. Сегодня мы с вами: узнаем новые причины мотивации вернуть в строй смартфоны прошлых лет, напишем на C# реле-сервер, который обрабатывает пакеты MTProto и кодирует их в простой текстовый формат датасетов, который можно моментально обработать даже при нестабильном GPRS-соединении на 21-летнем Siemens C60, а также узнаем о разработке миниатюрных Android-приложений на базе «голого» API-системы, которые не тянут за собой никаких зависимостей, в том числе и AppCompat/androidx. Интересно? Тогда жду вас под катом!

❯ Содержание

  1. Но зачем всё это?

  2. Архитектура приложения

  3. Реализация сервера и работа с TDLib

  4. Android-приложение

  5. Как запустить клиент?

  6. Заключение

❯ Но зачем всё это?


На дворе уже стукнул 2024 год, современные смартфоны предлагают какие-то немыслимые мощности относительно тех, которые когда-то были в первых Android-девайсах. Сейчас за сотню баксов можно купить смартфон с хорошей 1080p IPS-матрицей, 4Гб ОЗУ и 8-ядерным шустрым чипсетом, который вполне способен плавно тянуть даже стремительно «жиреющие» на ресурсы клиенты социальных сетей, банков и прочие необходимые в повседневной жизни приложения.
И казалось бы: всё хорошо, покупай себе редмик раз в год или айфон раз в несколько лет и наслаждайся всеми прелестями работы современных приложений…

Сам себе экосистема. Часть 4: как я реализовал клиент Telegram на Android-смартфоне 14-летней давности? Программирование, Гаджеты, Смартфон, Покупка, Android, Java, Код, Приложение, Telegram, ВКонтакте, Научпоп, Клиенты, Программа, Софт, Кейс, Гик, Электроника, Видео, YouTube, Длиннопост

Для многих людей смартфон — это лишь инструмент, повседневный компаньон, который помогает облегчить выполнение каких-то задач. Им совершенно не важно, как он выглядит, как ощущается в руках, какой у него дисплей и железо «под капотом», лишь бы работал да и нормально. Но есть и другая категория людей, для которых телефоны, смартфоны и любые портативные гаджеты — это не просто утилитарный девайс, а настоящее инженерное произведение искусства, с которого буквально сдувают пылинки и стараются до последнего пользоваться ими как повседневными устройствами. Хотите пример? Смотрите ниже:

Сам себе экосистема. Часть 4: как я реализовал клиент Telegram на Android-смартфоне 14-летней давности? Программирование, Гаджеты, Смартфон, Покупка, Android, Java, Код, Приложение, Telegram, ВКонтакте, Научпоп, Клиенты, Программа, Софт, Кейс, Гик, Электроника, Видео, YouTube, Длиннопост

Фактически, среди современных смартфонов по сути и нет представителей такого нынче вымершего форм-фактора, как сайдслайдеры с физической QWERTY-клавиатурой, боковые раскладушки с двумя дисплеями и даже из QWERTY-моноблоков есть только смартфоны от Unihertz. Даже среди моноблоков с тачскринами нет никакого разнообразия, лишь без-рамочные одинаковые девайсы за исключением устройств от Sony.

Сам себе экосистема. Часть 4: как я реализовал клиент Telegram на Android-смартфоне 14-летней давности? Программирование, Гаджеты, Смартфон, Покупка, Android, Java, Код, Приложение, Telegram, ВКонтакте, Научпоп, Клиенты, Программа, Софт, Кейс, Гик, Электроника, Видео, YouTube, Длиннопост

Galaxy S Plus

Раньше меня часто спрашивали, мол, да как ты вообще можешь пользоваться смартфоном 10-летней давности, на котором давно нет официальных клиентов популярных сервисов и только недавно, с развитием блога, мне перестали задавать этот вопрос, поняв, что это бесполезно — ведь это дело принципа и порыва энтузиазма! Смотрите сами: у нас уже есть простенькие, но вполне рабочие клиенты ВК, YouTube, сейчас я допиливаю клиент «Сбера» на СМСках, реализую карты OpenStreetMap (правда пока без адекватной навигации), а в будущем планирую написать приложение для мониторинга погоды и трекинга посылок. Кроме того, в рамках этой статьи мы реализуем с вами клиент Telegram: так чем же это не функционал современного смартфона?

Сам себе экосистема. Часть 4: как я реализовал клиент Telegram на Android-смартфоне 14-летней давности? Программирование, Гаджеты, Смартфон, Покупка, Android, Java, Код, Приложение, Telegram, ВКонтакте, Научпоп, Клиенты, Программа, Софт, Кейс, Гик, Электроника, Видео, YouTube, Длиннопост

Но хорошо, с функционалом разобрались, однако для многих читателей слова «старый смартфон» это прямые синонимы «тормозной смартфон», мол «фуу, да как можно пользоваться этим тормозным кирпичом, он же лагает в последней версии моей ВКшечки!». Но давайте поставим вопрос ребром: может, это не столько девайсы немощные, сколько сами приложения, с кодовой базой, которая тянется более 10 лет, откровенно жиреют, обрастают костылями и хаками после далеко не одного поколения программистов, которые над ними работали? :) Один, вот, предпочитал пользоваться чистым AppCompat'ом, другой решил притащить зависимость, которая, например, оптимизирует виртуализацию ListView, третий решил заменить всю сериализацию Json со встроенных классов в Android на что-то стороннее и реализовал это костылями и вот так, по чуть-чуть изначально оптимальный и шустрый код превращается в неповоротливое УГ, которое не рефакторили кучу лет.

На видео Galaxy Pocket Neo — очень дешёвый Android-смартфон из 2011 года с 1-ядерным чипсетом на ~800МГц и 256Мб ОЗУ. При этом всём, Android софтварно рисует все анимации на процессоре, без участия GPU.

А значит у стареньких девайсов всё равно есть шанс быть полезными и стать полноценными повседневными смартфонами даже спустя более чем десять лет после выхода! И в сегодняшнем материале, я вам расскажу об особенностях разработки самопального клиента Telegram с собственным прокси-сервером, которое концептуально допускает реализацию даже на кнопочном Siemens C60 2003 года. Как? Читаем ниже!

❯ Принцип работы


В отличии от ВК (который разрабатывали те же самые люди, что и Telegram), API которого построено на базе REST-запросов и концепции Longpolling'а для моментального получения событий с сервера, Telegram построен на базе собственного протокола под названием MTProto, который может работать поверх любого «транспорта» (протокола нижнего уровня) — TCP, HTTP, WebSocket и т.п. Сам по себе MTProto в современном виде, разработка прожженного математика Николая Дурова и его команды — протокол относительно сложный для реализации «на коленке» и в первую очередь требует довольно серьезного понимания принципов работы современной криптографии, да и документирован он всё ещё не особо хорошо. Кроме того, у MTProto весьма интересный бинарный формат пакетов, эдакий велосипед Protobuf. В долгосрочной перспективе поддерживать свой велосипед MTProto может быть весьма проблематично, учитывая не самую лучшую документацию.

Сам себе экосистема. Часть 4: как я реализовал клиент Telegram на Android-смартфоне 14-летней давности? Программирование, Гаджеты, Смартфон, Покупка, Android, Java, Код, Приложение, Telegram, ВКонтакте, Научпоп, Клиенты, Программа, Софт, Кейс, Гик, Электроника, Видео, YouTube, Длиннопост

Но городить велосипед и не нужно, поскольку у команды Telegram есть официальная реализация MTProto — библиотека TDLib, которая инкапсулирует в себе не только детали реализации протокола, но и сетевой ввод/вывод и выбор транспорта, хранение базы данных сообщений и авторизации, автоматическую загрузку фото и видео, конвертация объектов из бинарного формата MTProto в JSON и полная многопоточность и частичная потоко-безопасность. С одной стороны это плюс — уже готовое решение для реализации клиента на новой поддерживаемой платформе, где есть OpenSSL (можно статически слинковать), zlib (линкуется статически), сокеты и файловый ввод/вывод, а также довольно неплохой механизм JSON-based API, которое позволяет использовать библиотеку в любом языке, который поддерживает вызов C-функций, а с другой и минус — библиотека довольно много весит, в одиночку прибавляя ~20Мб веса приложения для каждой архитектуры, у неё течёт память и у нее странный механизм получения данных с сервера (например, нельзя ответить на сообщение, зная его ID, если сообщение предварительно не загружено, при том что на сервере весь ответ — это просто ID, на какое сообщение прилетел ответ).

Понятное дело, что на стареньком смартфоне использовать оригинальный TDLib будет проблематичным — даже если собрать либы современным NDK и запилить JNI-интерфейс, библиотека «жрёт» много ОЗУ (20-100Мб «вхолостую», в зависимости от числа диалогов и частоты прилетающих событий, плюс со временем течет до 1-2Гб, если не использовать базу данных сообщений. Скорее всего, это косяк в реализации пулов, объекты из которых выгружаются при сбросе в базу, но не выгружаются при высоком потреблении ОЗУ) и уж тем-более TDLib не запустить на любимых кнопочных Java-сонериках! Поэтому я решил написать прокси-сервер, который отправляет команды, слушает ивенты TDLib и предоставляет REST-like API для клиентских программ, которые просто вызывают какой-либо метод, а в ответ получают простой и короткий строковой датасет только с необходимыми полями, весом до 10Кб (что позволяет его быстро загрузить даже с GPRS-интернетом), который можно быстро распарсить даже на преусловутом Siemens C60!

Сам себе экосистема. Часть 4: как я реализовал клиент Telegram на Android-смартфоне 14-летней давности? Программирование, Гаджеты, Смартфон, Покупка, Android, Java, Код, Приложение, Telegram, ВКонтакте, Научпоп, Клиенты, Программа, Софт, Кейс, Гик, Электроника, Видео, YouTube, Длиннопост

К сожалению, поскольку TDLib прожорлив, я не смогу захостить на своём сервере инстансы для читателей, которые хотят поюзать приложение, поэтому вам придется ставить и запускать сервер на своём VDS/компьютере с белым IP/роутере, если под него есть .NET Core :)

Клиентом же будет выступать Android-смартфон, где приложение будет фронтэндом данных с сервера. Ничего сложного на первое время нет: первое окно — это список диалогов, второе окно — список сообщений в диалоге + поле для написания сообщения, третье окно — информация о пользователе. Всё это я реализовал за три дня не-напряжной работы «на коленке».

Давайте же перейдем к реализации сервера!

❯ Прокси-сервер


Сервер я решил писать на C#, поскольку у .NET Core сейчас всё очень хорошо с кроссплатформенностью и производительностью. Его можно даже на Raspberry Pi запустить :)

Итак, какая-же архитектура такого сервера может быть? Программа инициализирует TDLib, начинает слушать её события в отдельном потоке, пока в основном потоке крутится HTTP-сервер, который обрабатывает каждый отдельный запрос с клиентского приложения. Почему синхронно? Потому что TDLib фактически не возвращает никаких идентификаторов для возвращаемых датасетов, дабы их можно было отличить друг от друга. Приведу пример: у нас есть метод getChatHistory, который возвращает n-сообщений. При этом TDLib сам определяет, сколько хочет сообщений вернуть (и в первый вызов возвращает одно сообщение вне зависимости от настрое и отправляем пакет message n-раз. При этом в пакете message нет какого-либо ID, который позволял бы ассоциировать текущий объект с какой-либо операцией. Увы!

Начинаем с коммуникации с TDLib. Для работы с библиотекой, мы будем использовать json-интерфейс. Для .NET есть биндинги через C++/CLI, но в таком случае, сервер не будет работать на Linux. Для работы с библиотекой хватит лишь три функции: CreateClientID, которая аллокейтит новый инстанс клиента, Send, которая асинхронно отправляет JSON-объект с командой, которую затем обработает TDLib и Receive, которая ждёт N-секунд и возвращает в виде ASCII-строки (!) JSON-объект с описанием события или данными после одного из запросов. За это у нас отвечает класс TDLibInterface, который объявляет PInvoke-методы для вызова нативных методов из библиотеки. .NET Core сам подгрузит библиотеку tdjson (причём на Linux он добавит ей префикс а-ля libtdjson.so, а на Windows загрузит tdjson.dll) и сам разберется с маршаллингом аргументов функций: например, string автоматически преобразует в const char*. Тем не менее, с const char* возвратами нужно быть аккуратнее — у меня был SIGSEGV, пока я ручками не конвертировал их в обычную строку.

З.Ы: На Пикабу нет отдельного тега для кода, а вставить листинги картинками я не могу из-за ограничения на 25 медиаэлементов. Так что листинги будут совсем без табов, но алгоритм их работы понять можно :)

[DllImport(Library, EntryPoint = "td_create_client_id", CallingConvention = CallingConvention.Cdecl)]
public static extern int CreateClientID();

[DllImport(Library, EntryPoint = "td_send", CallingConvention = CallingConvention.Cdecl)]
public static extern void Send(int id, string request);

[DllImport(Library, EntryPoint = "td_receive", CallingConvention = CallingConvention.Cdecl)]
private static extern IntPtr RawReceive(double timeOut);

[DllImport(Library, EntryPoint = "td_execute")]
public static extern StringBuilder Execute(string request);

public static unsafe string Receive(double timeOut)
{
IntPtr str = RawReceive(timeOut);

return str != IntPtr.Zero ? new string((sbyte*)str.ToPointer()) : null;
}

Позволю себе чуточку критики в сторону TDLib. Во первых, почему нет s-версии функции с возможностью указать длину входной строки, а tdjson полагается исключительно на \0 в конце строки? Во вторых, почему const char*, а не wchar_t*? Сейчас юникод во входной строке приходится escape'ами превращать в \u-последовательности.
После этого, нам нужно написать обёртку над TDLib, которая будет вызывать для зарегистрированных событий специальные функции, называемые коллбэками. При этом закомментированный WriteLine снизу — это «дебаг» для того, чтобы узнать названия неизвестных мне ивентов :)

В каждом объекте, полученном с помощью receive, есть поле "@type", которое содержит в себе имя класса возвращаемого объекта. Первый же вопрос от читателей — почему я использую JObject с ручным дерганьем нужных полей и вручную пишу JSON в виде строковых литералов вместо нормальной сериализации/десериализации? Ответ прост: во-первых, для актуализации Data-классов придется писать кодогенератор из TL-схемы, а во-вторых иногда TDLib может возвращать немного разные объекты в JSON, из-за чего приходится мудрить с атрибутами на этих самых Data-классах, иначе десериализатор выбросит исключение. Это решается нормальными юнит-тестами на всех вариантах данных, но зачем себе в колени стрелять, если нужен конкретный фиксированный функционал и лишь малое число от всех полей, возвращаемых TDLib?

string recv = NativeInterface.Receive(10.0d);

if (recv != null)
{
JObject json = JObject.Parse(recv);

string type = json["@type"].ToString();

if (!handlers.ContainsKey(type))
{
//Console.WriteLine("Unknown event type: {0}", type);
continue;
}

handlers[type](recv, json);
}

Теперь переходим к самому интересному — обработке событий и реализации синхронного клиента, который позволяет без async/await просто запросить список сообщений и сразу же его получить (такой подход может быть полезен и юзерботам, которые не хотят размазывать стейты по всей программе). Почему без асинков? Честно сказать, мне они просто не нравятся: как привык к концепции wait/notify и коллбэков из Java, так их и юзаю всю жизнь :)

Сначала TDLib запрашивает параметры инициализации (стейт authorizationStateWaitTdlibParameters), затем если пользователь не авторизован — запрашивает номер телефона и код подтверждения (плюс дополнительные шаги для авторизации если они есть). В конце, TDLib возвращает стейт Ready, что означает готовность библиотеки к работе:

private void OnAuthState(string raw, JObject obj)
{
JObject authState = (JObject)obj["authorization_state"];
string type = authState["@type"].ToString();

if (type == "authorizationStateWaitTdlibParameters")
{
Console.WriteLine("Preparing TDLib parameters...");
NativeInterface.Send(InstanceID,
Utils.Format("{" +
"\"@type\": \"setTdlibParameters\", " +
"\"database_directory\": \"tdlib\", " +
"\"api_id\": {0}, " +
"\"api_hash\": \"{1}\", " +
"\"use_chat_info_database\": true," +
"\"use_file_database\": true," +
"\"use_message_database\": true," +
"\"system_language_code\": \"en\", " +
"\"device_model\": \"Phone\", " +
"\"application_version\": \"1.0\" " +
"}", APIId, APIHash));
}

if (type == "authorizationStateWaitPhoneNumber")
{
Console.WriteLine("Sending phone number");
NativeInterface.Send(InstanceID, Utils.Format("{\"@type\": \"setAuthenticationPhoneNumber\", \"phone_number\": \"{0}\" }", PhoneNumber));
}

if(type == "authorizationStateWaitCode")
{
NativeInterface.Send(InstanceID, Utils.Format("{\"@type\": \"checkAuthenticationCode\", \"code\": \"{0}\" }", WaitCode));
}

if(type == "authorizationStateReady")
{
Console.WriteLine("Authorized");

waitHandle.Set();
}
}

...

Client.AttachEventHandler("updateAuthorizationState", OnAuthState);

После этого, можно начать работу с данными. Обратите внимание, мой подход потоко-небезопасен, его нельзя дергать из нескольких потоков одновременно! В коде ниже, я вызываю метод для фетча сообщений, а затем в соответствующем коллбэке от TDLib обрабатываю данные (дабы статья не разрасталась на 20+ минут, я чуть урезал все листинги).

public List<Message> QueryMessagesInChat(long chatId, long lastMessage, int count)
{
messages.Clear();

requestMessageCount = count;
string json = Utils.Format("{\"@type\": \"getChatHistory\", \"chat_id\": \"{0}\", \"from_message_id\": {1}, \"limit\": {2} }", chatId, lastMessage, count);
NativeInterface.Send(InstanceID, json);

waitHandle.WaitOne();
return messages;
}

public User QueryUser(long userId)
{
string json = Utils.Format("{\"@type\": \"getUser\", \"user_id\": \"{0}\" }", userId);
NativeInterface.Send(InstanceID, json);

waitHandle.WaitOne();
return user;
}

Переходим к реализации самого сервера, для наших целей хватит обычного HttpListener. Сначала мы зарегистрируем все поддерживаемые методы и занесем их в ассоциативный список ключ-значение. Сами методы реализованы в виде делегатов, которые принимают лишь один аргумент — список параметров из строки запроса, а возвращают строку — все ответы, за исключением особых (связанных с загрузкой вложений) — текстовые.

private HttpListener listener;
private List<HttpMethodHandler> methods;
private ScheduledRestart restartManager;

private void AddMethod(HttpMethodHandler info)
{
if(info != null)
{
methods.Add(info);
Console.WriteLine("Registered method: {0}", info.Method.Name);
}
}

private void PrepareMethods()
{
AddMethod(Chats.QueryChats);
AddMethod(Chats.QueryMessages);
AddMethod(Chats.SendMessage);
AddMethod(Users.QueryUserInfo);
}

private void PrepareState()
{
// We should fetch dialog list due to TDLib nature of preloading-everything
Client.QueryChats(15);
}

public HttpServer()
{
listener = new HttpListener();
listener.Prefixes.Add("http://+:13377/");

Client = new SyncClient("test");
Client.Start();
Client.WaitUntilReady();

//restartManager = new ScheduledRestart(5);
//restartManager.Start();

methods = new List<HttpMethodHandler>();
PrepareMethods();
PrepareState();
}


...

public void Start()
{
listener.Start();

while(listener.IsListening)
{
HandleRequest(listener.GetContext());
}
}

Переходим к обработке запроса. Метод ищет, зарегистрирован ли запрошенный метод и если да, то парсит строку запроса, которая начинается с "?", которую затем передаёт в виде коллекции ключ->значения обработчику метода:

private void HandleRequest(HttpListenerContext ctx)
{
string method = ctx.Request.Url.LocalPath.Substring(1).ToLower();

if (method.Length < 0)
{
SendResponse(HttpGenericResponse.MethodRequired.ToString(), ctx);
return;
}

foreach(HttpMethodHandler handler in methods)
{
if(method == handler.Method.Name.ToLower())
{
string result = "";

if (ctx.Request.Url.Query.Length > 0)
{
string[] args = ctx.Request.Url.Query.Substring(1).Split('&', StringSplitOptions.RemoveEmptyEntries);
Dictionary<string, string> keyValuePairs = new Dictionary<string, string>();

foreach (string arg in args)
{
if (arg.IndexOf('=') >= 0)
keyValuePairs.Add(arg.Substring(0, arg.IndexOf('=')), arg.Substring(arg.IndexOf('=') + 1));
else
keyValuePairs.Add(arg.Substring(0, arg.IndexOf('=')), "");
}

result = handler(keyValuePairs);

if (result == null || result.Length < 1)
{
Console.WriteLine("Suspicious result from {0}", handler.Method.Name);
}
}

SendResponse(result, ctx);
return;
}
}

SendResponse(HttpGenericResponse.UnknownMethod.ToString(), ctx);
}

А сами методы, в свою очередь, дергают соответствующие функции из клиента и формируют на их основе датасет в примитивном формате:

public static string QueryChats(Dictionary<string, string> args)
{
if(args.ContainsKey("count"))
{
int count = int.Parse(args["count"]);
StringBuilder ret = new StringBuilder();

List<Chat> chats = HttpServer.Instance.Client.QueryChats(count);
ret.AppendLine(string.Format("Count={0}", chats.Count));

foreach(Chat chat in chats)
{
ret.AppendLine("Begin");
ret.AppendLine("ID=" + chat.ID);
ret.AppendLine("Date=" + chat.LastMessageDate);
ret.AppendLine("Name=" + chat.Name);
ret.AppendLine("Text=" + Uri.EscapeDataString(chat.LastMessageText));
ret.AppendLine("MsgId=" + chat.LastMessageID);
ret.AppendLine("End");
}

return ret.ToString();
}

return HttpGenericResponse.InternalException.ToString();
}

В результате получаем вот такой простой датасет, который, как я и говорил, легко распарсить и на Siemens C60, и на Atmega328 — да где угодно! В целом, такой сервер можно использовать для реализации бота в телеграме, который будет передавать показания каких-то датчиков, сигнализацию и прочие клевые штуки!

Сам себе экосистема. Часть 4: как я реализовал клиент Telegram на Android-смартфоне 14-летней давности? Программирование, Гаджеты, Смартфон, Покупка, Android, Java, Код, Приложение, Telegram, ВКонтакте, Научпоп, Клиенты, Программа, Софт, Кейс, Гик, Электроника, Видео, YouTube, Длиннопост

Переходим к реализации клиента, т.е. приложения на Android. Здесь будет не менее интересно!

❯ Пилим для Android


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

Поскольку у нас с вами мессенджер, то главный экран должен представлять из себя список чатов (ListView) и верхнюю панельку, где в будущем могут разместиться настройки и свайп-менюшка:

Сам себе экосистема. Часть 4: как я реализовал клиент Telegram на Android-смартфоне 14-летней давности? Программирование, Гаджеты, Смартфон, Покупка, Android, Java, Код, Приложение, Telegram, ВКонтакте, Научпоп, Клиенты, Программа, Софт, Кейс, Гик, Электроника, Видео, YouTube, Длиннопост

Такой вот простой макет.

Каждый пункт меню — это тоже отдельный layout, в котором мы по шаблону строим внешний вид будущего элемента списка. На немолодых устройствах есть смысл использовать как можно меньше контейнеров в layout'е, поскольку пересчет позиций и размеров элементов — одна из самых «тяжелых» операций в UI-фреймворке вообще. Кроме того, не стоит использовать кучу картинок и drawable — в Android 2.x всё 2D рисуется софтварно, аппаратное ускорение появилось только в 3.0 (частично).

Сам себе экосистема. Часть 4: как я реализовал клиент Telegram на Android-смартфоне 14-летней давности? Программирование, Гаджеты, Смартфон, Покупка, Android, Java, Код, Приложение, Telegram, ВКонтакте, Научпоп, Клиенты, Программа, Софт, Кейс, Гик, Электроника, Видео, YouTube, Длиннопост

Но дабы в списке диалогов что-то появилось, нужно сначала реализовать фетчинг (получение) этих самых диалогов с сервера! Сам объект, который занимается обработкой запросов называется ClientManager и является синглтоном — он в единственном экземпляре на все время работы программы. Помимо менеджмента «ноды» (т.е. прокси-сервера), токена для авторизации и обработчика ошибок, ClientManager реализует метод для асинхронного запроса информации с сервера и, собственно, формирует строки запросов с помощью соответствующих методов:

public void queryChats(int count, Response resp) {
sendRequest(String.format("%s/QueryChats?count=%d&auth_key=%s", nodeAddress, count, token), resp);
}

Подгрузка чатов и сообщений реализована через Adapter — концепция «виртуальных» списков, которая предполагает что система создаст не 50 элементов интерфейса на каждую кнопку чата, а только 5 и будет их виртуально «мотать по кругу», обновляя только данные в уже существующих элементах. Это позволяет значительно ускорить отрисовку, учитывая то, что Android 2.x Canvas рисуется программно.

Сам себе экосистема. Часть 4: как я реализовал клиент Telegram на Android-смартфоне 14-летней давности? Программирование, Гаджеты, Смартфон, Покупка, Android, Java, Код, Приложение, Telegram, ВКонтакте, Научпоп, Клиенты, Программа, Софт, Кейс, Гик, Электроника, Видео, YouTube, Длиннопост

private void updateDialogList() {
ClientManager.getCurrent().queryChats(50, new ClientManager.Response() {
@override
public void onReady(String str) {
try {
List<Packets.Chat> chats = Packets.parseChatListFromQueryResponse(str);

DialogAdapter adapter = new DialogAdapter();
adapter.setChats(chats);

((ListView) findViewById(R.id.messages_view)).setAdapter(adapter);
} catch (Exception e) {
Toast.makeText(MainActivity.this, "Упс!", Toast.LENGTH_SHORT);
}
}
});
}

Ну вы уже явно замучились видеть простыни кода, давайте посмотрим что у нас вышло!

Шустренько, да? А ведь это ультрабюджетник Alcatel OT-916D, один из последних массовых дешевых QWERTY-смартфонов за 5 000 рублей из 2012 года. Кстати, смартфон подарил мне читатель chuvakoff с Хабра!

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

Сам себе экосистема. Часть 4: как я реализовал клиент Telegram на Android-смартфоне 14-летней давности? Программирование, Гаджеты, Смартфон, Покупка, Android, Java, Код, Приложение, Telegram, ВКонтакте, Научпоп, Клиенты, Программа, Софт, Кейс, Гик, Электроника, Видео, YouTube, Длиннопост

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

view.setOnCreateContextMenuListener(new View.OnCreateContextMenuListener() {
@Override
public void onCreateContextMenu(ContextMenu contextMenu, View view, ContextMenu.ContextMenuInfo contextMenuInfo) {
// Reply to...
contextMenu.add(getString(R.string.reply)).setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem menuItem) {
setReplyContext((Packets.Message) view.getTag());

return true;
}
});

// Copy
contextMenu.add(getString(R.string.copy)).setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem menuItem) {
ViewGroup vg = (ViewGroup)view;

android.text.ClipboardManager manager = (android.text.ClipboardManager) view.getContext().getSystemService(CLIPBOARD_SERVICE);
manager.setText(((TextView)vg.findViewById(R.id.message_content)).getText());

return true;
}
});

// Send to...
contextMenu.add(getString(R.string.resend)).setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem menuItem) {
ViewGroup vg = (ViewGroup)view;
String text = ((TextView)vg.findViewById(R.id.message_content)).getText().toString();

Intent intent = new Intent();
intent.setAction(Intent.ACTION_SEND);
intent.putExtra(Intent.EXTRA_TEXT, text);
intent.setType("text/plain");
startActivity(Intent.createChooser(intent, null));

return true;
}
});
}
});

Переходим к реализации поля для ввода сообщения. Здесь всё просто — на серверсайде за это отвечает метод SendMessage. Однако для того, чтобы с нашего клиента можно было ответить на другие сообщения, я ввёл также «контекст ответа», в котором запоминается сообщение, на которое мы хотим ответить. Telegram также поддерживает Markdown, однако его полная поддержка пока не реализована.

EditText editText = ((EditText)findViewById(R.id.message_text));

if(editText.getText().length() > 0) {
long replyTo = replyContext != null ? replyContext.ID : 0;

ClientManager.getCurrent().sendTextMessage(chat.ID, editText.getText().toString(), replyTo, new ClientManager.Response() {
@Override
public void onReady(String str) {

}
});

editText.setText("");
setReplyContext(null);
}

В остальном же, функционал конечно пока совсем базовый, однако клиент работает очень шустро даже бюджетной X10 Mini Pro и позволяет чатится с моими читателями в Telegram. В будущем хотелось бы допилить:

  • Поддержка картинок: Сейчас уже есть кривоватый механизм кэширования изображений на стороне сервера, который позволяет загружать аватарки чатов. В будущем, я добавлю поддержку «галерей» с картинками!

  • Поддержка голосовых сообщений: Не все их любят, но они порой удобны и выручают. Реализую как прослушивание, так и запись!

  • Подробный просмотр профилей и менеджмент чатов: Удаление сообщений, чатов и прочие фишечки из официальных клиентов.

    Казалось бы — до официальных клиентов ещё очень далеко. Но сам факт, чтобы всё это работало достаточно шустро на девайсах, которым уже более 10 лет!

❯ Звучит интересно! Как заюзать твой клиент?


Тут всё очень и очень просто! В первую очередь, нам понадобится ПК с белым IP, роутер (если под него есть сборка dotnet), либо VDS. Виртуальные сервера сейчас стоят копейки, у ТаймВеба есть тариф за 188 рублей в месяц, которого с головой хватит для нашего сервера.

Сам себе экосистема. Часть 4: как я реализовал клиент Telegram на Android-смартфоне 14-летней давности? Программирование, Гаджеты, Смартфон, Покупка, Android, Java, Код, Приложение, Telegram, ВКонтакте, Научпоп, Клиенты, Программа, Софт, Кейс, Гик, Электроника, Видео, YouTube, Длиннопост

Такая вот рекламная интеграция (к слову, прокси для всех приложений уже более года крутятся именно на мощностях TimeWeb Cloud)!

Берём уже собранный TDLib и сервер под Windows, или собираем TDLib под Linux, накатываем .NET Core. Пример для Debian/Ubuntu:

sudo apt-get install dotnet

Затем запускаем сервер:

dotnet tdsrv.dll

Программа сначала запросит номер телефона, а затем код подтверждения Telegram. После этого будет создана папка tdlib/, где будут хранится данные вашей сессии, а также файл authkey.txt, где хранится случайный ключ для сессии (md5 phone_number + response code + псевдослучайное число). Не оставляйте его в /var/www/!

Сам себе экосистема. Часть 4: как я реализовал клиент Telegram на Android-смартфоне 14-летней давности? Программирование, Гаджеты, Смартфон, Покупка, Android, Java, Код, Приложение, Telegram, ВКонтакте, Научпоп, Клиенты, Программа, Софт, Кейс, Гик, Электроника, Видео, YouTube, Длиннопост

Если всё нормально, программа начнёт слушать порт 13377 на всех сетевых интерфейсах, в т.ч и в локальной сети. После этого, ставим уже предварительно собранный, либо собираем сами в Android Studio APK и в окне авторизации пишем адрес ноды и ключ авторизации. Если всё настроено верно — программа запомнит сервер и будет работать без проблем! Вот так всё легко :) Как видите — всё очень и очень просто!

Сам себе экосистема. Часть 4: как я реализовал клиент Telegram на Android-смартфоне 14-летней давности? Программирование, Гаджеты, Смартфон, Покупка, Android, Java, Код, Приложение, Telegram, ВКонтакте, Научпоп, Клиенты, Программа, Софт, Кейс, Гик, Электроника, Видео, YouTube, Длиннопост

Кроме того, буквально за пару дней до публикации статьи я сел вечерком из интереса что-нить под Java-телефоны попилить… и, как и обещал, реализовал Proof of Concept возможности работы Telegram даже на сонериках, которым скоро 20 лет стукнет! А ведь если ещё чуть заморочится, можно запустить приложение даже на преусловутых монохромных сименсах!

Сам себе экосистема. Часть 4: как я реализовал клиент Telegram на Android-смартфоне 14-летней давности? Программирование, Гаджеты, Смартфон, Покупка, Android, Java, Код, Приложение, Telegram, ВКонтакте, Научпоп, Клиенты, Программа, Софт, Кейс, Гик, Электроника, Видео, YouTube, Длиннопост

❯ Заключение


Вот такой у нас получился проект с реализацией лёгкого, примитивного, но тем не менее рабочего клиента Telegram, который на клиентской части вообще не использует никаких зависимостей. Вес собранного APK в release-версии — всего 54 килобайта! Понятное дело что с ростом функционала, вес программы будет увеличиваться, но я обещаю — больше 1Мб он не вырастет :)

Сам себе экосистема. Часть 4: как я реализовал клиент Telegram на Android-смартфоне 14-летней давности? Программирование, Гаджеты, Смартфон, Покупка, Android, Java, Код, Приложение, Telegram, ВКонтакте, Научпоп, Клиенты, Программа, Софт, Кейс, Гик, Электроника, Видео, YouTube, Длиннопост

Ну а вам, моим читателям, надеюсь было интересно прочитать такой «двойной материал» не только о разработке сетевой части без использования Apache/nginx/IIS, но и UI-фронтэнда для Android-смартфонов, которым уже более 10 лет!
Исходный код проекта можно найти на моём GitHub: как приложения, так и сервера, а также убедиться в отсутствии каких либо закладок и, если совсем не доверяете, собрать бинарники сами! Для сборки понадобится VS2017 или свежее, а также Android Studio 2.3.2 (если собираете для Android 2.1 и ниже).

Сам себе экосистема. Часть 4: как я реализовал клиент Telegram на Android-смартфоне 14-летней давности? Программирование, Гаджеты, Смартфон, Покупка, Android, Java, Код, Приложение, Telegram, ВКонтакте, Научпоп, Клиенты, Программа, Софт, Кейс, Гик, Электроника, Видео, YouTube, Длиннопост

Друзья! Сейчас на Хабре опросы сломаны, поэтому если у вас есть желание, вы можете проголосовать в комментариях: какой стиль статей вам больше нравится — где больше конкретики и кода с пояснением как конкретно работает та или иная часть программы, или наоборот стиль ближе к научпопу, где фрагментов кода нет, или их значительно меньше? Пишите своё мнение о проекте в комментариях!

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

Статья подготовлена при поддержке TimeWeb Cloud. Подписывайтесь на меня и @Timeweb.Cloud, чтобы не пропускать новые статьи каждую неделю!

Показать полностью 18 2
Android

В среду выйдет новый подробный материал из рубрики "сам себе экосистема"

Где я подробно рассказываю о том, как реализовал клиент современного мессенджера Telegram на Android 1.5+ и выше. Таким образом, Telegram будет работать даже на самом первом Android-смартфоне в мире, T-Mobile G1, причём на стоковой прошивке!

В среду выйдет новый подробный материал из рубрики "сам себе экосистема" Опрос, Покупка, Программирование, Гаджеты, Смартфон, Java, Android, Ретро, Ништяки, Мобильные телефоны, Приложение, Гик, Электроника, Linux
Интересно?
Всего голосов:
Показать полностью 1 1
TECHNO BROTHER

Исходников нет, но мы не сдадимся: как и зачем я портировал более старый Android, чем стоял «с завода»?

Исходников нет, но мы не сдадимся: как и зачем я портировал более старый Android, чем стоял «с завода»? Смартфон, Покупка, Гаджеты, Программирование, Android, Телефон, Ретро, Девайс, Ништяки, Linux, Портирование, Научпоп, Видео, Без звука, Длиннопост

Моддинг-сцена с разработкой и портированием кастомных прошивок для 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 скачал, дабы попытаться что-то своё запилить под собственный смартфон! В общем, я был счастлив, несмотря на лаги девайса. Именно того девайса у меня уже давным-давно не осталось… но память я всё ещё храню и стараюсь дать новый дом таким китайчикам, которые в большинстве своем оказались на свалке истории в новом мире современных смартфонов!

Исходников нет, но мы не сдадимся: как и зачем я портировал более старый Android, чем стоял «с завода»? Смартфон, Покупка, Гаджеты, Программирование, Android, Телефон, Ретро, Девайс, Ништяки, Linux, Портирование, Научпоп, Видео, Без звука, Длиннопост

Но на самом деле, смартфоны 10+ летней давности могут быть интересны и своим форм-фактором: в современном мире едва ли можно найти хоть какие-то телефоны с полноценной QWERTY-клавиатурой (исключение — смартфоны UniHertz, которые стоят недешево) и уж тем более, боковые слайдеры. Поэтому мой интерес к подобным девайсам очень легко объяснить!

Исходников нет, но мы не сдадимся: как и зачем я портировал более старый Android, чем стоял «с завода»? Смартфон, Покупка, Гаджеты, Программирование, Android, Телефон, Ретро, Девайс, Ништяки, Linux, Портирование, Научпоп, Видео, Без звука, Длиннопост

Однако, порой мне самому хочется снова пережить эти эмоции и ещё раз походить с подобным девайсом «на каждый день», даже когда на Android 2.2 особо никакие сервисы уже не работают. Отчасти, я решаю свои проблемы сам и пишу клиенты нужных мне сервисов, если они действительно нужны, дабы рано или поздно всё таки вдохнуть новую жизнь в «старенькие» девайсы. И казалось бы, это можно списать на синдром утёнка и банальную ностальгию, но мои ощущения «ламповости» отнюдь не мимолетны и всё равно меня тянет именно на те смартфоны, с тем самым интерфейсом, которые я когда-то увидел впервые!

Исходников нет, но мы не сдадимся: как и зачем я портировал более старый Android, чем стоял «с завода»? Смартфон, Покупка, Гаджеты, Программирование, Android, Телефон, Ретро, Девайс, Ништяки, Linux, Портирование, Научпоп, Видео, Без звука, Длиннопост

Пожалуй, сказать что я решил портировать старый Android на отнюдь не новый смартфон «просто так» было бы ложью. Я всё ещё верю в то, что смогу в одиночку хотя бы частично вдохнуть новую жизнь в эти девайсы и позволить им работать с современными сервисами, дабы они могли приносить пользу не только мне, но и другим людям, которые намеренно занимаются дауншифтингом или вынуждены сидеть на девайсах с старыми версиями Android! Сегодняшним нашим подопытным станет один из представителей подобных noname-смартфонов тех лет, реплика Galaxy S III Mini на том самом железе, на котором работал мой первый смартфон. Однако с завода на нём стоял Android 2.3 — слишком свежая, по моему мнению, версия системы, которую я конечно-же захотел откатить до Android 2.2!

Исходников нет, но мы не сдадимся: как и зачем я портировал более старый Android, чем стоял «с завода»? Смартфон, Покупка, Гаджеты, Программирование, Android, Телефон, Ретро, Девайс, Ништяки, Linux, Портирование, Научпоп, Видео, Без звука, Длиннопост

Задача облегчалась тем, что смартфоны на этом чипсете с 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 — фирменной утилите для прошивки смартфонов на этом чипсете.

Исходников нет, но мы не сдадимся: как и зачем я портировал более старый Android, чем стоял «с завода»? Смартфон, Покупка, Гаджеты, Программирование, Android, Телефон, Ретро, Девайс, Ништяки, Linux, Портирование, Научпоп, Видео, Без звука, Длиннопост

Я решил взять прошивку от FeiTeng N9300 Mini, родная для моего смартфона — M-Horse 9500 Mini. В случае моего девайса, разметка и список разделов между устройствами никак не отличалась, поэтому изначально я напрямую прошил раздел system.img, дабы посмотреть что будет с устройство. Не забывайте, что ядро и init.rc хранится в образе boot.img — поэтому прошивка раздела system безопасна!

Исходников нет, но мы не сдадимся: как и зачем я портировал более старый Android, чем стоял «с завода»? Смартфон, Покупка, Гаджеты, Программирование, Android, Телефон, Ретро, Девайс, Ништяки, Linux, Портирование, Научпоп, Видео, Без звука, Длиннопост

❯ Первый запуск


После прошивки чужого раздела system, смартфон стартовал… однако работал несколько странно: во первых, у нас не было сети, во вторых не работал тачскрин (при родном то ядре), а в третьих, Android ни в какую не видел аккумулятор, вися на 0% и моментально отключаясь, если смартфон не стоит на зарядке, а при попытке воткнуть кабель — смартфон показывал индикацию зарядки, но потребление было на нуле.

Исходников нет, но мы не сдадимся: как и зачем я портировал более старый Android, чем стоял «с завода»? Смартфон, Покупка, Гаджеты, Программирование, Android, Телефон, Ретро, Девайс, Ништяки, Linux, Портирование, Научпоп, Видео, Без звука, Длиннопост

Поскольку тачскрина у нас нет, root доступ через adb придется включать «ручками» — для этого нам необходимо перепаковать наш родной раздел boot. Для распаковки и запаковки образов, я пользуюсь MtkImgTool — весьма удобная «кухня» для работы. Вытаскиваем boot.img из pac, закидываем в Unpack/Image/ и распаковываем с помощью Boot -> Unpack -> boot.img

Исходников нет, но мы не сдадимся: как и зачем я портировал более старый Android, чем стоял «с завода»? Смартфон, Покупка, Гаджеты, Программирование, Android, Телефон, Ретро, Девайс, Ништяки, Linux, Портирование, Научпоп, Видео, Без звука, Длиннопост

В Unpack/boot/ramdisk/default.prop нам необходимо изменить ro.debuggable на 1, а ro.secure на 0. Это даст возможность отлаживать устройство даже если Android фактически не загрузился.

Исходников нет, но мы не сдадимся: как и зачем я портировал более старый Android, чем стоял «с завода»? Смартфон, Покупка, Гаджеты, Программирование, Android, Телефон, Ретро, Девайс, Ништяки, Linux, Портирование, Научпоп, Видео, Без звука, Длиннопост

Теперь у нас есть root-консоль устройства, даже если смартфон висит на заставке. Прошиваем обратно образ, пишем adb shell в консоли и смотрим, что же тут не так… Вообще, драйвер тачскрина обычно статически слинкован с ядром, но в случае устройств Spreadtrum — они вынесены в динамические модули ko, которые можно найти в папке /lib/modules/, либо /sps/. Давайте глянем init.sp6820a.init.3rdparty.rc, который отвечает за специфичную для этой модели смартфона инициализацию.

Исходников нет, но мы не сдадимся: как и зачем я портировал более старый Android, чем стоял «с завода»? Смартфон, Покупка, Гаджеты, Программирование, Android, Телефон, Ретро, Девайс, Ништяки, Linux, Портирование, Научпоп, Видео, Без звука, Длиннопост

Ага, видим insmod gt868.ko? Это команда загрузки драйвера тачскрина, в нашем случае — это вышеупомянутый GT868. Иногда встречаются другие модели тачскринов, но главное отличие прошивки 2.2 от 2.3 — разные названия папок с драйверами и некоторые службы. Достаём из родного образа драйвер gt868.ko, используя всё тот-же MtkImgTools, распаковывая его как обычный ext2 раздел:

Исходников нет, но мы не сдадимся: как и зачем я портировал более старый Android, чем стоял «с завода»? Смартфон, Покупка, Гаджеты, Программирование, Android, Телефон, Ретро, Девайс, Ништяки, Linux, Портирование, Научпоп, Видео, Без звука, Длиннопост

Пишем в консоли устройства:

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 на оный из родной прошивки, зарядка заработала.

Исходников нет, но мы не сдадимся: как и зачем я портировал более старый Android, чем стоял «с завода»? Смартфон, Покупка, Гаджеты, Программирование, Android, Телефон, Ретро, Девайс, Ништяки, Linux, Портирование, Научпоп, Видео, Без звука, Длиннопост

Для этого мы снова перемонтируем /system/ в режим записи и копируем vcharged, не забыв вернуть обратно необходимые права:

adb push charge /system/bin/
adb shell
chmod 777 /system/bin/charge

Перезагружаем устройство и… зарядка с индикацией появилась!

Исходников нет, но мы не сдадимся: как и зачем я портировал более старый Android, чем стоял «с завода»? Смартфон, Покупка, Гаджеты, Программирование, Android, Телефон, Ретро, Девайс, Ништяки, Linux, Портирование, Научпоп, Видео, Без звука, Длиннопост

Вроде всё работает на первый взгляд: и звук, и вибро, и Wi-Fi с Bluetooth… однако сети-то нет! Девайс не определял наличие SIM, а вместо IMEI у нас был null/null:

Исходников нет, но мы не сдадимся: как и зачем я портировал более старый Android, чем стоял «с завода»? Смартфон, Покупка, Гаджеты, Программирование, Android, Телефон, Ретро, Девайс, Ништяки, Linux, Портирование, Научпоп, Видео, Без звука, Длиннопост

Чтобы её поднять, нам необходимо разобраться в том, как работает подсистема взаимодействия с радиомодулем в Android, которая называется ril — Radio Interface Library. RIL предоставляет API для системы, дабы оперировать не напрямую AT-командами (которые могут быть проприетарными, а на некоторых чипсетах, как, например, Qualcomm вообще отсутствовать), а удобным набором функций — например о запросе статуса радиомодуля, начале звонка, поиска сети и т. п. RIL состоит из сервиса rild в /system/bin/ и библиотеки libril.so, которую можно найти в папке /system/lib/. При запуске системы, TelephonyManager открывает сокет с rild и опрашивает его состояние. Именно из TelephonyManager система берет информацию о силе сигнала, название оператора, IMEI и другие данные.

Исходников нет, но мы не сдадимся: как и зачем я портировал более старый Android, чем стоял «с завода»? Смартфон, Покупка, Гаджеты, Программирование, Android, Телефон, Ретро, Девайс, Ништяки, Linux, Портирование, Научпоп, Видео, Без звука, Длиннопост

Путем ковыряния в 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 появился, но устройство до сих пор не хочет никуда звонить и просто висит на экране звонка. В настройках смартфон говорит о том, что уровень сигнала недоступен, а значит, радиомодуль до сих пор не работает :(

Исходников нет, но мы не сдадимся: как и зачем я портировал более старый Android, чем стоял «с завода»? Смартфон, Покупка, Гаджеты, Программирование, Android, Телефон, Ретро, Девайс, Ништяки, Linux, Портирование, Научпоп, Видео, Без звука, Длиннопост
Исходников нет, но мы не сдадимся: как и зачем я портировал более старый Android, чем стоял «с завода»? Смартфон, Покупка, Гаджеты, Программирование, Android, Телефон, Ретро, Девайс, Ништяки, Linux, Портирование, Научпоп, Видео, Без звука, Длиннопост

Но и мы так просто не сдаемся! Поковыляв по файловой системе, в директории /system/opl/telephony/bin/ я нашел скрипт, отвечающий за инициализацию радиотракта, который вызывает родной 3rdparty.rc! Запускаем sh-скрипт и обнаруживаем, что сеть появилась и девайс дозвонился в 112, а также увидел SIM-карту!

sh init.tel

Теперь всё полностью работает :) Дабы радиотракт запускался при старте устройства, я перенес часть инита из boot.img от прошивки, которую мы портировали. Для кого-то, казалось бы, это всё достаточно сложно и долго. Но у меня ушел всего один день на полную отладку и запуск такой кастомной прошивки на своем устройстве! Можно сказать, это самый базовый и краткий экскурс в такое нелегкое дело, как моддинг Android-устройств.

Но мы ведь это всё не просто так делали! Давайте глянем, как будет работать такой девайс на Android 2.2 в 2024 году — спустя 14 лет после выхода системы. Всё ли так плохо, как кажется?

❯ Знакомимся с девайсом


Думаю, многие читатели вспомнят этот ламповый интерфейс, обои с одуванчиком и лаунчеры а-ля TouchWiz на тех смартфонах, где интерфейс Samsung был не предусмотрен. А эти «бульк»… их сложно забыть!

Исходников нет, но мы не сдадимся: как и зачем я портировал более старый Android, чем стоял «с завода»? Смартфон, Покупка, Гаджеты, Программирование, Android, Телефон, Ретро, Девайс, Ништяки, Linux, Портирование, Научпоп, Видео, Без звука, Длиннопост

Конечно, изначально может показаться, что устройство плохо подходит для выполнения современных задач: браузер не способен загрузить большинство страниц, а из альтернатив есть только Opera Mini, где вообще нет динамического контента, а официальные клиенты ВК, WhatsApp и YouTube уже давно не работают. Опечаленный читатель может подумать, что девайс, как и многие его ровесники уже давно превратились в звонилки…

Исходников нет, но мы не сдадимся: как и зачем я портировал более старый Android, чем стоял «с завода»? Смартфон, Покупка, Гаджеты, Программирование, Android, Телефон, Ретро, Девайс, Ништяки, Linux, Портирование, Научпоп, Видео, Без звука, Длиннопост

Но это отнюдь не так! Ведь как я уже говорил, я стараюсь своими силами вдохнуть в подобные девайсы новую жизнь, реализуя на них клиенты нужных мне сервисов сам! Да, пусть примитивно и корявенько, далеко не ынтырпрайз-уровень, но эти приложения выполняют свои функции и что, немаловажно, весят очень мало (до 100Кб) и работают крайне шустро! Клиент ВКшечки просто летает, несмотря на то, что фактически реализован только мессенджер с нотификациями и музыка.

Исходников нет, но мы не сдадимся: как и зачем я портировал более старый Android, чем стоял «с завода»? Смартфон, Покупка, Гаджеты, Программирование, Android, Телефон, Ретро, Девайс, Ништяки, Linux, Портирование, Научпоп, Видео, Без звука, Длиннопост
Исходников нет, но мы не сдадимся: как и зачем я портировал более старый Android, чем стоял «с завода»? Смартфон, Покупка, Гаджеты, Программирование, Android, Телефон, Ретро, Девайс, Ништяки, Linux, Портирование, Научпоп, Видео, Без звука, Длиннопост

Пожалуй, многие читатели удивятся — но на таких девайсах есть YouTube! Мой самопальный клиент не поддерживает стриминг из сети (да и многие девайсы объективно не потянут), поэтому предварительно загружает видео на MicroSD-флэшку и затем уже их воспроизводит. Как приятный бонус — видео потом можно посмотреть в любой момент в галерее.

Исходников нет, но мы не сдадимся: как и зачем я портировал более старый Android, чем стоял «с завода»? Смартфон, Покупка, Гаджеты, Программирование, Android, Телефон, Ретро, Девайс, Ништяки, Linux, Портирование, Научпоп, Видео, Без звука, Длиннопост

Я помню насколько было лампово слушать музыку с таких девайсов. И если претензии к основному динамику не очень актуальны, то к качеству звука в наушниках были придирки — звук был громкий, но ему не хватало низких частот, из-за чего он звучал несколько плоско, хотя мне и этого хватало — ведь я слушал музыку в наушниках по 200-300 рублей с рынка! Я всё ещё помню те времена, как качал mp3-треки по 2-3 мегабайта через 2G-интернет… слушаешь один трек — как раз загрузится другой и так по кругу наполнял свою фонотеку. Эх времена то какие были! Тем не менее, для некоторых базовых мультимедийных возможностей девайс подходит и сейчас, например в машину в качестве BT-хоста с музыкой.
А ещё на таких девайсах порой клёво скачать какой-нибудь Temple Run образца 2011 года и вспомнить самое начало смартфонного гейминга тех лет… ведь далеко не все игры того времени запускаются на свежих версиях Android!

❯ Заключение


В остальном же, подобные девайсы отнюдь не бесперспективны! Несмотря на совсем не новое железо, они всё ещё могут выполнять многие задачи, стоит лишь снова запилить необходимые приложения для них! Мессенджеры, соц. сети, музыкальные сервисы и даже просмотр видео — всё это доступно даже для таких, казалось бы, «устаревших» девайсов, когда есть запал энтузиазма и жгучее желание походить именно с этим конкретным устройством как с основным!

Для кого-то это просто проявление синдрома утенка или картинки «вот кому-то делать не.»… ну а для меня — это крайне интересное, захватывающее и кайфовое времяпровождение: начиная от аппаратного ковыряния с такими девайсами и копания исходников ядер/драйверов, заканчивая написанием оптимизированных клиентских приложений, которые весят не 100-200Мб, а 100-200Кб :)

Друзья, если у вас есть подобные китайчики и вы не разделяете желания пытаться вдохнуть в них жизнь, но выбрасывать их жалко — можете задонатить их мне :) Как сами видите — девайсы попадают в хорошие руки. Из недавнего — я взял нерабочую, утопленную китайскую копию 14 Pro Max из под СЦ в качестве основного смартфона. Также у меня есть канал в Telegram, куда я выкладываю бэкстейджи статей, различные заметки о ремонте, моддинге, программировании и реверс-инжиниринге и свои мысли. Кому интересно — залетайте!

Понравилась ли вам статья? Какими были ваши первые Android-смартфоны? Пишите в комментариях, будет интересно почитать!

Показать полностью 23 2
TECHNO BROTHER

Бюджетный и шустрый ультрабук для работы и сёрфинга: Обзор на Ninkear N14 Pro

Бюджетный и шустрый ультрабук для работы и сёрфинга: Обзор на Ninkear N14 Pro Покупка, Гаджеты, Ноутбук, Нетбуки, Девайс, I7, Обзор, Видео, YouTube, Длиннопост

Пожалуй, рубрика, связанная с обзором и ремонтом различных ноутбуков уже успела стать одной из самых любимых среди моих читателей. Мы с вами успели рассмотреть множество весьма необычных и диковинных устройств прошлых лет: ноутбуки на базе процессоров Transmeta Crusoe, миниатюрные японские девайсы с графикой PowerVR и даже бюджетные ARM-смартбуки на базе различных Linux-дистрибутивов! Поскольку желание копаться в девайсах, писать код и созидать что-то своё у меня возникает даже в дороге, моё творческое начало постоянно требует дописывать и переписывать черновики будущих статей в редакторе Хабра. Для этих целей, мне нужна была надёжная, портативная рабочая машинка, на которой я мог бы с комфортом заниматься подготовкой будущих статей. И этой машинкой оказался получивший апгрейд Ninkear N14 Pro! Что за девайс мы получаем за 40.000 рублей? Читаем в статье!

Что за девайс и на кого он рассчитан?

Сейчас на рынке представлен довольно широкий выбор различных портативных лэптопов: начиная от лёгких и достаточно шустрых Windows-планшетов с клавиатурой-крэдлом, заканчивая мощными и тяжелыми игровыми девайсами-«печками». Крайне большой популярностью пользуются различные бюджетные ультрабуки на базе «околопланшетной» платформы Intel Celeron J-серии, которые в основном берут для базового серфинга в интернете, работы с документами и даже, в некоторой степени, для старых игр.

Однако производительности девайсов на базе бюджетных Celeron и Pentium может не хватать для достаточно ресурсоёмких задач: например, разработка современных UWP и Android-приложений, развёртывание множества Docker-контейнеров, монтаж видео и обработка звука и тогда приходится искать что-то пошустрее, пусть даже на базе достаточно шустрых процессоров позапрошлого поколения.

Бюджетный и шустрый ультрабук для работы и сёрфинга: Обзор на Ninkear N14 Pro Покупка, Гаджеты, Ноутбук, Нетбуки, Девайс, I7, Обзор, Видео, YouTube, Длиннопост

Недавно компания Ninkear выпустила апгрейд своей шустрой и компактной рабочей лошадки — модель N14 Pro, предназначенную для тех пользователей, кому нужен достаточно маленький и холодный девайс с достойным железом, адекватным временем жизни от аккумулятора и нормальной IPS-матрицей. Ребята из Ninkear лично предложили мне затестить их новенький девайс и рассказать свои впечатления о нём… ну а я не смог не согласится!

Характеристики тестируемого девайса следующие:

  • Процессор: Intel Core i7-11390h Tiger Lake, работающий на частоте 3.4ГГц (с автоматическим разгоном до 5ГГц в режиме TurboBoost), выполненный по 10нм техпроцессу в конфигурации 4 ядра/8 потоков. Процессор достаточно «горяч» по меркам лэптопа — теплопакет аж в 35Вт, однако производитель обещает довольно продуманное и тихое охлаждение для большинства режимов работы!

  • ОЗУ: 16Гб DDR4 в одноканальном режиме.

  • GPU: Интегрированный GPU Iris XE, работающий на частоте до 1.4ГГц и в качестве видеопамяти использующий некоторый процент основной ОЗУ устройства. Iris, как и UHD Graphics, поддерживает OGL 4.6, Vulkan и DX12. Для большинства современного софта этого более чем достаточно, а вот игры… узнаем чуть позже!

  • Постоянная память: 1Tb NVME SSD, что само по себе уже неплохо, учитывая цену девайса и его мы тоже позже потестируем!

  • Дисплей: 14.1" 1080p шустрая IPS-матрица достойного качества с яркостью 280Нит.

  • Аккумулятор: Li-Ion ёмкостью 4.700мАч. Производитель обещает до 48ч в режиме простоя, 6ч размеренной работы и 8ч проигрывания видео в FHD

  • Толщина и вес: Всего 1.5Кг и тонкий 17мм корпус — весьма компактненько и портативно для такой машинки!

  • Камера: «Вебка» с разрешением 720p для любителей поболтать в видеочатах.

  • Wi-Fi: Современный модуль с поддержкой частот 2.4ГГц и 5ГГц.

  • ОС: Windows 11.



На первый взгляд всё весьма неплохо…

Распаковываем

Девайс пришёл ко мне в двух симпатичных коробочках, одна из которых была с надписью «Notebook». Вероятно, мне прислали ещё предсерийный образец, а дизайн финальной коробки пока ещё не готов.

Бюджетный и шустрый ультрабук для работы и сёрфинга: Обзор на Ninkear N14 Pro Покупка, Гаджеты, Ноутбук, Нетбуки, Девайс, I7, Обзор, Видео, YouTube, Длиннопост

В первой коробке лежал сам девайс в пленках, а также коврик для мыши, а во второй, которая поменьше — блок питания с кабелем для европейской вилки, а также фирменная беспроводная мышка весьма причудливой формы. Мелочь, а приятно :)

Бюджетный и шустрый ультрабук для работы и сёрфинга: Обзор на Ninkear N14 Pro Покупка, Гаджеты, Ноутбук, Нетбуки, Девайс, I7, Обзор, Видео, YouTube, Длиннопост

Что мне лично понравилось в первую очередь — так это конструкция и материалы корпуса девайса. Несмотря на то, что поддон ноутбука выполнен из классического пластика, вся верхняя часть устройства и топкейс выполнены из приятного на ощупь алюминия, что, в целом, даёт даже некоторое ощущение премиальности устройства. Девайс мне напоминает макбук, хотя из оригинальных маков у меня только PowerBook G4.

Бюджетный и шустрый ультрабук для работы и сёрфинга: Обзор на Ninkear N14 Pro Покупка, Гаджеты, Ноутбук, Нетбуки, Девайс, I7, Обзор, Видео, YouTube, Длиннопост

Открывается девайс относительно легко, в таком состоянии мы можем увидеть довольно большой по размерам тачпад с поддержкой мультитача, весьма удобную для девайса таких размеров клавиатуру с подсветкой клавиш, а также хвалёный мной ранее IPS-дисплей. Единственный момент, который мне немного не понравился — яркие статусные светодиоды, которые могут мозолить глаза в полной темноте. Для кого-то может статьи минусом единая с клавиатурой кнопкой включения — но сейчас это тренд.

Бюджетный и шустрый ультрабук для работы и сёрфинга: Обзор на Ninkear N14 Pro Покупка, Гаджеты, Ноутбук, Нетбуки, Девайс, I7, Обзор, Видео, YouTube, Длиннопост

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

Включаем, смотрим и тестируем

Для многих будет приятным тот факт, что несмотря на относительно невысокую цену девайса, на N14 Pro предустановлена лицензионная Win11, а не, например, Debian (впрочем, для многих моих читателей это наоборот минус :)). Девайс достаточно шустро загружается с SSD, холодный старт занимает секунд 5, что весьма приятно.

Бюджетный и шустрый ультрабук для работы и сёрфинга: Обзор на Ninkear N14 Pro Покупка, Гаджеты, Ноутбук, Нетбуки, Девайс, I7, Обзор, Видео, YouTube, Длиннопост

В меню UEFI настроек довольно много, что не свойственно для большинства ноутбуков, в т.ч и пункты связанные с отладкой. С чем связано — не знаю, возможно у меня предсерийный образец и на него заливали дебаг-UEFI.

Бюджетный и шустрый ультрабук для работы и сёрфинга: Обзор на Ninkear N14 Pro Покупка, Гаджеты, Ноутбук, Нетбуки, Девайс, I7, Обзор, Видео, YouTube, Длиннопост

После того, как система стартовала и нужный софт был установлен, можно визуально оценить производительность девайса по скорости выполнения базовых задач: сёрфинг в браузере с парой десяток вкладок, встроенный UWP-плеер и редактирование документов — с этим всем девайс, очевидно, справляется замечательно!

Бюджетный и шустрый ультрабук для работы и сёрфинга: Обзор на Ninkear N14 Pro Покупка, Гаджеты, Ноутбук, Нетбуки, Девайс, I7, Обзор, Видео, YouTube, Длиннопост

Рекурсия

Но без синтетики глупо судить о производительности девайса, поэтому мы накатываем бенчмарки и смотрим конфигурацию нашего девайса в CPU-Z и GPU-Z. На первый взгляд, всё весьма неплохо:

Бюджетный и шустрый ультрабук для работы и сёрфинга: Обзор на Ninkear N14 Pro Покупка, Гаджеты, Ноутбук, Нетбуки, Девайс, I7, Обзор, Видео, YouTube, Длиннопост
Бюджетный и шустрый ультрабук для работы и сёрфинга: Обзор на Ninkear N14 Pro Покупка, Гаджеты, Ноутбук, Нетбуки, Девайс, I7, Обзор, Видео, YouTube, Длиннопост

Запускаем бенчмарк CPU-Z и получаем следующие результаты:

  • 424.5 очка в режиме теста работы в одном потоке, что по «попугаям» равно Ryzen 5 2600, Ryzen 5 3400G и чуть меньше легендарного i7-7700

  • 2327.6 очков в режиме теста работы в несколько потоков, что в целом, немного шустрее i7-7700, равно тому же 3400G и когда-то желаемому многими i7-4790K

Бюджетный и шустрый ультрабук для работы и сёрфинга: Обзор на Ninkear N14 Pro Покупка, Гаджеты, Ноутбук, Нетбуки, Девайс, I7, Обзор, Видео, YouTube, Длиннопост

Для честности теста, запускаем бенчмарк CPU Queen в AIDA64 и узнаем, что процессор выдаёт 38025 попугаев. Для портативного и не особо дорогого девайса результаты вполне достойные :

Бюджетный и шустрый ультрабук для работы и сёрфинга: Обзор на Ninkear N14 Pro Покупка, Гаджеты, Ноутбук, Нетбуки, Девайс, I7, Обзор, Видео, YouTube, Длиннопост

В тесте FPU Julia, 11390H выдаёт 23841 попугаев.

Бюджетный и шустрый ультрабук для работы и сёрфинга: Обзор на Ninkear N14 Pro Покупка, Гаджеты, Ноутбук, Нетбуки, Девайс, I7, Обзор, Видео, YouTube, Длиннопост

Давайте разберем девайс и глянем, что-же у него «под капотом»?

Что под капотом?

В ультрабуке предусмотрен отдельный отсек для быстрой замены и обслуживания ОЗУ и NVMe. К сожалению, как уже было оговорено выше, слот под ОЗУ только один — возможность проапгрейдить оперативку есть, но работать она будет только в одноканальном режиме. NVMe, как и обещано, на 1Тб, одним чипом памяти. Маркировка на плате говорит о том, что потенциально можно попробовать распаять второй чип памяти и получить 2Тб… Может, как-нибудь попробовать? :)

Бюджетный и шустрый ультрабук для работы и сёрфинга: Обзор на Ninkear N14 Pro Покупка, Гаджеты, Ноутбук, Нетбуки, Девайс, I7, Обзор, Видео, YouTube, Длиннопост

Вообще, это забавно прозвучит, но меня порадовало наличие коннектора АКБ в открытом доступе без необходимости полной разборки ноутбука. Казалось бы, что в этом такого, но иногда меня просят перебрать и обслужить свежие ноуты, а в некоторых моделях АКБ можно отключить только после частичной разборки девайса… что, в общем-то, весьма рискованно. Кроме того, это полезно если вам необходимо на долгое время убрать девайс на полку и вы не хотите, чтобы АКБ ушёл в защиту.

Бюджетный и шустрый ультрабук для работы и сёрфинга: Обзор на Ninkear N14 Pro Покупка, Гаджеты, Ноутбук, Нетбуки, Девайс, I7, Обзор, Видео, YouTube, Длиннопост

Разбирается девайс очень просто, без необходимости снятия клавиатуры: просто откручиваем поддон, расщёлкиваем клипсы и снимаем его.

Бюджетный и шустрый ультрабук для работы и сёрфинга: Обзор на Ninkear N14 Pro Покупка, Гаджеты, Ноутбук, Нетбуки, Девайс, I7, Обзор, Видео, YouTube, Длиннопост

Конструктивно девайс весьма неплохо продуман. Охлад состоит из двух кулеров, хаб и процессор с GPU «сидят» на разных тепло-трубках, что обеспечивает достойный уровень охлаждения. Ещё-бы, с достаточно горячим по мобильным меркам процом!

Бюджетный и шустрый ультрабук для работы и сёрфинга: Обзор на Ninkear N14 Pro Покупка, Гаджеты, Ноутбук, Нетбуки, Девайс, I7, Обзор, Видео, YouTube, Длиннопост

В ноутбуке хоть и классическая, но весьма надежная конструкция петель: с завода девайс хоть и не открывается одной рукой, как макбук, однако петли не вызывают нареканий с точки зрения пользовательского опыта. На 5+ лет активной работы их должно хватать с головой!
Обратите внимание на наличие UART на плате. С учётом того, что в ноутбуке прошита debug-версия UEFI, диагностика аппаратных проблем лэптопа может стать проще:

Бюджетный и шустрый ультрабук для работы и сёрфинга: Обзор на Ninkear N14 Pro Покупка, Гаджеты, Ноутбук, Нетбуки, Девайс, I7, Обзор, Видео, YouTube, Длиннопост

С пользовательской точки зрения, ноутбук легко обслуживается: весь охлад снимается за пару минут, ОЗУ не распаяна и её без проблем можно заменить, NVMe-диск также легко поддаётся замене. Для рабочей и недорогой машинки — самое то!


Подходит ли девайс для разработчика?

Мой основной стек технологий — это C/C++ (Embedded-разработка и системное программирование), .NET (игры, мобильные приложения) и Java (Android, ну и по малёху J2ME из интереса), поэтому в этом тесте мы будем смотреть, как будет проявлять себя девайс при работе в современных и тяжелых IDE (IDEA-подобная Android Studio, привет!), как шустро девайс сможет справляться с компиляцией больших проектов и работой с тяжелыми системами сборки (Gradle).

Первым у нас будет VS2022 Community Edition. IDE работает достаточно плавно как в маленьких, так и относительно больших проектах. С .NET нет никаких проблем: студия практически моментально собирает и запускает отладчик для любых моих небольших проектов, а также быстро собирает сторонние библиотеки. Время сборки после clean моего самопального 3D-шутера на ~4к строк кода с учетом фреймворка — менее секунды!

Бюджетный и шустрый ультрабук для работы и сёрфинга: Обзор на Ninkear N14 Pro Покупка, Гаджеты, Ноутбук, Нетбуки, Девайс, I7, Обзор, Видео, YouTube, Длиннопост

Переходим к плюсам. Собирать мы будем 3D движок Urho3D. Накатываем CMake, генерируем проекты VS и переходим к компиляции…

Бюджетный и шустрый ультрабук для работы и сёрфинга: Обзор на Ninkear N14 Pro Покупка, Гаджеты, Ноутбук, Нетбуки, Девайс, I7, Обзор, Видео, YouTube, Длиннопост

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

Дальше у нас идёт Android Studio, известный своей системой сборки Gradle. Первая сборка всегда довольно долгая, поскольку Android Studio качает необходимую для проекта версию Gradle, однако основным показателем будет являться время Gradle sync и фактическое время сборки проекта после его очистки.

Бюджетный и шустрый ультрабук для работы и сёрфинга: Обзор на Ninkear N14 Pro Покупка, Гаджеты, Ноутбук, Нетбуки, Девайс, I7, Обзор, Видео, YouTube, Длиннопост

Мой клиент «вкшечки» собирается за 15 секунд, с учётом того, что Gradle уже развёрнут и проводится clean-сборка проекта. Gradle сам по себе неповоротлив до жути, но результат в любом случае неплохой!

Играем

Ну и само собой, самое время погонять девайс в играх! Если честно, я практически не играю в свежие релизы и не вижу особого смысла прогонять бенчмарки условного Cyberpunk 2077 на встройке… Но некоторую классику мы, пожалуй, с вами можем погонять!

Начинаем с GTA V, минимальные настройки графики, но при этом FHD-разрешение. 20-30 нестабильных кадров в портативном режиме. Уже не очень, да?

Black Mesa, релизная Steam-версия, в одной из самых тяжелых сцен с поездкой на «поезде» мы получаем ~30-40FPS на минимальных настройках графики, но в нативном разрешении. Казалось бы, первому Source уже вот-вот 20 лет стукнет, а всё равно лучшая его ветка способна нагрузить даже современные GPU!

Counter-Strike: Source. Не поймите меня неправильно, CS2 девайс тоже вполне тянет и в портативе, однако производительность слишком нестабильная для комфортной игры. Зато CSS — вполне! Кроме того, интеловский драйвер форсирует во всех D3D-приложениях 60FPS и отключить лок в текущей версии софта невозможно :(

Ну и Flatout 2. Здесь всё замечательно, как и в большинстве гоночек тех лет :)



Заключение

Давайте подведем итоги на основе проведенных нами тестов:

  • Игры: Для свежих релизов девайс не подойдет от слова совсем. Iris XE в текущей конфигурации — достаточно слабая встройка, которая с трудом вытягивает игры 5-6 летней давности в 1080p. Но тем не менее, если вы покупаете лэптоп в первую очередь для работы, но время от времени любите погонять в условный New Vegas, или, например, CSS, то почему бы и нет?

  • Разработка: Для целей разработчика девайс подходит весьма неплохо. Шустрый террабайтный NVMe SSD вкупе с не самым плохим i7 11390H позволяют с комфортом работать в IDE, а также собирать и дебажить проекты «на лету». Можно накатить osx86 и будет «почти макбук», учитывая моду на дизайн лэптопов от Apple.

  • Офис и учёба: Подойдёт замечательно. Девайс без проблем можно использовать для подготовки презентаций в поверпоинте, работы с документами, таблицами и т.п.

  • Сёрфинг, просмотр видосов и онлайн-кинотеатров: С этим тоже никаких проблем нет. Девайс легко вывозит с десяток открытых вкладок, при просмотре видео девайс практически не греется — GPU поддерживает аппаратное декодирование VP9 в 2160p.



Если девайс подходит вашим требованиям — можете смело брать на официальном сайте производителя. Склады есть и в РФ, так что проблем с сроком доставки не будет :)

Друзья! Ninkear прислали мне данный ноутбук в обмен на обзор. Но пожалуйста, смотрите на это не с позиции «автор, ты продался», а с позиции того, что ребята заслали мне удобную машинку, которая поможет сделать будущий контент лучше! Мне лишь оставалось расписать свои искренние впечатления касательно девайса и лично я считаю, что ноут вполне можно рассматривать к покупке.

Показать полностью 22 3
Отличная работа, все прочитано!