Обновить
256K+

Android *

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

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

Мобильная разработка за неделю #645 (24 — 30 августа)

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

В этом дайджесте надежное выполнение фоновых задач в iOS и детекция лица в реалтайме для биометрии в Android, забавные анимации с меш-градиентами в Jetpack Compose и кастомизация пейволов с Apple Foundation Models, Kotlin Coroutines Channels и Actor‑модель, фоновые задачи в KMP с API как у WorkManager, разработка на Авроре под Аврору, двуногий робот в форме утёнка от Hugging Face и многое другое. Заходите!

Читать далее

Новости

Автономное ПО для велокомпьютера

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

Несколько лет назад я стал обладателем отличного велокомпьютера CYCPLUS M1. За свою скромную стоимость он предлагал возможность писать GPS трек и подключить кучу датчиков. Велосипедист я со стажем, и у меня еще не стерлись воспоминания как я прикручивал магнитики к спицам и вымерял расстояние до геркона, для того чтобы заработал велокомпьютер, который умел только измерять скорость расстояние. На фоне этих воспоминаний, то что обещал данный прибор выгладило как волшебство.

Читать далее

Включение HotSpot Android по триггеру BT

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

Есть у меня довольно простой автомобильный сценарий. Я сажусь в машину, телефон автоматически соединяется по Bluetooth с магнитолой, а самой магнитоле для навигации, пробок и прочих радостей нужен интернет через Wi‑Fi. Каждый раз доставать телефон, открывать шторку и вручную включать точку доступа мне в какой-то момент окончательно надоело.

Казалось бы, задача на пять минут: поймали подключение нужного Bluetooth-устройства и вызвали системную функцию включения hotspot. Но с недавних пор эту лавочку в Android прикрыли. Обычному стороннему приложению прямого доступа к управлению tethering уже не дают, даже если пользователь сам этого хочет.

В итоге получилось небольшое приложение BlueSpot на C#/.NET, которое делает ровно одну вещь: при подключении к выбранному Bluetooth-устройству включает системную Wi‑Fi-точку и присылает уведомление. Root не требуется, но без небольшого легального извращения в виде Shizuku не обошлось.

Читать далее

Обзор MWS SunQ: ферма устройств на iOS и Android

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

Тут должна быть картинка

Привет, Хабр! Когда-то я пять лет проработал в отделе тестирования, а последние шесть занимаюсь разработкой под iOS и Android. На одном из первых проектов в мобилке я на Java под Android создал пирамиду тестирования: больше тысячи unit-тестов, больше ста интеграционных и с десяток UI и End‑to‑End. На текущей работе сделал то же самое с нуля, но уже под iOS на Swift.

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

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

Начал разбираться и узнал, что есть множество мировых ферм устройств: BrowserStack, Sauce Labs, LambdaTest, AWS Device Farm, Firebase Test Lab и другие. Но все они зарубежные. С текущими перебоями интернета в РФ — ненадежный вариант. Оказалось, что в России, кроме приватных ферм у корпораций, есть MWS SunQ. Можно развернуть STF и Appium самому — но это больше задача для DevOps. И ограничена теми устройствами, что есть у фирмы. У нас их штук десять — для полноценного тестирования мало. Поэтому я решил разобраться с MWS SunQ.

Читать далее

Как я заставил HTML из ChatGPT будить телефон: песочница, точные будильники и мост из пяти методов

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

Попросил Claude написать таймер одним HTML-файлом — а телефон его не будит: вкладка спит, будильник не звонит. Сделал Kapsula: приложение для Android и iOS, которое запускает такой файл как проект с настоящими будильниками ОС через мост из пяти методов. Внутри — iframe без same-origin, postMessage-RPC, три грабли Android-уведомлений, звук на iOS, правило состояния для ИИ-кода и промпт вместо SDK. Без сервера, без аккаунта, без аналитики.

Читать далее

Как я написал круговой лаунчер на Jetpack Compose: тригонометрия свайпов и системные грабли

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

Большинство лаунчеров для Android повторяют одну и ту же концепцию сетки иконок. Чтобы открыть приложение, нужно листать бесконечные рабочие столы и тянуться пальцем до нужной иконки.

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

В этой статье я расскажу, как проект прошел путь от простого прототипа на 4 стороны света до динамической сетки на Jetpack Compose, с какими подводными камнями Android пришлось столкнуться и как устроена математика свайпов под капотом.

Читать далее

Снапшот-тесты доступности: как сэкономить ресурс QA-отдела и спасти ревьюеров от гадания на кофейной гуще

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

Почта — массовый продукт, которым пользуются самые разные люди, и поэтому он должен быть максимально доступен. Нам важно, чтобы приложение Яндекс Почты было удобно каждому, в том числе людям с особенностями зрения. 

На телефонах с Android за доступность для людей с особенностями зрения отвечает TalkBack — функция озвучивания экрана, которая зачитывает текст, роль и состояние всех размеченных элементов на экране и позволяет с ними взаимодействовать. Если разметка сломается, приложением будет пользоваться сильно сложнее или вообще невозможно.

Читать далее

Rokid Glasses RV101: зачем программисту очки, в которые можно залезть с кодом

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

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

Сейчас ситуация стала интереснее. Устройства наконец начали расходиться по разным веткам. Для игр и тренажёров остались большие VR-шлемы. Для виртуальных рабочих столов появились лёгкие очки-дисплеи. А рядом вырос новый класс - внешне почти обычные очки с камерой, микрофонами, динамиками, ИИ и небольшим экраном перед глазами.

Rokid Glasses RV101 относятся как раз к последнему классу. Мне они интересны не столько как готовый гаджет с переводчиком, телесуфлёром и камерой, сколько как маленький носимый компьютер, на котором разрешают запускать свой код.

Читать далее

«У меня ничего не грузится». Как я пришёл к приложению для диагностики сети

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

Эта история началась не с конкретного приложения, а с задачи, которая меня давно мучает: можно ли сделать простую диагностику для ситуации «у меня не работает интернет» — такую, чтобы человек запустил её самостоятельно и сразу проверил десяток сайтов и заодно состояние сети. Полностью заменить человека такой тест, конечно, не сможет. Но заметно сузить круг возможных причин — вполне.

Читать далее

Jabbit — фоновые задачи в KMP с API как у WorkManager (почти)

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

Привет!

Представьте, что вы с удовольствием пишите один код на все платформы на Kotlin Multiplatform, и вдруг приходит задача «синкать данные раз в час, только по вайфаю и когда телефон на зарядке».

Под Android вы берёте WorkManager и за пятнадцать минут закрываете тикет. Потом яблочный смежник открывает документацию по BGTaskScheduler и обнаруживает, что модель там вообще другая и работает всё по-другому: нет очереди задач, есть окна, которые система выдаёт по своему усмотрению и т. д.

В итоге в проекте появляется expect fun scheduleSync() с разными реализациями, которые ведут себя по-разному, и никто в команде через год не сможет сказать, что именно произойдёт на iOS, если приложение свернули посреди загрузки.

Так как я андроидер с альтернативным мышлением, мне нравится API WorkManager'а. Я захотел его скопировать под KMP, породив так называемый Kotlin Multiplatform Work Manager или же Jabbit (job + rabbit, да, я знаю) — планировщик фоновых задач для KMP.

Таргеты: Android, iOS, js и wasmJs. Как будет время и желание, появится ещё и декстоп.

Читать далее

Android CameraX: детекция лица в реалтайме для биометрии

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

Привет, Хабр! Я Евгений Шувагин, последний год работаю над компонентом Face-Shot в Т-Банке.

Представим ситуацию: клиент хочет перевести большую сумму, используя мобильное приложение. Внутренние системы видят подозрительную активность и запрашивают проверку по селфи, человек наводит камеру на лицо — получает отказ. А все из-за того, что на бэкенде была получена размытая фотография потолка с кусочком лица пользователя, по которому никак не понять, действительно ли это владелец счета хочет провести операцию. Клиент звонит в поддержку, злится. Банк теряет доверие. Именно такие сценарии заставили нас серьезно заняться качеством записываемого фото.

Читать далее

Делегирование работы облачным агентам

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

DoorDash построили внутреннюю платформу для облачных AI-агентов под названием Flux. Масштаб уже впечатляющий: за один месяц 2026 года через неё прогнали 130 000 инженерных задач, включая свыше 25 000 автоматических код-ревью в неделю и более 10 000 запусков playbook'ов из более чем 300 уникальных сценариев — всё это работает без участия человека, параллельно и круглосуточно.

Почему ушли от локальных агентов на ноутбуках

Команда описывает три конкретных ограничения агентных воркфлоу, запущенных прямо на машинах инженеров:

Читать далее

Я сделал CRM без бэкенда. Вот чего мне это стоило

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

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

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

Читать далее

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

Шпаргалка: Kotlin Coroutines Channels и Actor‑модель

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

Пытаюсь лучше понять работу Kotlin Coroutines. Беру небольшую тему про Kotlin Coroutines и пытаюсь разобраться и написать шпаргалку (максимально кратко и лаконично). Сегодня поговорим про Каналы (Channel) и паттерн Actor.

В предыдущих частях мы выяснили, что обычные suspend-функции возвращают результат только один раз. Но что делать, если у нас есть непрерывный поток данных, который асинхронно генерируется в одной корутине, а обрабатываться должен в другой (или даже в нескольких)? Нам нужна потокобезопасная «труба». В мире корутин этой трубой является Channel.

Читать далее

Почему баннер Yandex Ads мигает в LazyColumn — и при чём здесь AndroidView.onReset

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

Представьте обычный feed на LazyColumn: новости, карточки, между ними рекламный баннер. Баннер загрузился, пользователь пролистал его вниз, затем вернулся обратно, и мерцание реклама грузится заново.

Ещё раз вниз. Ещё раз вверх. Ещё одно мерцание и загрузка.

На первый взгляд причина кажется очевидной: item покидает экран, rememberBannerAdState теряет состояние, Compose создаёт всё заново. Значит, достаточно сохранить BannerAdState за пределами item и проблема исчезнет.

Я тоже так подумал.

Не исчезла.
Мерцания остались.

С этого момента простой баг (?) интеграции Yandex Ads превратился для меня в небольшое расследование: пришлось разобраться, что на самом деле происходит с item внутри LazyColumn, как SubcomposeLayout переиспользует composition, почему это ещё не означает переиспользование AndroidView и какой lifecycle поверх всего этого построил Compose API Yandex Ads.

В итоге вопрос «почему баннер моргает?» оказался гораздо интереснее самого workaround.

Читать далее

Приложение для быстрого запоминания текста на английском

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

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

И вот я не давно опять вернулся к пересказам. Но теперь уже не в школе и с тетрадкой, а в метро и с телефоном. Пользоваться гуглом транслейтом оказалось не так уж и удобно и я подумал а почему бы самому не сделать специализированное приложение с подстветкой нужной строки, с текстом на русском и английском и самое главное синхронной прокруткой двух окон на разных языках. Так и родился приложение «Удобный пересказ».

Читать далее

Мобильная разработка за неделю #644 (17 — 23 августа)

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

В новом выпуске 136 уровней вложенности XCUITest и Android Runtime под капотом, как Tinder сократил холодные старты на 47% и новые условия распространения приложений в Евросоюзе, от Event-Driven UI к State-Driven UI, что нового в Dart, как сделать MCP удобными и действительно полезными, уменьшение трения в приложениях и многое другое. Заходите!

Читать далее

Свой продукт для управления корпоративами: от MVP за 2 месяца до успешной версии 4.0

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

Привет, Хабр! Меня зовут Женя, я занимаюсь развитием цифровых продуктов в Sminex. В статье поделюсь опытом разработки и запуска Sminex Event — собственного продукта для управления корпоративами.

Читать далее

История создания звонилки без номера: месяц, миллионы токенов и грабли, которые легли в основу этого цикла статей

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

В октябре прошлого года на Хабре вышла статья «Как я писал свою звонилку для видеозвонков» — автор под ником CEOCTO за несколько вечеров написал P2P-видеозвонилку на WebRTC, потому что его достали обрывающиеся созвоны в мессенджерах. Я прочитал, улыбнулся, полез смотреть исходники на GitHub — и на этом всё. Как обычно бывает с чужими pet-проектами: оценил, закрыл вкладку, забыл

Читать далее

DragonDoll для Google Chrome: обновите ваш шпион до последней версии

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

Весной 2026 года специалисты направления Threat Intelligence экспертного центра безопасности Positive Technologies обнаружили необычную атаку на пользователей Саудовской Аравии с использованием неизвестного ранее APK-файл с именем Chrome.apk. Образец заинтересовал: за милой картинкой обновления Google Chrome и неожиданным требованием для работы «специальных возможностей» мы обнаружили тщательно защищенную от анализа цепочку запуска Android-шпиона.

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