Обновить

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

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

Telegram в IntelliJ: как устроен IDEGram и что он умеет

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

Плагин для JetBrains-IDE, который встраивает полноценный Telegram прямо в редактор. Плюс шифрованный шеринг кода, подсветка синтаксиса в теме получателя и магия с метаданными в обычном тексте сообщения. Разбираю изнутри.

Читать далее

Как избежать утечек памяти во Flutter

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

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

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

Читать далее

Как собрать пайплайн с LLM агентом который фиксит нативные Android UI автотесты

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

Что будем делать или что может быть интересного в статье:

- Пайплайн из двух независимых LLM агентов

- Запуск и анализ ошибки UI автотеста (Root Cause Analysis)

- Фикс автотеста в цикле с его запуском.

- Кастомизация MCP инструментов чтобы оптимизировать контекстное окно.

- Система приоритетов в работе LLM агентов.

Читать далее

Mission Impossible: как добиться 0 рекомпозиций в сложном кастомном UI

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

Сотня рекомпозиций в секунду при скролле — это приговор. Приговор батарее устройства, плавности анимаций и вашей репутации как инженера. Мы привыкли мыслить высокоуровневыми абстракциями: закинуть LazyColumn, добавить пару Modifier.padding и отправить в продакшен. Но что делать, когда стандартные компоненты начинают "захлебываться", а Layout Inspector горит красным от избыточных отрисовок?

Читать далее

Swagger-генерация на Android. Часть 1. Каких проблем нам подкинул бекенд и Android проект

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

Если ваше мобильное приложение общается с бэкендом, значит, скорее всего, живёт по контракту в виде OpenAPI-схемы. Смотреть на неё удобнее всего в Swagger, а все изменения в API можно отслеживать вручную.

Если проект начнёт расти, а ручная проверка станет дорогой и будет ломаться, на помощь придёт автогенерация из OpenAPI. Но в многомодульном Android-приложении точно всплывут нюансы: где хранить код, как не тянуть лишнее, как вписать сгенерённый код в архитектуру?

Привет! Меня зовут Дима Максимов, я Android-разработчик в Дринкит. Этой статьёй я открываю цикл, в котором мы разберёмся, как настроить генерацию из Swagger в Kotlin-код и как обуздать автогенерацию в условиях многомодульного проекта.

Читать далее

Первый реальный технический бенчмарк ИИ или ищем самый быстрый XML парсер для Apple платформы

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

Нет, это не déjà vu, это продолжение моей прошлой статьи Самый быстрый XML парсер для iOS в 2026 году? Чтобы вам не тратить время на ее чтение, вот краткий пересказ. В прошлой статье происходит поиск самого быстрого XML парсера со следующими характиристиками:

Для Apple платформы (iOS, tvOS, macOS)

Язык Objective-C или Swift

GitHub как источник исходников

Популярный (хотя бы больше 500 звезд)

Любая интеграция (CocoaPods, SwiftPM)

И самое важное, весь бенчмарк я писал сам с небольшой помощью ИИ, не спеша, под несколько чашечек кофе за 3 часа я нашел нужный мне XML парсер.

Спустя пару месяцев после выхода первой статьи, мне пришла мысль, зачем я тратил 3 часа на эту задачу, если можно было просто это самое задание “скормить” ИИшке и она бы за 5 минут решила бы ее (так пишут в интернетах). Тут же пришла вторая идея. Так как у меня есть мною лично проверенный результат, то я могу загрузить этой задачей все популярные ИИ и их результаты сравнить со своим. Даже не исключаю, что у меня где-то есть ошибка и тогда рейтинг парсеров будет выглядеть совсем иначе и я выбрал не самый быстрый как хотел.

Собственно, что я и сделал. Загнал задачу в топ 15 ИИ и сравнил их результаты со своим. Если вам интересно, кто справился с задачей, кто спасовал, будет описано в развернутой статье под катом.

Для затравки, наихудший результат и последнее место занимает GPT 5.5 Pro. А Claude Opus 4.7 не смог взять первое место.

Читать далее

Создавая SetupWizard для кастомной AOSP: на что обратить внимание

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

Что скрыто за реализацией Setup Wizard на любом Android-устройстве? Как получается, что системное приложение появляется один раз при первом запуске, а потом исчезает? Можно ли сразу накатить свой Setup Wizard на устройство и точно ли нужно писать свою реализацию этапа настройки блокировки экрана? 

Меня зовут Олеся Шилова. Я инженер-программист в отделе разработки приложений в YADRO. Вместе с коллегами разрабатываю системные приложения операционной системы kvadraOS. Недавно я работала над «Мастером настройки» и сегодня хочу рассказать, как это приложение работает в AOSP и с какими подводными камнями можно столкнуться при его создании. Заодно покажу примеры конфигурации. 

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

Читать далее

Live Activities: как мы сделали обновление без разрешения пользователя

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

Привет! Меня зовут Сергей, я тимлид iOS-команды в Банки.ру. В разработке уже 11 лет — успел поработать и на аутсорсе, и в продуктовых финтех-компаниях.

Если вы iOS-разработчик и планируете внедрять Live Activities в своё приложение — эта статья для вас. Особенно если обновления LA у вас триггерятся на бэкенде, а не в коде приложения. Мы наступили на несколько граблей, нашли неочевидное решение и хотим сохранить вам пару недель отладки.

Читать далее

Foundation Models в iOS 26: разбор фреймворка для on-device LLM

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

Foundation Models в iOS 26: разбор фреймворка для on-device LLM

На WWDC 2025 Apple показала одну из самых недооценённых вещей презентации — Foundation Models Framework. Теперь iOS-разработчики получили доступ к системной языковой модели Apple буквально в несколько строк Swift-кода.

Без OpenAI API. Без интернета. Без отправки данных в облако.

Читать далее

Первый день рождения CoMaps

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

12 мая проект CoMaps отметил свой первый день рождения - прошёл один год с момента официального анонса. В этой статье - длинный рассказ о том, как развивалось сообщество проекта, как изменилось приложение CoMaps, каково состояние интеграции с экосистемой OpenStreetMap, и несколько слов о будущем проекта.

Читать далее

Outbox‑паттерн для мобильного мессенджера: как Telegram не теряет сообщения и почему ваш код их теряет

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

Это седьмая статья про инженерные решения в ONEMIX. Тема узкая, но болезненная для каждого кто делал мобильное приложение с отправкой сообщений или файлов.

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

В Telegram он увидит свой видео‑бабл с прогрессбаром, как и оставил. В большинстве самописных мессенджеров он увидит пустой чат без своего сообщения, потому что upload жил в state экрана, а экран размонтировался. XHR продолжал работать в фоне, файл загрузился на сервер, но результат пришёл в null, потому что setter уже не существует. Сообщение фактически отправлено, но пользователь об этом не знает.

Это боль которая лечится не «правильным useState», а отдельным архитектурным слоем. Этот слой называется outbox. В этой статье разберу свою реализацию из ONEMIX, это 820 строк TypeScript которые делают то что в Telegram кажется естественным.

Читать далее

Как я сделал на Flutter игру для разработчиков. Часть 2

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

Всем привет! Меня зовут Амир Утеуов, я ML-инженер из Авито.

В первой части статьи я поделился тем, что пришлось сделать и учесть для создания собственной игры для разработчиков — DevRush. Суть игры заключается в том, что нужно на время находить иконки языков программирования. Я прошёл путь от создания геймплея и векторной анимации до сборки под Android и iOS. Главная неожиданность ждала в App Store — модераторы отклонили игру из-за иконки Android, посчитав это рекламой конкурента. Но по итогу Авито взял мою игру на стенд Code Fest 2025.

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

Читать далее

Рецензия на книгу «Разработка программного обеспечения. Практическое руководство для новичков в ИТ-команде»

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

Книга Андрея Литвинчука «Разработка программного обеспечения. Практическое руководство для новичков в ИТ-команде» (БХВ-Петербург, 2026) — структурированный и полезный разговор о том, с чем реально сталкивается новый сотрудник, выходя на первую работу в российскую ИТ-компанию. Автор показывает как устроен рынок, кто есть кто в команде, как вести себя на стендапе, как работать с требованиями, как использовать ИИ-инструменты и строить карьеру. Студентам, стажерам и начинающим ИТ-специалистам эта книга стопроцентно поможет не потеряться в первые месяцы работы на реальном проекте.

Читать далее

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

Опенсорсим yx_navigation — декларативную навигацию для Flutter

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

Навигация во Flutter — это постоянные компромиссы. Сначала кажется всё просто: push и pop. А потом проект растёт, появляются табы, вложенные модули, диплинки — и выясняется, что каждый следующий экран открывается по‑разному, а pop() в одном месте ведёт себя не так, как в другом. 

Navigator 1.0 прост и понятен, но при масштабировании рассыпается. Navigator 2.0 даёт полный контроль, но требует столько бойлерплейта, что проще изобрести свой фреймворк. Сообщество это поняло — и появились пакеты поверх Navigator 2.0. go_router упрощает жизнь, но недавно перешёл в режим поддержки: только баг‑фиксы, никаких новых фич. auto_route даёт type‑safety, но тянет за собой кодогенерацию.

Мы прошли через все эти варианты в процессе разработки Яндекс Про — приложения для водителей и курьеров, где навигация включает сотни фич, несколько команд, вложенные модули, табы, диплинки и legacy‑код на Navigator 1.0. А ещё — сложную логику переходов, где точный контроль над состоянием навигации не просто желателен, а критичен: экран закрывается там, где не должен, стек оказывается в неожиданном состоянии, и разобраться в причинах через стандартный API почти невозможно.

Так появился yx_navigation — новый пакет в нашей экосистеме архитектурных решений для Flutter, после yx_scope (DI) и yx_state (управление состоянием). Дальше расскажу, с какими трудностями мы столкнулись, какие требования сформулировали, как устроен yx_navigation сегодня и как именно он решает проблемы крупных приложений.

Читать далее

Я хотел adjustResize. Получил adjustNothing. Три раунда войны с Android-клавиатурой в WebView

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

Я юрист. Я не должен был знать слово adjustResize. Сейчас оно мне снится. Это история про три недели борьбы с Android-клавиатурой в WebView, про MutationObserver, который я призвал и пожалел, и про то, как настоящее решение оказалось не там, где я искал. Если у вас в приложении WebView и формы с инпутами — возможно, я сэкономлю вам неделю.

Три недели войны с клавиатурой

Как я сделал на Flutter игру для разработчиков. Часть 1

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

Всем привет! Меня зовут Амир Утеуов — я ML-инженер из Авито.

В этой статье поделюсь своей историей создания мобильной игры DevRush, пет-проекта, который перерос в игру на стенде IT-конференции CodeFest 2025.

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

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


Читать далее

По другую сторону найма: что я понял, когда сам начал смотреть отклики

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

Я недавно оказался по другую сторону HeadHunter.

Раньше я сам искал работу, отправлял отклики, писал сопроводительные письма и пытался понять, что вообще видит работодатель. А сейчас я открыл вакансию iOS-разработчика в своей компании и могу рассказать, как отклики кандидатов выглядят с другой стороны.

Компания у нас новая, развивающаяся, команда небольшая, поэтому я как технический директор и руководитель предприятия сам смотрю все резюме и отклики. И вот тут появился интересный опыт: ты начинаешь видеть не теоретические советы из интернета, а то, что реально работает или не работает на практике.

Читать далее

Widlet — pet-проект про Server-Driven UI на Dart

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

Привет, Хабр. Меня зовут Карим, я Flutter разработчик уже 7 лет и последний месяц я делаю фреймворк для server-driven UI на Dart.

Зачем еще один SDUI

У всех реализаций, которые попадались мне на глаза, есть общая черта - собственный DSL. JSON-схемы, кастомные конфиги. Для каждого решения приходится учить новый язык.

При этом Flutter-разработчики уже знают хороший язык описания UI. Он называется Flutter.

Читать далее

Как я сделал групповые звонки в React Native мессенджере: WebRTC, CallKit и грабли production'а

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

Это третья статья из серии про инженерные решения в ONEMIX — моём мессенджере на React Native. В первой я разбирал трёхуровневый кэш сообщений, во второй — реализацию Double Ratchet E2E. Сегодня — про звонки.

Звонки в мессенджере — это та функция, которая работает либо отлично, либо никак. Пользователь привык что WhatsApp/Telegram звонят мгновенно, показывают входящие на заблокированном экране, переживают переключения Wi-Fi/LTE, и работают из фона. Если твоя реализация делает хоть что-то из этого хуже — пользователь это сразу заметит и переключится на "нормальный" мессенджер.

Я потратил несколько месяцев на то чтобы довести звонки в ONEMIX до production-уровня. В процессе пришлось изучить WebRTC изнутри, разобраться с iOS CallKit и VoIP push notifications, и собрать десяток граблей которые в туториалах не упоминают. В этой статье — как это устроено, какие решения оказались критичными, и что бы я сделал по-другому.

Сразу оговорка. Я не использую готовые SDK типа Agora, Twilio, 100ms. У них отличное качество и поддержка, но они не дают полного контроля над процессом — а для мессенджера контроль критичен. Когда звонок не проходит, пользователь винит приложение, а не "SDK от третьей стороны". Плюс готовые SDK стоят денег, которые на раннем этапе продукта лучше направить в другие места.

Читать далее

Я реализовал Double Ratchet в React Native мессенджере. Разбор протокола и кода

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

В прошлой статье про трёхуровневый кэш сообщений я уже упоминал, что делаю мессенджер ONEMIX на React Native. Базовое E2E у меня было простое: ECDH P-256 для обмена ключами при первом контакте, AES‑GCM для шифрования каждого сообщения общим секретом. Это работает, но имеет одну проблему: общий секрет один на всю переписку. Если у одной из сторон скомпрометируют приватный ключ — все сообщения за всё время превращаются в открытый текст.

Это называется отсутствием Perfect Forward Secrecy (PFS). И это значит, что человек, к которому в руки попадёт твой телефон через год, может прочитать переписку из прошлого года. WhatsApp, Signal, и серьёзные части Telegram давно используют другую схему — Double Ratchet — которая ключи переизбретает заново на каждом сообщении. Так делают потому, что любой ключ компрометируется в один момент времени, и компрометация не должна давать доступа ни к прошлому, ни к будущему.

Я реализовал Double Ratchet с нуля для ONEMIX. В этой статье разберу:

Читать далее