Обновить
128K+

Android *

Пишем под самую популярную мобильную ОС

158,14
Рейтинг
Сначала показывать
Порог рейтинга
Уровень сложности

Google: борьба за безопасность или очередное выманивание денег!?

Уровень сложностиПростой
Время на прочтение2 мин
Охват и читатели6.5K

Ну вот и докатились. Многие уже, наверное, слышали о выходе очередных ограничений от компании Google для Android‑разработчиков. На этот раз дело коснулось святая святых — независимых авторов, распространяющих свои приложения в обход официальной платформы Play Store. Под видом заботы о пользователях выраженной в обеспечении безопасности при распространении софта Google подложил неожиданную свинью.

Что уж говорить о недавнем случае, когда Google, мягко говоря, кинул своих клиентов на деньги. Разработчики щедро оплачивали регистрацию в Google Console и публиковали свои разработки. Ничто не предвещало беды. Потом Google выкатил депешу — мол, необходимо пройти верификацию личности разработчика и прислать документы для подтверждения. Многие тогда были возмущены и в результате потеряли свои аккаунты. Google просто их заблокировал.

Теперь для полноценного распространения приложений даже вне Google Store разработчикам необходимо пройти регистрацию в Android Developer Console. Основными требованиями стали предоставление личных документов, генерация хеша APK‑файла, указание имени пакета и самое «вкусное» — оплата членского взноса в размере всё тех же 25 долларов США за эту самую регистрацию. В итоге, если раньше разработчики распространяли свои приложения вне Google Store бесплатно, теперь Google решил залезть в карман и к ним.

Зачем Google это делает?

Версия Google: защита пользователей от вредоносного ПО, фишинга и клонов популярных приложений. Привязка к паспорту и хеш‑файлу позволяет заблокировать злоумышленников «намертво», чтобы они не смогли создавать тысячи анонимных аккаунтов.

Читать далее

Новости

Экран перестал обновляться, и виноват оказался не ваш код

Уровень сложностиСредний
Время на прочтение9 мин
Охват и читатели11K

Экран получил первое состояние и застыл: запросы проходят, исключений нет, а в дебаге проблема вообще не воспроизводится. Разбираемся, почему StateFlow может «замолчать», как отличить особенности его семантики от реального бага и при чём здесь R8 в релизной сборке Android‑приложения.

Разобраться в StateFlow

Как я делал мессенджер, который выглядит как обычный HTTPS: пять инженерных историй

Уровень сложностиСредний
Время на прочтение10 мин
Охват и читатели9.1K

Пять инженерных историй из разработки федеративного мессенджера со сквозным шифрованием: сигнатуры DPI в WebRTC, почему не чистый PGP, сеть узлов-тайников по модели Ceph, неделя на буфер в 2048 байт и гудки в звонках

Читать далее

Одна аналитика на две платформы: как мы синхронизировали iOS и Android в hh.ru

Уровень сложностиСредний
Время на прочтение13 мин
Охват и читатели5.5K

Всем привет! Меня зовут Максимкин Андрей, я iOS-разработчик в hh.ru. В далеком 2023 году мы уже рассказывали про нашу мобильную аналитику в этой статье. С тех пор много воды утекло, а вместе с ней поменялся и наш флоу работы с аналитикой. И начну я как раз с того, что нас к этому подтолкнуло. 

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

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

Читать далее

Правда о Coil в Jetpack Compose: измеряем реальный оверхед SubcomposeAsyncImage

Уровень сложностиСложный
Время на прочтение16 мин
Охват и читатели5.4K

«SubcomposeAsyncImage в списках использовать нежелательно, он тормозит скролл» — так написано в документации популярной библиотеки Coil. Действительно ли это так, и во сколько миллисекунд обходится сабкомпозиция на самом деле?

Я провел масштабный бенчмарк: взял 5 разных популярных способов загрузки картинок на тяжелом датасете из 500 элементов с замерами через Macrobenchmark на реальных устройствах, далее сравнил результаты с прогнозами четырех нейросетей (Claude, DeepSeek, Gemini, Qwen), а так же обнаружил неожиданный архитектурный нюанс.

Разбираемся, почему FPS врет, в чем коварство P99, как ошибаются нейросети, и какая стратегия добавления изображения в списки на самом деле быстрее всех.

Читать далее

Как я сделал лыжный тренер на датчиках и вайб‑кодинге — вместо подписки на готовый

Уровень сложностиПростой
Время на прочтение11 мин
Охват и читатели6K

На рынке есть готовые продукты: пара датчиков на ботинки, приложение считает технику катания, подсказывает, что тренировать. Работает неплохо. Но по подписке — и недёшево: например, у Carv безлимитный сезонный доступ стоит $249 / £199 в год. И вот тут возникает вопрос: насколько эта подписка вообще оправдана? Датчик — это акселерометр с гироскопом за пару долларов и Bluetooth‑модуль, приложение — по сути обработка сигнала и немного статистики. Разовая покупка железа плюс разработка — понятные, конечные затраты. А подписка — плата за то, что уже посчитано один раз и с тех пор просто работает. Есть ощущение, что здесь платишь не за вычисления, а за то, что вход на рынок для конкурентов высокий: откалибровать алгоритмы, написать мобильное приложение, а потом ещё поддерживать серверы, пользователей и производство железа — дорого и долго. Подписка отбивает эти инвестиции. Но большая часть этого барьера — стоимость разработки, а она за последние пару лет резко упала: с ИИ‑инструментами то, что раньше требовало команды, становится посильным для одного человека. Продукт для рынка так не сделать — там нужна калибровка на тысячах лыжников, поддержка и сертификация. А вот любительский инструмент — вполне.

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

Читать далее

Как я сделал датчик присутствия из Яндекс ТВ и роутера

Уровень сложностиСредний
Время на прочтение7 мин
Охват и читатели7.1K

У меня есть умный телевизор Yandex. По моему субъективному мнению колонки и ТВ у Яндекса получились отличные. Но иногда появляется желание сделать умный телевизор чуть умнее.

На очереди функция «датчик движения». Конечно же, хотелось использовать CSI, поскольку он в отличие от грубых интегральных метрик вроде RSSI (уровень мощности сигнала) предоставляет детализированную оценку радиоканала на уровне отдельных поднесущих частот. Что, в принципе, позволяет пойти сильно дальше просто обнаружения присутствия.

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

Самый доступный вариант — RSSI, уровень принимаемого сигнала. Android отдаёт его через WifiInfo.getRssi() в dBm. По сути, мы видим одно число: сейчас −30, через некоторое время −34. Можно увидеть изменение мощности, но нельзя понять по этому числу, что произошло с отдельными составляющими радиоканала.

CSI — Channel State Information — даёт сильно больше подробностей. Вместо одного показателя мощности можно получить оценки амплитуды и фазы на отдельных поднесущих OFDM, а при соответствующей поддержке — ещё и для разных пар передающих и принимающих антенн. Общая мощность может почти не измениться, хотя внутри этой картины уже что‑то произошло. Для поиска движения это интереснее, но такие данные ещё нужно очистить от помех и особенностей измерения.

Читать далее

Разработка CAN адаптера (часть 1)

Уровень сложностиПростой
Время на прочтение9 мин
Охват и читатели753

Если при слове CAN вы представляете автомобиль и поток данных между его блоками, а слово терминатор, ассоциируется в первую очередь с резистором на 120 Ом, то возможно Вам будет интересно почитать как я дополнил существующий зоопарк CAN адаптеров своим собственным зверем с мобильным приложением для диагностики и логирования.

Читать далее

Мобильная разработка за неделю #648 (28 сентября — 4 октября)

Время на прочтение5 мин
Охват и читатели6.2K

В этом дайджесте применение gRPC в iOS и A2UI в Jetpack Compose, добавление новых сценариев в существующее Android-приложение без технического долга и офлайн-карта в кармане, отчет The State of Kotlin 2026, первое «убойное» приложение для iPhone Duo, нейросеть для игры в «Точки» и многое другое. Заходите!

Читать далее

Хочу выложить приложения в AppStore и вообще в магазины на всех платформах. Практический кейс

Уровень сложностиПростой
Время на прочтение4 мин
Охват и читатели10K

На мой взгляд самым удобным способом двухфакторной идентификации являются временные коды TOTP. А для своих проектов они хороши еще и как однофакторные. И вот именно такое приложение мы сделали и выкладывали в магазины приложений от лица уже полностью зарегистрированного разработчика - европейской фирмы. И это заняло неожиданно немало времени.

Читать далее

Edge‑навигация своими руками: ESP32 + Android + велосипед/мотоцикл

Уровень сложностиПростой
Время на прочтение6 мин
Охват и читатели12K

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

Телефон на руле — самая дорогая и хрупкая деталь. Руль живёт ударами, падениями, судьба вашего флагмана за пару тысяч баксов решается дешёвым зажимом, который ослаб на кочках. Даже без драматичного «вылетел на асфальт» хватает постоянного дребезга: стекло и корпус после пары сезонов уже не скажут вам спасибо.

А если повезёт не ушатать смартфон, то со временем неизбежно деградирует оптическая стабилизация. Мото и жёсткий велоруль дают вибрацию, под которую модуль камеры просто не проектировали. Со временем OIS “устаёт”: люфт, стук при встряхивании, мыло на видео. Держалка с амортизацией смягчает, но спектр двигателя и дороги никуда не девается.

Ну и в довершение — привычный бытовой ад: блики от глянца, неизбежно выгорает дисплей, батарея погибает.

Мне нужно было другое. Не смартфон на траверсе, а маленький экран в периферийном зрении: куда свернуть и через сколько метров. Телефон пусть лежит в кармане или сумке, а за навигацию отвечает штука, которую не жалко и в которой нет OIS за полцены флагмана.

И ещё одно, для меня принципиальное: я не хотел менять навигатор. Я езжу в 2ГИС (дальше добавлю Яндекс). Пробки, избранное, привычный поиск — всё уже есть. Идея «скачай наше отдельное приложение, там свои карты» меня бесит. Значит, нужен мост: привычный навигатор на телефоне → крошечный HUD на руле.

Читать далее

zhim.fit: приложение для персонального тренера без подписок и регистрации

Уровень сложностиПростой
Время на прочтение5 мин
Охват и читатели6.9K

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

Читать далее

Если у вас Android, жизнь стала чуточку легче

Уровень сложностиПростой
Время на прочтение3 мин
Охват и читатели16K

Привет, Хабр!

Если вы читали прошлые статьи, то знаете Гига Писаря: зажимаешь клавишу, говоришь, отпускаешь, и текст появляется там, где стоит курсор. Распознаёт речь модель GigaAM от Сбера, прямо на устройстве, без интернета.

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

Читать далее

Ближайшие события

Смотрим кино вместе на своём сервере: как заставить плееры идти в ногу и не дёргать картинку

Уровень сложностиСредний
Время на прочтение9 мин
Охват и читатели8.6K

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

Я сделал совместный просмотр в своём self-hosted медиацентре Avalon MediaCard. У каждого участника идёт оригинальный поток без пережатия напрямую с сервера, а бэкенд следит только за тем, чтобы все зрители находились ровно в одной точке фильма. А если это сериал, комната никуда не исчезает: она сохраняется вместе с текущей серией и секундой, чтобы в следующий раз можно было продолжить ровно с того же места.

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

Читать далее

Как анимировать матрицу на Swift UIKit

Уровень сложностиСложный
Время на прочтение9 мин
Охват и читатели4.9K

В этой статье Леша, ведущий разработчик Совкомбанк Технологий, поделится опытом реализации необычной и сложной анимации в приложении Рокетбанка. А именно матрицы чисел, которая появляется, когда пользователь входит в оформление цифровой кредитной карты.

Читать далее

ч2: Разбор. Как мы закрывали утечку через tun0 в AmneziaVPN

Уровень сложностиСложный
Время на прочтение26 мин
Охват и читатели21K

Приложение, которое вы исключили из VPN на Android, может привязать сокет к tun0, пройти через ваш туннель и узнать адрес сервера. Летом мы взялись закрыть это в AmneziaVPN (issue #2457). Сама проверка в AmneziaWG уместилась в одну строчку цикла, который читает пакеты из tun:

if uidfilter.Supported && !device.tun.uidGate.AllowOutboundPacket(elem.packet, device) { continue }

Вокруг неё набралось полтысячи строк Go и столько же тестов, мост через JNI и три раунда ревью. В статье — почему ядро пропускает такие пакеты, почему «владелец неизвестен» у нас значит отказ, как одно приложение могло остановить весь туннель и какую ошибку мы нашли уже после ревью в собственном мосту. На телефоне с фильтром до сервера доходит 0 попыток обхода из 6, без него все 6. Но улучшать ещё есть что, и разбор мы пишем для двух целей: чтобы другим клиентам было проще закрыть ту же дыру и чтобы собрать критику. Если увидите у нас слабое место, напишите.

Читать далее

ч1: Обзор. Полгода после утечки через tun0. Кто из VPN-клиентов закрыл дыру, а кто закрыл issue

Уровень сложностиСредний
Время на прочтение11 мин
Охват и читатели85K

Исключите Termux из VPN на Android-телефоне и выполните в нём одну команду:

curl --interface tun0 https://ifconfig.me

Лучше перебрать tun0-tun9

Если в ответ пришёл адрес вашего VPN-сервера, значит приложение, которое по вашим же настройкам не должно ходить в туннель, только что сходило через него. Ни root, ни своего кода для этого не нужно. А пароль на локальный прокси, который весной добавили многие клиенты, от этой утечки не спасает.

С весны прошло полгода. Мы прошли по трекерам и релизам 28 клиентов и прочитали код тех, кто утечку закрыл. Проверку владельца соединения сделали двое. И у обоих, судя по коду, была одна и та же ошибка. Про исключённое приложение Android отвечает «владелец неизвестен». И именно такие соединения они пропускали. Один клиент исправил это в тот же день, как мы написали ему. Второй пока молчит. Ниже обзор: кто закрыл дыру, кто закрыл issue, и что можно сделать уже сейчас.

Читать далее

Как добавить новый сценарий в существующее Android-приложение без технического долга

Уровень сложностиСредний
Время на прочтение14 мин
Охват и читатели4.7K

Привет! Меня зовут Ирина, я Android-разработчик в SimbirSoft. Хочу поделиться с вами опытом разработки новых функций и рефакторинга существующих модулей Android-приложения компании «Юрент» — одного из крупнейших в России сервисов аренды электросамокатов (кикшеринга).

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

Материал в первую очередь ориентирован на специалистов Mobile Team Lead/ Tech Lead, так как именно им предстоит принимать архитектурные решения и защищать их перед менеджментом.

Узнать, как не множить техдолг ✅

Офлайн-карта в кармане: 48 районов, PMTiles и телефон, который в 90 раз медленнее ноутбука

Уровень сложностиСредний
Время на прочтение9 мин
Охват и читатели8K

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

Читать далее

Универсальный, но не вполне: как мы интегрировали Matter over Wi-Fi в Умный дом Сбер (и с чем столкнулись)

Время на прочтение15 мин
Охват и читатели5.9K

Привет, Хабр!

Недавно мы выпустили интеллектуальные колонки СберБум 2.0 — хаб умного дома, который поддерживает протоколы Zigbee и Matter over Wi-Fi. Zigbee у нас был и прежде, а вот Matter over Wi-Fi — нет. Внедрение оказалось предсказуемо сложным: требовалась архитектура, глубоко интегрированная в наш бэкенд. Тем не менее, получилось перевести генерацию операционных кредов из библиотеки в бэкенд; реализовать передачу роли контроллера между смартфоном и колонкой, чтобы пользователю было удобнее подключать устройства; решить проблему типизации end-устройств в Matter (да, это проблема), переиспользовав собственный скриптовый язык, который применяем в хабе. Рассказываем.

Читать далее
1
23 ...