Обновить

Мобильная разработка

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

Как я делал self‑host медиатеку на Kotlin Multiplatform и почему сервер «стримит» интерфейс на клиент

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

Я пользовался для трекинга фильмов и сериалов Кинопоиском, Trakt, Letterboxd, IMDb, TMDB, MyShows — и по-честному ни один из них не бесил настолько, чтобы стать поводом всё бросить и писать своё. У каждого свои шероховатости: у Кинопоиска в какой-то момент стало слишком много рекламы, а заодно убрали подробную статистику по жанрам и странам, которая раньше была. У Trakt банально медленный сайт, лимит в 1000 фильмов в списке и ограниченные возможности с созданием списков. У IMDb так и не появилось нормального трекинга сериалов. TMDB — просто не нравится интерфейс. С Letterboxd — не могу даже сформулировать, почему, просто не зашло. А MyShows,устраивает почти во всём: удобно, есть оповещения о новых сериях, реклама ненавязчивая, лёгкая подписка для поддержки сервиса.

Так в чём тогда была зацепка? Не в том, что существующие сервисы плохие — большинство из них вполне рабочие. А в том, что ни один не даёт того сочетания, которое хотелось: self-host, где данные и инфраструктура твои, а не чужие; стриминг собственного контента внутри того же интерфейса, где ты его трекаешь; и просто инженерный азарт — я долгое время обдумывал архитектуру гибридной SDUI/BDUI на Kotlin, когда сервер стримит слоты на клиент, а клиент рендерит заранее заготовленные UI-элементы, при этом чтобы приложение ощущалось и выглядело как нативное. Это была отдельная задача, которую хотелось решить независимо от недостатков конкурентов.

Клиент — минималистичный интерфейс с трекингом фильмов и сериалов: статусы просмотра, оценки, свои списки.

Читать далее

Новости

Свет в конце пайплайна: 3D-движок на чистом Dart (+gpu)

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

С появлением Flutter GPU у Dart-разработчиков впервые появился прямой доступ к Metal и Vulkan без единой строчки нативного кода. Чтобы понять, готов ли новый API к настоящим 3D-играм, я написал над ним движок на чистом Dart: сцена, PBR-освещение, каскадные и кубические карты теней, HDR-конвейер и три взаимозаменяемых графических бэкенда (Flutter GPU, WebGL2 и программный растеризатор), плюс три законченные игры, играбельные прямо в браузере. В статье разбираем границы Flutter GPU, устройство движка и самые дорогие грабли, собранные по дороге.

Читать далее

Мы переизобрели Gradle Flavors на KMP и вот почему

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

Если вы хоть раз работали с крупными KMP проектами, то наверняка хотели обратиться к старым добрым гредл флейворам, которые всем так хорошо знакомы по андроид разработке.

Но спустя 5 минут поисков до вас доходит осознание:Gradle Flavor на KMP нет и не планируется, а вместо них нам достается expect/actual, разбивающий код по платформенным сорц сетам

Читать далее

Мобильный аудио гид или как я делал приложение для самостоятельных городских прогулок

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

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

Гулял я как‑то по переулкам города. Старые здания, полные историй. А я страсть как люблю историю. Чей дом, когда построили, кто жил и что еще интересного. На фасаде нет таблички, экскурсовод рядом не материализовался. Постоянно доставать телефон, искать в интернете, открывать несколько сайтов то еще занятие. Можно сфотографировать здание и потом разобраться. Потом наступает примерно никогда.

Так и родилась идея Yerick City Explorer — Android‑приложение для самостоятельных городских прогулок.

Читать далее

Локальный компаньон для Genshin, HSR и ZZZ: как я упаковал три игры в офлайн‑приложение без бэкенда

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

Забыли забрать ежедневные гемы или потеряли счёт круткам до гаранта? Рассказываю, как я решил собственную проблему и разработал GachaPoint — бесплатный офлайн‑компаньон для Genshin Impact, Honkai: Star Rail и Zenless Zone Zero без бэкенда и рекламы.

В статье разбираю техническую изнанку проекта для Android (Java / Architecture Components): Зачем использовал «плоскую» таблицу в SQLite (Room) для календаря и как это ускоряет выборки за один запрос, Почему для сетки дней кастомный GridLayout оказался удобнее RecyclerView, Как настроить точные ежедневные напоминания через WorkManager с учётом жестких ограничений Doze Mode в Android 12/13+.

Исходники проекта открыты, буду рад обсудить архитектуру и UI‑решения в комментариях!

Читать далее

Как я перестал платить за macOS-минуты: перенос iOS-сборки с GitHub Actions на Xcode Cloud, с цифрами

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

Одна минута macOS-раннера в GitHub Actions стоит десять минут Linux. Я перенёс iOS-сборку Flutter-приложения в Xcode Cloud: с ~45 оплачиваемых минут на релиз до 6, без .p12 и профилей в секретах, с тремя shell-скриптами вместо 90 строк YAML. Внутри — схема тегов ios/v* и android/v*, настройки Xcode Cloud, которые молча сжигают compute-часы, и таблица семи падений первого живого прогона — ни одно из них не было ошибкой миграции. Плюс чек-лист и открытый скилл, который из этого вырос.

Читать далее

Миллион частиц на iPhone: строим аттрактор Лоренца на GPU с Metal

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

Привет! Я Максим Савченко, iOS-разработчик. Эта история началась с вопроса, как сделать живую форму в духе иконки Siri — и довольно быстро уехала в другую сторону: аттрактор Лоренца на сотнях тысяч, а потом и на миллионе частиц, где и расчёт, и отрисовка живут на GPU.

Вся схема держится на одной идее: состояние частиц на CPU больше не возвращается. Compute-шейдер читает один буфер, пишет в другой, render-pass сразу рисует результат, на следующем кадре буферы меняются местами.

В статье разбираю это по шагам: математика и выбор интегратора, ping-pong-буферы, compute/render-пайплайн, point primitives и additive blending. А в конце — GPU Frame Capture и замеры на физическом iPhone. Спойлер, который я сам не ожидал: RK4 в этой конфигурации оказался далеко не самым дорогим местом. Основная цена ушла в отрисовку и overdraw.

Если коротко: это не гайд «как нарисовать красивую картинку», а разбор того, зачем вообще лезть в Metal и где кадр упирается на реальном устройстве.

Читать далее

Спустя год разработки приложения для изучения иностранных слов — я наконец нащупал его главную концепцию

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

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

Но однажды открыл собственный словарь сербского и понял: все это время я решал не ту проблему.

Читать далее

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

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

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

Читать далее

Apple меняет домен Private Relay: почему Sign in with Apple нельзя строить вокруг email

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

Apple меняет домен новых Private Relay адресов для Sign in with Apple. Внешне это похоже на небольшую правку allowlist, но на практике быстро выявляет хрупкую архитектуру, где email участвует в поиске аккаунта.

На примере собственного аудита разбираю, чем sub из проверенного токена отличается от email, как пережить смену домена без дублей и какие проверки нужны на сервере.

Читать далее

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

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

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

Читать далее

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

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

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

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

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

Читать далее

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

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

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

Привет, Хабр! Когда-то я пять лет проработал в отделе тестирования, а последние шесть занимаюсь разработкой под 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 мин
Охват и читатели6K

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

Читать далее

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

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

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

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

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

Читать далее

Дизайн-система в Додо: почему модуль компонентов – это еще не система

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

28 стилей одной кнопки на старте – и как мы дошли до дизайн-системы, которая живет без нас: с паспортами компонентов, распределенной разработкой и генерацией кода нейронкой.

Читать далее

Разработка на Авроре под Аврору: разворачиваем Coder в облаке и пишем плагин для VS Code

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

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

Я мог бы закончить историю на этом, но идея мобильной разработки не давала мне покоя: получается, имея под рукой планшет с большим экраном, вы можете организовать полноценный рабочий процесс. Правда, инструменты для сборки, тестирования и работы с SDK обычно выпускают только для ПК. А можно ли скомпилировать код прямо на смартфоне? Можно — например, в ALT Mobile или «Авроре ОС», если установить дополнительные пакеты.

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

Как это сделать?

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

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

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

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

Читать далее

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

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

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

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

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

Читать далее

Рецензия на книгу «Асинхронный Kotlin»

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

Книга «Асинхронный Kotlin» Яны Седовой посвящена теме, которая часто вызывает проблемы у начинающих Android‑разработчиков, — корутинам и Flow. Книга строится по маршруту от простого определения к рабочему мессенджеру на Jetpack Compose, Room и Retrofit, закрывая пробелы в знаниях, которые обычно оставляют ИТ‑курсы и лекции в ВУЗах. Для студента, стажера или начинающего разработчика (джуна) это полезный русскоязычный учебник, где асинхронность на Kotlin разобрана системно и последовательно, без необходимости собирать воедино материал из самых разных статей на Хабре.

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