Обновить
128K+

Android *

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

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

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

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

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

Читать далее

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

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

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

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

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

Читать далее

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

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

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

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

Читать далее

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

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

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

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

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

Читать далее

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

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

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

Читать далее

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

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

Привет!

Представьте, что вы с удовольствием пишите один код на все платформы на 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 мин
Охват и читатели8.4K

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

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

Читать далее

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

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

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

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

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

Читать далее

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

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

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

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

Читать далее

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

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

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

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

Читать далее

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

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

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

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

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

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

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

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

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

Читать далее

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

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

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

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

Читать далее

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

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

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

Читать далее

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

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

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

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

Читать далее

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

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

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

Читать далее

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

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

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

Читать далее

Паничный PIN, который отдавал ключ от всего: разбор ошибок

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

Мы делаем мессенджер RCQ (rcq.app, исходники клиентов на github.com/rcq-messenger). В нём есть штука, которую в разных приложениях называют по-разному: паничный PIN, duress PIN, подставной код. Смысл один. У вас просят разблокировать телефон, вы вводите второй PIN, и человек напротив видит приложение, в котором ничего интересного нет.

В августе мы сели проверять какие у нас остались проблемы с этой фичей. Проверка началась как формальность перед внешним аудитом: пройти по коду, сверить с тем, что написано в модели угроз, поправить формулировки. Закончилась она тем, что на Android подставной PIN оказался не границей, а ключом от всей переписки.

Читать далее

v1.10: роли, личности и снова этот WardLink…

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

Не буду повторятся и заново объяснять что такое ONYX, в этой статье я уже все подробно описал. Это обзор нового обновления.

Читать далее

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

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

В этом дайджесте Android-приложение Polymarket на Swift, Structured Concurrency и отмена корутин, что нового во Flutter 3.47 и разработка мобильного приложения с помощью Claude Code, конкурирующие магазины приложений в Play Store, ИИ, парализовавший принятие решений и многое другое. Заходите!

Читать далее

# DI без рефлексии и бойлерплейта: магия KSP в действии

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

Погряз в боли настройки DI в многомодульных проектах и решил написать собственный велосипед на Kotlin Symbol Processing. Рассказываю, как поэкспериментировал с генерацией кода, победил R8/ProGuard, добавил compile-time валидацию графа и что из этого вообще получилось

Читать далее