image


Время неумолимо бежит вперед: выходят новые гаджеты, постепенно заменяя старые, превращая их в тыкву или в лучшем случае, в «тапочек» для звонков. Сейчас смартфоны стали практически одинаковы во всем: дисплей на всю площадь передней панели, почти полное отсутствие аппаратных кнопок, беспроводная зарядка… Это всё, конечно, здорово, но ведь иногда так хочется взять в руки старый, но такой необычный в наше время QWERTY-смартфон и попытаться его использовать как основной, да и цены на них могут приятно удивить: БУ девайс можно купить за несколько сотен рублей (~5-10$). Одна проблема — клиенты приложений на версии Android 1.6-2.0 безбожно устарели и давно не работают. Но иногда желание воскресить старый девайс превыше потребительского качества и тут я пришёл к мысли… а почему бы не написать с нуля свои клиенты популярных приложений? ВК с музыкой, YouTube, трекинг посылок. Так я и сел писать необходимые в повседневной жизни приложения, с нуля, на голом API Android, без каких либо фреймворков (и даже AppCompat). Получилось ли у меня это? Узнаем в статье!

Мотивация


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

image

Но до сегодняшнего дня мы с вами обходили прикладной уровень моддинга устройств: т. е. написание самых обычных, повседневных программ, без которых сложно представить жизнь современного человека. Ещё во времена выхода первого Galaxy S в 2010 году, многие из нас уже сутками красноглазили в Java версии «аськи», кто-то уже сидел в ВКонтакте, хоть и большинство не заглядывали в смартфон каждые пару минут для проверки нотификаций.

К 2012 году смартфонная жизнь уже стала похожа на ту, к которой мы привыкли сейчас — соц. сети, мессенджеры, пуши, потоковое видео — многие из нас успели привязаться к такой жизни и… к конкретно тем самым девайсам!

image

2012 год давно миновал, тенденции в разработке приложений кардинально поменялись, а учитывая, что многие мои читатели не любят выбрасывать девайсы в мусорку (и правильно делают), наверняка кто-то регулярно заглядывает на полочку к своим пыльным «бывшим» гаджетам и рассматривает их с теплотой… но с сожалением понимает, что их время прошло. Или не прошло? :) Ну, тут как посмотреть. Если есть навыки и огромная мотивация, то программер может многое, в том числе и запилить все самые необходимые приложения сам!

Я давно лелеял эту идею, подумывая, как бы лучше её реализовать. Да и почти всю свою жизнь, я писал на C#, практически не «щупав» API Android и его UI фрейморк. В один день у меня очень сильно зачесались руки написать что-нибудь эдакое под него и причём сразу — весьма серьёзное!

image

Всем этим устройствам более 10 лет. Самым молодым из них является реплика Lumia 1020, которую мы тоже успели замоддить!

Так и родилась идея написать клиент YouTube. А потом и ВК. Ну и трекинг в придачу. Ну а чего б и нет, на всё про всё я выделил себе неделю: за это время я должен успеть закончить пусть и сыроватые, но вполне юзабельные клиенты для моих любимых сервисов. И я начал думать…

Планирование


image

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

  • В большинстве своём, на старых версиях Android работают одноядерные чипсеты, а значит, лимитированная многопоточность. Никакой работы в UI-потоке кроме обновления интерфейса, а поскольку в первых версиях этой системы интерфейс менее отзывчив, чем в более свежих — нужно сохранять баланс между функционалом, симпатичностью и скоростью работы. Мои приложения должны оптимально работать в следующих условиях: 256мб ОЗУ, из которых свободно в среднем 30-40мб (Сбер, привет тебе с вылетами на 2гб ОЗУ), 1 ядро ~600мгц, видео-ядро уровня Mali300-Malii400. Негусто? Ну, нам сойдет.
  • Вторым ограничением стало тотальное устаревание корневых сертификатов, а как многие из нас знают, просто так их на мобильных системах не обновить. Поэтому придётся идти на хаки — делать сервер-реле, который преобразует трафик из https в http там, где нельзя просто отключить проверку верификации SSL (это как раз кейс с API VK). Решено — отдельный сервер-реле, который отправляет запрос на сервер ВК и обратно возвращает нам обычный результат в JSON.
  • Ну а третьим ограничением стал сам Android. targetSDK = 5 (Android 1.5 Cupcake), никакого AppCompat (кушает драгоценное свободное место), никаких сервисов Google (их тут нет лет 5 уже). Всё на чистом API системы, почти в тех же условиях, в каких 13-14 лет назад писались первые приложения для Android.

    image

    Если я его раздобуду когда-нибудь, то в лепешку расшибусь, но портирую на него свои приложения. Тогда я с гордостью скажу, что мои приложения работают на 100% Android устройств %)

Полный энтузиазма я сел писать код. Основную часть статьи я решил поделить на каждое приложение отдельно с конкретными объяснениями: где, что и как я делал. Хочется заранее сказать — я не особо давно пишу под Android, зато много писал под WinForms, поэтому какие-то решения могут показаться странными. А некоторые решения обусловлены версией Android. Например, нотификации в первых версиях Android не было Notification.Builder, а сам Notification был больше похож на структуру. Приложения, конечно же, мы будем писать на Java.

ВКонтакте


Первым делом я начал писать клиент ВК и сразу определился со своими хотелками, которые были весьма скромными: возможность листать диалоги, читать сообщения и отправлять их (с полной поддержкой QWERTY-клавиатур, т. е. отправка на Enter), плюс возможность слушать музыку без ограничений. На ВК бочку ни в коем случае не гоню, просто публичного API совсем нет, даже с ограничениями, хотя было бы здорово…

Мне снова хотелось почувствовать те эмоции, которые я когда-то ощущал от прослушивания музыки будучи школяром со своим первым Android-смартфоном. В 2013 году я прилетал со школы и слушал плейлист на практически таком же девайсе с идентичным железом и версией Android. Я хорошо помню, как пользовался прелестями многозадачности Android на 2G интернете (3G чипсет просто не поддерживал): одну песню слушаешь, поставил вторую качаться, пока песня доиграет — уже и вторая скачалась. :)

image

Итак, хотелки выбраны, пора начинать писать приложение. Для дебага у меня было 3 устройства: Galaxy S4 (Android 4.2 JB), китайский Galaxy S3 Mini I9300 (Android 2.2, на фото выше) и Samsung Galaxy S I9000 (Android 2.3), ну и конечно же эмулятор с 4.4 KitKat. Android Studio и сейчас умеет без проблем собирать приложения вплоть до версии Android 2.2 даже с последними Build Tools и Target SDK — главное выкинуть appcompat, androidx, и юнит тесты из build.gradle. Без каких-либо проблем он цепляет и сами устройства по adb. Даже отладчик без проблем работает.

Первым делом я начал писать активити (полноэкранная форма в терминологии Android, или «экран» приложения) с диалогами — он должен раз в n секунд подгружать данные и строить «морду» для всего этого. По сути, почти весь код клиента — это получение ответа от API ВК, разбор JSON на датасет и визуализация этого датасета на экран. Для этого я ввёл два объекта: VK, который делает асинхронные запросы на сервер, оборачивает работу с сервером-реле и парсит JSON и VKObjectProcessor (это скорее всего отрефакторится до VKDataSet чуть позже).

image

Архитектура приложения получилось довольно простой и примитивной. При старте активити авторизации проверяет данные приложения (PersistStorage) на наличие API-токена и при его отсутствии запрашивает авторизацию. Как это уже стало классическим среди различных «самопальных» клиентов, мой клиент «прикидывается» официальным приложением ВК — для этого используется связка app_id и app_secret приложения ВКонтакте для Android.

После авторизации приложение перенаправляет нас на страницу диалогов. Поскольку у нас нет ни пушей, ни лонгполлинга, метод обновления остается один — в заданные интервалы. Для этого у нас есть Handler, который раз в 3.5сек берет список диалогов с сервера, проверяет, обновились ли данные и если да — обновляет датасет, отправляя сигнал обновления интерфейса (который построен на ListView). Кроме того, у нас есть кэш аватарок — точно так же распаралелленый на несколько потоков, а загруженные на данный момент превьюшки хранятся в хэшмапе.

image

При этом сообщения реализованы схожим образом — на данный момент возможности горячей подгрузки сообщений «сверху» нет, поэтому обновляются последние 50 сообщений скопом и сразу. Шустро ли всё это работает? Вполне неплохо. Конечно, основное процессорное время уходит на разбор тяжелых JSON, но тут отчасти вина ВК — мало того, что кастрировали функционал getHistory в последних версиях API, так ещё и нет возможности возвращать только те поля, которые нужны.

image

Как же я поступил с аудиозаписями? Музыка через API — настоящая заноза для разработчиков клиентов, с которой пришлось «подолбаться». Правда, недолго — раз у нас для основных запросов уже есть сервер-реле, то почему бы не сделать ещё и для музыки? Суть обхода простая: если сгенерировать специальный API-токен, то можно свободно обращаться к методам, связанным с музыкой без необходимости притворяться официальным клиентом и «подписывать» запросы md5 ключом. Примитивный PHP-скрипт как раз и предоставляет такую возможность, позволяя получить доступ к базе музыки ВК, однако ограничение типичное — у пользователя должны быть открыты аудиозаписи:

<?php
	/*
	*	AudioRelay for MiniVK. (C) 2023 monobogdan.
	*/
	
	$token = "CENSORED";
	
	function vkRequest($request)
	{
		global $token;
		
		$curl = curl_init("https://api.vk.com/method/" . $request . "access_token=$token&v=5.131");
		curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
		return curl_exec($curl);
	}
	
	function audioGet()
	{
		$uid = $_GET["uid"];
		
		return vkRequest("audio.get?owner_id=$uid&count=100&");
	}
	
	function audioSearch()
	{
		$query = $_GET["query"];
		
		return vkRequest("audio.search?q=$query&count=100&");
	}
	
	function audioGetDetails()
	{
		$id = $_GET["id"];
		
		return vkRequest("audio.getById?audios=$id&");
	}
	
	function audioStream()
	{
		$url = $_GET["url"];
		
		$curl = curl_init(urldecode($url));
		curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
		return curl_exec($curl);
	}
	
	$actions = array();
	$actions["get"] = audioGet;
	$actions["search"] = audioSearch;
	$actions["getDetails"] = audioGetDetails;
	$actions["stream"] = audioStream;
	
	if(isset($_GET["act"]))
	{
		$act = $_GET["act"];
		
		if(isset($actions[$act]))
			exit($actions[$act]());
	}
	
	exit("INTERNAL_ERROR");

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

image

Что мы получили по итогу? Довольно простенький клиент ВК, который практически не потребляет ОЗУ и шустро работает. Да, здесь не хватает кучи различных фич — как минимум, прсомотра ленты и стены. Но ещё успеется — если проект будет интересен не только мне, то продолжим наращивать фишечки потихоньку! Уже ближе к релизу я слегка причесал клиент, добавив более «вкшный» дизайн и приделал анимированное боковое меню. Про Animation ещё кто-то помнит? :)

YouTube


С разработкой клиента YouTube были свои особенности: во-первых, в отличии от клиента ВК, видео через реле просто так не загрузишь, слишком много трафика, а во-вторых, YouTube уже не «отдаёт» видео в форматах, которые поддерживают старые устройства — в основном, это h263 до 720p. К сожалению, потоковое видео с софтовым декодированием уложит на лопатки большинство «одноядерников» тех лет.

image

Ситуация осложнялась тем, что ни VideoView, ни стандартные плееры всех смартфонов, на которых я отлаживал приложение, не умели игнорировать ошибки SSL и просто валились с ошибкой. Пришлось что-то придумывать: ведь видосики хочется смотреть на крутейшем AMOLED дисплее Galaxy S!

image

Посидел я, подумал и придумал. Для поиска по базе YouTube, получения информации и прямых ссылок на видео я решил использовать альтернативный фронтэнд YouTube, который называется Invidous API — крутая штука со своим API, которая сама распределяет пул токенов самого ютуба и отдаёт ответы в виде JSON. Форматы запросов очень простые: <url инстанса Invidous>/api/v1/метод, например «search?q=test&region=RU&hl=ru» — выдаст нам результат поиска «test» в Российском регионе. Очень удобно, да? А ещё Invidous — не какой-то отдельный сервис, а целая сеть т. н. инстансов — какой хочешь, такой и юзай! Поскольку большинство инстансов «прячется» за свежими сертификатами, пришлось идти на довольно известный костыль с отключением верификации хостнеймов у HttpUrlConnection:

public static void disableSSLCertificateChecking() {
        TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {
            public X509Certificate[] getAcceptedIssuers() {
                return null;
            }

            @Override
            public void checkClientTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {
                // Not implemented
            }

            @Override
            public void checkServerTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {
                // Not implemented
            }
        } };

        try {
            SSLContext sc = SSLContext.getInstance("TLS");

            sc.init(null, trustAllCerts, new java.security.SecureRandom());

            HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
            HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() { @Override public boolean verify(String hostname, SSLSession session) { return true; } });
        } catch (KeyManagementException e) {
            e.printStackTrace();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
    }

А поскольку у нас нет возможности воспроизводить потоковое видео онлайн, то я решил его просто предварительно загружать через собственный менеджер закачек, с возможностью последующей очистки кэша. Поскольку таким устройствам 2060p качество не нужно, я выбираю 240p-360p mp4 в avc кодеке, в среднем ролики по 30 минут весят около 30-40 мегабайт. При HSDPA+, загрузка подобного видео займет около минуты-двух — не так уж и много, можно и подождать. Закинул тестовую версию в беседу любителей ретро-мобилок — люди были в восторге. ;)

image

Поскольку Invidous отчасти строится на анонимности — авторизации тут нет. Однако свою задачу посмотреть видосики он выполняет нормально — поэтому весь UI приложения я поделил на 4 вкладки: тренды, популярное, история и поиск. Подписки, как и историю можно реализовать на стороне клиента — для некоторых такой подход покажется плюсом, для кого-то — нет, однако минимальный задел для клиента уже есть — мы можем смотреть видео!

А где скачать?


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

Из текущих хотелось:

  • Портировать на Android 1.6. Несмотря на то, что приложение в целом имеет targetSDK = 5, на 2.1 оно работать отказывается. В Android, после 2.1, слегка поменялся бинарный формат xml разметок, из-за чего приложение на старых системах вылетает с исключением. Но это решаемо: eclipse adt в зубы, импортируем проект и вперед! ;)
  • Кроме того, я экспериментировал с попытками как можно сильнее уменьшить нагрузку как на сеть, так и на процессор путём облегчения датасетов. Если один JSON от ВК весит в среднем 30-60кб (который 1 ядерный чипсет частотой 600мгц может «долго» жевать, негативно сказываясь на UI), то примитивный KeyValue формат, который содержит только нужные поля умещается в 5-6-7кб в текстовом виде и благодаря своей примитивности (весь парсинг — два substring, один indexof и поиск ключа по хешмапе) совсем не «налегает» на процессор. Благодаря этим наработкам, я запилил и примитивный клиент ВКшечки для j2me.

    В целом, можно сделать единый формат датасетов для мессенджеров, а на бэкэнде реализовывать всё что угодно — Telegram, ВК, да хоть личные сообщения на хабре, а для платформ только делать «морды»: так можно завести современные мессенджеры и на Sailfish, и на J2ME, и на Symbian, и на WinMobile, практически без пота и крови :)
  • Полная адаптация под кнопочное управление. Сейчас с клиента можно без проблем писать сообщений с любой клавиатуры, в том числе и QWERTY. Однако основной интерфейс всё ещё не полностью адаптирован под кнопки и требует выполнения некоторых действий пальцем.


Заключение


Как по мне — получилось вполне неплохо. Да, приложения кое-где сыроваты и явно не дотягивают по функционалу до их больших версий. Но кое в чем они всё таки выигрывают: они лёгкие и быстрые, а самое главное — ещё могут продлить жизнь любимого девайса для кого-то. И я считаю — это классно! Среднее потребление ОЗУ обеими клиентами: 5-10мб. Вес APK: 30-50кб на момент выхода статьи. Вот что значит писать под голое API без модных фреймворков! ;)
Что до остального функционала — кое-что в Android продолжает неплохо работать и в наше время. Например, DLNA-стриминг в доме, E-Mail клиент или банкинг через смски. Я уверен, это покрывает 80% потребностей большинства пользователей — так разве после этого можно назвать старые смартфоны бесполезными?

Я писал эту статью с целью показать вам, что старые девайсы отнюдь не тыква, если есть щепотка энтузиазма в глазах и любовь к гаджетам, а заодно и поделиться с вами своими приложениями. Часто в комментариях мне пишут, что хотели бы пользоваться своими смартфонами и дальше, если бы не устаревающие версии Android. А вы как считаете? Жду ваше мнение в комментариях.

Комментарии (59)


  1. bodyawm Автор
    13.04.2023 08:09
    +21

    Я знаю, что меня иногда читают новостники. Если вдруг есть желание - будет здорово, если напишите немного про приложения у себя. Проект бесплатный и полностью открытый, любой сможет "форкнуть" его и продолжить развивать свою ветку.. Мне действительно часто пишут в личку и спрашивают, как можно применить тот или иной девайс и огорчаются, узнав что даже базовые сервисы не всегда работают. Не переведешь же всех друзей на XMPP! :)

    Чуть позже допилю шифрование, правда, ключами будем меняться пока что по открытому каналу, но ни оператор, ни man in the middle, ни владелец инстанса не сможет расшифровать данные.

    Практически за год ведения блога, я набрал >1.000 подписчиков на всех платформах: хабр, DTF, пикабу. Я считаю это весьма достойный результат: я не вложил ни копейки в рекламу, а просто писал про то, что мне интересно. Спасибо вам за то, что читаете!


  1. strelkan
    13.04.2023 08:09
    +3

    отличная работа!

    если сгенерировать специальный API-токен, то можно свободно обращаться к методам, связанным с музыкой

    а что это за токен и как сгенерировать?


    1. bodyawm Автор
      13.04.2023 08:09
      +3

      Сейчас напишу в личку, чтобы не прикрыли раньше времени.


      Я знаю что пост будут читать ребята из ВК. Если приложение окажется нужным не только мне (а у меня выпрашивали билды еще до выхода статьи и первого релиза), то можем запилить полноценный раздел с музыкой: вы только будьте подобрее к разработчикам кастомных клиентов!


      1. LulzLoL231
        13.04.2023 08:09
        +1

        Буду рад если и со мной поделитесь этой информацией)))


        1. bodyawm Автор
          13.04.2023 08:09
          +1

          Поделился)


  1. Rusrst
    13.04.2023 08:09
    +14

    Асинхронную часть чем делали - handlerthread, threads, executors?


    1. bodyawm Автор
      13.04.2023 08:09
      +2

      Та блин, мисскликнул. Поставьте человеку плюсик пожалуйста!

      Да, два тредпула через Executors: один на кэширование превьюх, другой на запросы. Хотя там в любом случае есть что оптимизировать: на совсем слабых устройствах, подгрузка и разбор сообщений вызывают тормоза в основном потоке, причём тормоза вызывает именно фетчинг результата с сервера, а не разбор JSON (что было бы логично т.к там жсоны по 50-60кб приходят).

      В основном потоке по сути только notifyDataSetChange вызывается и разбирается уже распарсенный датасет (пока еще не профайлил, но явно это не узкое горлышко).
      Handler'ы юзаются как таймеры для обновления диалогов/сообщений.


      1. Rusrst
        13.04.2023 08:09
        +1

        Мне кажется что очередь в handlerthread была бы полегче и все там парсить - json, что там ещё приходит.

        Плюс там же можно результат для адаптера посчитать. А то вы его перерисовывает весь, не думаю что ему это нравится сильно.


        1. bodyawm Автор
          13.04.2023 08:09
          +2

          Там обычный BaseAdapter, если вопрос касается отрисовки - то обновляются же только видимые в данный момент вьюшки. Реюзабельность вьюшек там есть - с этим проблем нет, но есть небольшие глюки с кэшированием картинок. Пофикшу попозже.

          Там впринципе можно было и просто заменить тредпул на SingleThreadExecutor (который тоже умеет ставить таски в очередь). JSON, к сожалению, нельзя парсить в несколько проходов :( Однако у меня все равно ощущение, что основной боттлнек именно работа с сетью.


          1. thevlad
            13.04.2023 08:09

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


            1. bodyawm Автор
              13.04.2023 08:09

              Это все же больше от парсера зависит. Я юзаю org.json, т.е стандартную реализацию.

              Я чутка потестил, всё таки именно сеть даёт подтормаживания и не на каждом девайсе) Надо будет закостылить свой хттп клиент и померить, авось проблема именно в нем


              1. thevlad
                13.04.2023 08:09
                +1

                К слову, это достаточно просто оценивается. Даже если медленное процессорное ядро и не самая оптимальная реализация, парсер json все равно линейный, с небольшой константой. Реалистично, даже в худшем случаи там будет 10 такт на байт входного текста, то есть для 50К, это максимум 0.5 M тактов. Даже если промахнуться на порядок, все равно ни о чем.


    1. bodyawm Автор
      13.04.2023 08:09
      +3

      У Android ещё есть приколы: более-менее отрисовку UI подтянули только к четверке, на 2'ках она еще была местами тормозной. И я удивился, что нельзя просто склонировать произвольный View: нужно обязательно вызывать LayoutInflater и заново заставлять всю систему фетчить ресурс, парсить бинарный xml, задавать атрибуты и.т.п. Можно же было сделать условный LayoutPrefab, который бы просто создавал уже готовые вьюшки?


      1. Rusrst
        13.04.2023 08:09
        +1

        Вот чем больше я знакомлюсь с системой вью, тем больше убеждаюсь насколько она все же грамотно была сделана, layout inflater - это и есть ваш prefab, который создаёт вьюшки. Если не нужен префаб, всегда есть конструктор только с контекстом. Для него есть даже asynkinflater - но сам я его ни разу не щупал.

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


        1. bodyawm Автор
          13.04.2023 08:09
          +2

          Я не совсем про это. Каждый вызов layoutinflater'а (по крайней мере на старых андроидах) грузил ресурс и парсил layout заново, что создавало неприятный оверхед. Но возможно сейчас под капотом все автоматом кэшируется, поэтому костыли с инфлейтером не нужны.


          1. Rusrst
            13.04.2023 08:09
            +2

            В любом случае вы большой молодец, работа на старых версиях без appcompat это то ещё удовольствие. С другой стороны гайки тогда не были так сильно закручены в плане разрешения, фоновой работы и прочих разрешений :)


            1. bodyawm Автор
              13.04.2023 08:09

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

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


  1. HiMem-74
    13.04.2023 08:09
    +2

    Автор молодец однозначно!
    Лежит дома планшет (кажется Huawei) с великолепным IPS экраном 10", но увы, на Андроид 4.2 невозможно найти ни Ютуб клиента, ни навигатор, ни клиента в покер онлайн поиграть...
    Хорошо хоть читалку книг удалось найти по форумам...


    1. bodyawm Автор
      13.04.2023 08:09
      +1

      Хз насчет покера, а вот в дурака можно поиграть - Дурак Онлайн (залипал в нее в шараге целыми парами).

      Ютуб еще год назад работал :(


    1. ruraic
      13.04.2023 08:09
      +2

      Для Ютуб есть NewPipe Legacy, поддерживает Android 4.1+ и вполне сносно работает
      Для навигации подойдет Osmand 3.4.x


  1. Belkogoth
    13.04.2023 08:09
    +1

    Блин, вот для классики WinCE и WM 5/6 бы такое еще))


    1. bodyawm Автор
      13.04.2023 08:09
      +1

      Для вм активно ношу идею, т.к у меня несколько кверти девайсов на нем, а ещё у WM очень привычное мне окружение в виде винапи и возможности писать на C# + обычном "десктопном" WinForms.

      TyTN II, X7500, 9100


      1. Belkogoth
        13.04.2023 08:09

        Ох, титан, как же я хотел этот кайзер)) Но откуда у студентолуса на него деньги было найти?)) Был только б/ушный купленный на Юноне в Питере р4350 геральд, но и тот я с удовольствием использовал) позднее прикупил на том же рынке Eten m700) Но кверти девайсы мне в итоге тогда полюбились, очень удобно было в аське и чатах висеть, в то время как многие тогда мучались с обычными кнопочниками)


        1. bodyawm Автор
          13.04.2023 08:09

          Не, это не кайзер, это афина x7500 :) Кайзер - это TyTN II (слайдер с кверти).

          x7500 очень дорогой девайс был: цена варьировалась до 1.5к$-2к$. Но там и фишек куча: здоровый дисплей высокого по тем временам разрешения (VGA), поддержка minisd флэшек вкупе с встроенной NAND и MicroDrive жестким диском (!), клава была из настоящей кожи, флагманский ЦПУ по тем временам, куча ОЗУ, 3D ускоритель)


          1. Belkogoth
            13.04.2023 08:09
            +1

            Не, я ж про титан из списка, а не на фото)))

            А 7500 даже не видел ни разу) Роллс-Ройс от мира наладонников)) Ускоритель часом не какой-нибудь ati imageon))

            З.ы. а, не, поглядел обзор - видел его, я студентом часто бродил по магазину Кей на Техноложке в Питере, он рядом с вузом был. Засматривался на этот ээм.... Ну типа UMPC, но до полноценного он не дотягивал - в соседнем отделе стоял соньковский UMPC на базе ХР)) Вот это был вообще топ)


            1. bodyawm Автор
              13.04.2023 08:09

              X7500 можно было подключить к монику или телику. Вот это был канеш кайф) Видеоускоритель там Intel 2700G (который в свою очередь один из ранних PowerVR'ов)


      1. Okeu
        13.04.2023 08:09

        Про винду было бы интересно почитать) подпишусь.
        У меня на полке лежит Samsung WiTu i900, полным комплектом, недавно стряхивал с него пыль - живее всех живых)


        1. bodyawm Автор
          13.04.2023 08:09

          Ну, кое-какие наработки уже есть) Диалоги грузить умеем, сообщения тоже, скоро отправлять научимся)


  1. GreyArt
    13.04.2023 08:09

    А что нить такое но с телегой сможешь провернуть? =)


    1. bodyawm Автор
      13.04.2023 08:09
      +1

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


      1. xkafkax
        13.04.2023 08:09

        на МТПрото есть клиенты с проксированием на чужих серверах, ну и для селфхоста есть всё.


  1. Neitr
    13.04.2023 08:09
    +1

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


    1. bodyawm Автор
      13.04.2023 08:09

      К сожалению, нет :( Публичного API то нема((


      1. Neitr
        13.04.2023 08:09

        А можно на старом Андроиде эмулировать более современный? Ам ожет вообще самый лучший вариант как то урезать современный Андроиды чтобы из можно было установить на старые сматрфоны


        1. bodyawm Автор
          13.04.2023 08:09

          Ну, формально "эмуляцией" нового андроида занимается AppCompat. Только он не эмулирует в привычном смысле, а ещё раз реализует компоненты, доступные в более свежих андроидах, на более старых. Но чтобы его юзать, нужно пересобирать приложеие.

          Урезанные андроиды юзаются во всю - см. кнопочники на Android 4.4


          1. iShrimp
            13.04.2023 08:09

            На какой минимальной версии API реально работает AppCompat? Одни мануалы утверждают, что с 15-й, другие - с 16-й. Android studio также поддерживает API 16+.


            1. bodyawm Автор
              13.04.2023 08:09

              ~7-8


              1. iShrimp
                13.04.2023 08:09

                Это же насколько старая версия AppCompat нужна? Меня в основном интересует андроид 4.0+, на более старые системы её наверное вообще не стоит тащить.


    1. Coppermine
      13.04.2023 08:09
      +1

      В Face... простите, Meta, сидят нехорошие дяди и хорошие юристы, силами которых на github массово удаляли репозитории, где их API реверсили (ибо открытого нет, как уже раньше писали). Более того, за сторонние/модифицированные официальные клиенты (например, с 4pda) меня банили на несколько дней. Так я на своём Passport и не смог заставить Whatsapp работать.


  1. SaemonZixel
    13.04.2023 08:09
    +1

    Эхх... А я сижу на старом iPhone4. С ним такое не прокатит.


    1. bodyawm Автор
      13.04.2023 08:09
      +1

      Прокати, там можно дебажить приложения с джейлбрейком и старым xcode, но сорян, я objective-c не перевариваю(

      Если кто-то могёт objc и хочет реализовать клиент - пишите в ЛС, предоставлю доки к прокси-серверу) Там датасеты в очень простом формате)


    1. nitro80
      13.04.2023 08:09
      +1

      У меня на работе лежит iPad 3, из офф. маркета ничего не устанавливается. Пара-тройка игрушек, читалка книг и клиент для di.fm.

      И всё! Некогда хороший планшет превращается в тыкву, и safari с трудом переваривает те сайты, на которых он когда-то летал.


      1. E2r7hN07Fl47
        13.04.2023 08:09

        Н-да, телега еще не так давно на iOS 9 работала, а сейчас уже нет.

        У меня тоже iPad 3, я его приспособил как дополнительный монитор к компу - приложение Duet Display понравилось больше всего, пробовал еще spacedesk, но он сильно тормозил.


        1. SaemonZixel
          13.04.2023 08:09

          Хмм... У меня на iOS 7.1 стоит Телеграм 4.9.2 и продолжает работать. Но естественно не всё поддерживает. Всплывает "Unsupported User" для контактов зарегистрированных недавно. В каналах иногда встречаются "Not compatible message type". Звонки тоже не работают. Но пользоваться вполне можно)


          1. E2r7hN07Fl47
            13.04.2023 08:09

            Надо будет посмотреть. У меня Telegram 8.9.1, выдаёт ошибку, outdated app при попытке залогиниться - из аккаунта разлогинило, не пользовался телегой на айпаде наверно год или два.


          1. bodyawm Автор
            13.04.2023 08:09

            Телеграм ввёл 64х битные ID в позапрошлом году, от того и Unsupported :)


  1. conrad98
    13.04.2023 08:09

    Моноблочные кнопочные Самсунги - огонь!

    Есть две итерации, у первой аж кнопки стëрлись, а вторая супер, недавно загружал.

    Кста и первая тоже работает)


  1. E2r7hN07Fl47
    13.04.2023 08:09

    На самом деле даже для сборки под Android 1.0 не нужна такая древность, как Eclipse ADT, достаточно взять старый Android Studio.

    Я под свой HTC Dream (прошит под ADP1 на Android 1.5) собираю в Android Studio 2.3.2 (самая ранняя, доступная на оф. сайте). Но там кажется проект под SDK 1 не создается, создавал я на Android Studio 1.0.1. Но возможно и в 2.3.2 получится, я не помню уже точно :)


    1. bodyawm Автор
      13.04.2023 08:09

      Спасибо за наводку!


      1. E2r7hN07Fl47
        13.04.2023 08:09

        Проверил, и да, 2.3.2 даёт создавать только от API 9.
        При этом 1.0.1 даёт от API 1, но в 1.0.1 есть баг, он не может нормально стереть старую копию и/или обновить поверх (по крайней мере у меня так было несколько раз).


  1. xkafkax
    13.04.2023 08:09

    Я бы с радостью пользовался дальше Е72, там и телеграм через МТПрото работал,и ютуб скачивался и сеть хорошо работало. НО! давно не обновляющаяся putty не позволяет больше пользоваться ssh и это провал(


  1. Coppermine
    13.04.2023 08:09
    +2

    Отличная работа!

    *пошёл доставать из ящика свой Blackberry*


    1. bodyawm Автор
      13.04.2023 08:09

      только доставать!? Хожу с своим Z30, купленным недавно за 500 рублей, каждый день!


      1. Coppermine
        13.04.2023 08:09
        +1

        Увы, там отвалилась сотовая сеть. В ремонте только разводят руками, мол, ты не единственный, не знаем, что делать.


        1. bodyawm Автор
          13.04.2023 08:09

          Автолоадером шили с модемом?


  1. XenRE
    13.04.2023 08:09

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

    Вот это смутило — неужели нельзя нужные сертификаты притащить с приложением или зашить в систему? Сторонний прокси сервер — как-то оверкилл для запуска приложения на древнем смартфоне.
    А вообще, неужели такая пробщема обновить сертификаты? ИМХО древние девайсы имеют право на жизнь, но не вижу смысла цепляться за древние версии ОС в исходном состоянии.


    1. bodyawm Автор
      13.04.2023 08:09
      +1

      Увы, но да, проблема. Тут еще суть в том, что старые устройства не умеют TLS 1.3, на котором работают современные сайты. Из-за этого даже если подсунуть свежие сертификаты, мы получаем ошибку при handshake (т.е установке соединения).

      Что касается хранилища сертификатов - то тут по разному. Корневые сертификаты в 1.5-2.3 хранятся в виде блоба в системном разделе. Просто так не обновить, как минимум без root прав.

      А почему прокси оверкилл? 170 рублей в месяц не обременяют меня) Плюс, прокси отдает данные в очень простом и удобноваримом формате, благодаря которому я уже запилил основу клиента ВК под WinMobile и J2ME - не нужно замарачиваться с парсингом тяжелого JSON, нужно запилить лишь "морду" приложения)


  1. Serg10
    13.04.2023 08:09
    +1

     основное процессорное время уходит на разбор тяжелых JSON

    У VK API есть хранимые процедуры. Можно взять нужный метод, который возвращает портянку и прям на сервере VK обработать его и вернуть нужные поля.


    1. bodyawm Автор
      13.04.2023 08:09

      Точно! А я про них и забыл :)