Как стать автором
Обновить

Исходники закрыты, но мы не сдадимся: Пишем полностью нативное GUI-приложение под No-Name смартфон без Android

Уровень сложностиСредний
Время на прочтение10 мин
Количество просмотров20K
Всего голосов 81: ↑80 и ↓1+91
Комментарии38

Комментарии 38

Спасибо за статью! Не хватает описания, как (и можно ли) автоматически запускать приложение при запуске рекавери. Не будешь же после разработки каждый раз команды в ADB вводить?

Приветствую, да, можно. Вместо service /sbin/recovery пишем путь к нашей программе, не забыв выставить права (либо в конфиге нашего unpacker'а, либо прямо в рантайме перед стартом сервиса.

Прикольный концепт, не знал. Снимаю шляпу.

Я помню ты все плевался от мобильного программинга из-за жабы. Чего теперь скажешь, пора расчехлять 10-летний Fly? :)

Лично мое имхо, апи голого линуха хоть достаточно и низкоуровневое, но его гораздо проще выучить и понять, чем некоторые ведроидовские фишки. Если хочется запилить что-то под эмбед и нужно максимально дешевое железо с готовым КП, экраном, тачскрином и.т.п - то подобная мобилка отличный вариант. На авито их можно найти по 100-200-300 рублей.

Кроме того, в китайцах очень часто прямо на плате разведен UART, еще и подписан частенько, позволяя сделать из них эдакий одноплатник. Но стоит иметь ввиду, что на 6572 драйвер уарта "сломан" и не работает, по крайне мере на ядре 3.4, на 6580 и более ранних все окей

Тут вопрос в том, что заряжается ли он в таком режиме. Мне телефоны не нравятся тем, что они не работают без аккумуляторов.


Но идея классная, да.

Медиатеки и спредтрумы точно заряжаются без каких либо проблем) Если вдругг нет - см. в сторону sysfs, возможно флагом можно включить зарядку.

Если не нужен АКБ - то просто подпаиваешь источник 5в прямо к плюсу и минусу АКБ, медиатековские КП на такое реагируют нормально (но не больше +-0.5в допуск).

можно прикрутить на + - батареи tp4056 которая уже будет контролировать заряд мимо даже мертвого родного контроллера заряда. единственный минус проблема отображения процентов - бывает печально. но работает.

Если речь про ведроид, то не работает. Андроид не позволяет процентам расти вверх, только вниз (сделано это для того, чтобы при просадка напруги на АКБ не прыгали проценты). А под линухом можно напрямую считывать напряжение с ADC КП и пкоазывать проценты :)

Tp4056 нужен ток если родной КП мертвый или разъем сломан, а навыков пайки не хвати, в других случаях необходимости в нем нет.

спасибо за совет !

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

Уточнение, при подключении кабеля питания, запустится загрузчик и запустит вместо рекавери, мою самописную программку.

Это зависит от смартфона, медиатеки точно не запускают ядро при подключении зарядки. Индикацией там занимается вторичный загрузчик - lk.

А вот смартфоны Spreadtrum вполне себе запускают полноценное ядро и позволяют вместо (или вместе) с чарджером запустить что-то свое

Есть Samsung Galaxy Ace 4 Neo SM-G318H/DS на Spreatrum SC7727S у него всего 512мб озу, андроид 4.4 тормозит.

А так глядишь можно что-нибудь запустить полезное.

Тулчейн для Rust может подсказать кто.

Друзья! После сдачи статьи в редакцию, я наконец-то смог поднять модем НЕ запуская RIL и Android. Да, то есть я спокойно мог слать AT-команды в него и позвонить, например, на свой второй телефон.

И конечно же есть нюанс - звуковой тракт реализован полностью через andriod audio, так что HAL ведроида (читаем - блобы) придется подключать. Но возможность поднять модем НЕ запуская остальную систему ЕСТЬ!

Сейчас я хочу реализовать один интересный проект на базе этих находок, но мне нужен компактный смартфон на базе MT6577/MT6580/MT6575/MT6573. Есть у кого такой? Обычно это дешевые Fly/Explay/Qumo/DNS 2012-2014 годов выпуска.

Есть THL W3+

Похоже на то что нужно)

Вроде где-то валялись такие девайсы на Mediatek, проверю на каких именно чипах.

Спасибо

Собственно сторонние рекавери, такие как TWRP написаны на C/C++ и реализуют многое из описанного здесь, включая вывод на экран, ввод с клавиатуры и т. д. Идеи о том, как получить доступ нативно можно брать оттуда.

p.s. сам один раз писал полностью нативное приложение для андроида (в нем не было classes.dex, а был прямой запуск activity из динамической библиотеки), так что это тоже вариант, и не надо заморачиваться с прошивками и другими вещами.

Спасибо, было интересно!

Тем временем, @blackstrip часто пишет ПО для DOS на смартфоне с DOSBOX, тоже интересный подход.

Покажите ваш Hello world.
Пытаюсь скомпилировать, линкер ругается на `cannot open crtbegin_static.o, crtend_android.o`

Забыл этот момент упомянуть, их надо достать из /usr/lib в папке с платформой и скопировать в папку с исходниками. Через -l компилятор их не видит :(

удалось скомпилить, но теперь оно не хочет запускаться. я вижу, у вас в выводе командной строки тоже было несколько попыток:
/sbin/sh: ./cmdprog: not found
как вы решали это?

я подумал, что архитектуру где-то не ту выбрал, но через file cmdprog все совпадает с любым другим исполняемым файлом с устройства. понизил платформу до самой ранней на всякий случай (android-9) и gcc 4.6, но результат не дало.

Запускаете из под recovery? Посмотрите, есть ли в /sbin/ файл linker (или libelf)?

Программа не может найти динамический линкер, поэтому и не запускается.

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

Неа, скиньте все файлы, что есть в /bin/ и /sbin/ (ls /sbin/, ls /bin/). И какая версия Android

Nook Simple Touch, Android 2.1, лежал у меня разобранный на столе аккурат в момент прочтения статьи.

Пробуйте так:

mount /dev/block/platform/mtk-msdc.0/by-name/system /system/
cp /system/bin/linker /sbin/

Это если у вас смартфон на базе чипсета MediaTek. Если другой - смотрите fstab, дабы узнать номер нужного раздела и подмонтировать именно его (etc/recovery.fstab как вариант).

спасибо! получилось. у меня системный раздел был тут:
/dev/block/platform/mmci-omap-hs.1/mmcblk0p5

после монтирования в /system увидел заветное:

пора переходить к графике)

https://disk.yandex.ru/d/kusuvX_q-it76g

А вот и мои наработки) Тут в том числе есть рабочий метод запуска модема на медиатеках) Обратите внимание, что в моем коде все "захардкожено" для 32х-битного пиксельформата. На вашем устройстве может быть 16-битный, придется немного переписать.

Отличная статья, спасибо!

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

Вместо gpio гребенок можно использовать usb с платой расширения.

Мне кажется, тут напрашивается создание arduino-like фреймворка, который находит подключенный телефон, прошивает ему память и позволяет загружать кастомные c++ или python приложения.

Если автор или кто другой из специалистов возьмётся, готов вписаться со стороны разработки железяки (usb платы расширения)

Чтобы запускать своё приложение, его нужно вписать init.service.recovery.rc вместо /sbin/recovery и запускать устройство с зажатой кнопкой уменьшения громкости?!
А можно как-то перезаписать подправленный нами образ `recovery.img` вместо основного `boot.img`? Чтобы не приходилось при запуске зажимать кнопку громкости.

Друзья! Важное дополнение к статье. На некоторых устройствах, особенно на версии <4.0, драйвер фреймбуфера нужно принудительно уведомить об обновлении. Сделать это можно, отправив драйверу новую структуру var info:

vInfo.yoffset = (int)flip;
ioctl(fbDev, FBIOPUT_VSCREENINFO, &vInfo);

Зарегистрируйтесь на Хабре, чтобы оставить комментарий