Обновить

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

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

RecyclerView. Оптимизация Adapter

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

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

Казалось бы, RecyclerView — давно знакомый инструмент. Но когда данные становятся разнородными, а списки — большими, простой вызов notifyDataSetChanged() превращается в узкое место, вызывающее фризы и дергающуюся анимацию. Как перейти от лобового обновления к точечным изменениям? Как объединить несколько типов элементов в одном адаптере?

В этой статье я пройду путь эволюции работы с RecyclerView.Adapter:
- Разберу, как работает система уведомлений под капотом.
- Вспомню, как DiffUtil и ListAdapter спасли нас от ручных вычислений.
- Расскажу про AsyncListDiffer, ConcatAdapter и нюансы восстановления позиции.
- И наконец, покажу, как спроектировать универсальный адаптер с поддержкой разных ViewHolder, частичным обновлением (Payloads) и ViewBinding — с полным примером кода.

Поехали!

Читать далее

«Сельский магнат»: как мы в РСХБ сделали мобильную игру

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

Привет, Хабр! Меня зовут Виталий, я занимаюсь развитием Венчурной студии РСХБ и проектами для молодых ИТ-специалистов в команде РСХБ.Цифра. В этой статье расскажу о том, как мы в банке придумали сделать полноценную мобильную игру и зачем вообще финансовой организации понадобился такой, на первый взгляд, нетипичный продукт.

Читать про игру

Приложение для изучения китайского. От идеи до прода

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

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

С чего всё начиналось

Всё началось с того, что я как-то решил начать изучать китайский язык. Всё произошло неожиданно и рандомно. Для начала я решил поизучать, какие есть приложения и источники для изучения языка. Как оказалось, каких-то нормальных особо нет, тем более русскоязычных. На данный момент существуют различные приложения по типу HelloChinese, SuperChinese - они, конечно, классные, но стоят дофига денег. Без подписки они бесполезные. Лучше уж нанять репетитора за такие деньги. А если нет денег на репетитора, то можно достать старый добрый Anki. Я всегда ненавидел Anki за его неудобство, за кривой UX/UI, за долгое создание карточек и за слабое разнообразие. Поэтому я сразу понял, что с помощью Anki изучать мне будет сложно и неприятно. Поэтому было решено создавать своё приложение: без подписок, с интервальным изучением, с большим количеством тренировок и, конечно же, по большей части с офлайн-функциональностью. Было придумано название приложения - Abuchi.

Выбор технологий

Сам я Golang-разработчик, который перешёл с Java, поэтому изначально я думал выбрать обычный Kotlin. Однако из-за ненависти к Java/Kotlin всё же решил выбрать Flutter, так как мне там больше нравится синтаксис и в целом написание кода.

Начало разработки

Базовый минимум функциональностей, которые я планировал: тренировки произношения, тренировки написания, база всех иероглифов, интервальное повторение с помощью карточек.

Для тренировки произношения я решил использовать библиотеку Vosk, так как там есть легковесная модель под Android и в целом она работала лучше, чем тот же Whisper, если оценивать по характеристикам "размер-качество".

Читать далее

Я устал от бесконечных списков чатов и написал свой приватный мессенджер на гексагональных сотах (Kotlin + Go)

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

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

Меня, честно говоря, просто утомили современные интерфейсы общения и навигации. Куда ни посмотри — в Telegram, Slack, WhatsApp, на почте — нас везде встречает один и тот же шаблон: бесконечный, давящий вертикальный список чатов. Это превращает общение в какую-то рутину, конвейер, где новые сообщения постоянно вытесняют старые, заставляя нас бесконечно скроллить экран вверх и вниз.

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

Так родился проект ПОРЯДОК или ORDO. Идея навигации в нем реализована фрактально-пространственным способом — в виде гексагональных сот (ячеек).

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

Читать далее

Сетевой слой iOS‑приложения

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

Эта статья — не ревью чужого кода и не пересказ абстрактных паттернов. Это практическое описание того, как я подхожу к проектированию сетевого слоя, какие решения считаю удачными, какие — опасными, и почему. Основа текста — реальный подход к построению сети в production iOS-приложении: с явной EndpointPolicyRequestContext, interceptor-pipeline, безопасным логированием, отдельной обработкой refresh flow, snapshot-first чтением и выделенным transport для долгих upload-сценариев.

Мой главный тезис простой: сетевой слой — это не “место, где отправляются запросы”, а инфраструктура приложенияURLRequest и URLSessionConfiguration в Foundation уже работают как объекты, которые несут не только URL, но и правила поведения запроса; Swift Concurrency даёт структурированную асинхронность и безопасную модель доступа к разделяемому состоянию через actors. На практике это значит, что retry, auth, timeout, cache, logging и metrics лучше проектировать как часть контракта, а не как случайный набор if внутри одного большого send()

Если сжать статью до одного абзаца, получится так: я начинаю не с URLSession, а с вопросов кто имеет право знать о transport, где живёт policy, кто отвечает за retry, как не утечь токенами в логах, где source of truth для UI и как выяснить, что именно сломалось в production. Всё остальное — код вокруг этих решений.

Читать далее

Я не программист, но меня так достали современные читалки на Android, что я написал свою. Встречайте — MRead

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

Всем привет! Я хочу поделиться историей о том, как обычная пользовательская боль заставила меня открыть Android Studio и сделать свой первый серьезный проект.

Я очень люблю читать с телефона (особенно ранобэ, новеллы и книги в оригинале). Но в последнее время индустрия мобильных читалок свернула куда-то не туда. Открывая популярные приложения, я чувствовал себя пилотом Боинга: десятки перегруженных меню, всплывающие баннеры, просьбы купить Premium-подписку и интерфейсы прямиком из 2012 года.

Но моей главной болью был перевод. Когда ты читаешь книгу на английском и встречаешь незнакомое слово, тебе приходится выделять его, копировать, открывать Google Переводчик, вставлять, читать, возвращаться в книгу… Погружение в историю рушится моментально.
Есть, конечно, Circle to Search или читалки с функцией перевода, но мне они показались максимально неудобными

Я искал минималистичную читалку со встроенным удобным переводчиком. Не нашел. И решил написать её сам.

Читать далее

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

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

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

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

Читать далее

Но почему, почему, почему был светофор зеленый?

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

Но почему, почему, почему
Был светофор зеленый?
А потому, потому, потому,
Что был он в жизнь влюбленный.

Читать далее

Мобильная разработка за неделю #633 (1 — 7 июня)

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

В новом дайджесте победители Apple Design Awards 2026 и эффективность использования памяти в Android 17, обертки свойств в Swift и корутины на низком уровне, PWA после блокировки в App Store, игровая реклама 2026, дообучение LLM, метрики, практики, компромиссы и многое другое. Заходите!

Читать далее

Интернет выключили целиком: офлайн-чат на Bluetooth и Wi-Fi Direct, и почему мы не обещаем mesh на весь город

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

Блокировки это одно. Их обходят: VLESS, Reality, прокси, про это уже написано много, в том числе у нас. Но есть сценарий жёстче. Интернета нет вообще. Не «YouTube не открывается», а мобильную сеть увели в ноль, Wi-Fi бесполезен, потому что аплинк перекрыт. Такое включают точечно: митинг, площадь, район, иногда целая страна на несколько часов.

Вопрос простой: могут ли два телефона в этой ситуации всё равно обменяться сообщением. Без вышек, без интернета, без сервера. Ответ: да, но честный ответ длиннее, и в нём много «но». Мы (команда из трёх человек, делаем мессенджер RCQ) собрали для этого режим, который называется Radio. Ниже что он реально умеет, чего не умеет, и какие грабли мы собрали по дороге.

Читать далее

Первый раз — в первый класс

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

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

Если вдруг вам интересен свой собственный мессенджер на своём PHP-хостинге - заходите почитать.

Раньше мы с коллегой пользовались для совместной работы над проектами (электронных разработок) таким проектом как Asana. Наблюдали ее развитие последних лет 7-8 изнутри бесплатного аккаунта. Создавали свои проекты, в них задачи, привязанные к срокам исполнения, ну - и набивали файлами-фотками в процессе разработок.

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

Тем более, что shared-хостингов уже в пользовании штук пять под мелкими проектами. Я сторонник того, что в ожидании "косяка клиентов" достаточно иметь малые shared-хостинги под каждый проектик, или даже под каждого клиента, чтобы его данные и доступность сервиса была независима от других. Ну а на VDS переходить когда уже есть нормальный коммерческий договор.
Ну, а значит, надо попробовать наваять такую систему именно в условиях shared-хостинга, с ее ограничениями.

Понимание web-технологий самое общее, конечно есть, но по моему мнению, достаточное для создания такого проекта максимум процентов на 10. Поэтому вся надежда на "эти ваши нейросети", в процессе самообучения. Ну, и при такой "кроильной" задаче главное условие поставил сам себе - что эксперимент будет полностью бесплатный, т.е. без покупки какого-либо платного доступа к ИИ-агентам.
Т.е. я решил сам себя замучить именно в режиме бесплатного чата с нейросетями, становясь копипастером кода 80-го уровня.

Почитать далее

Представляем AdaEngine 0.1.0 — игровой движок на Swift

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

Представляем AdaEngine 0.1.0

После долгого пути я рад представить AdaEngine 0.1.0: бесплатный игровой движок и фреймворк для приложений с открытым исходным кодом, написанный на Swift.

Узнать подробнее

Как я сделал сканер под iOS и Android для диагностики Wi-Fi-сети

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

Привет, я Павел Семенищев, сетевой инженер в Yandex Infrastructure. В команде Network Operations Center (NOC) мы отвечаем не только за магистральные и дата‑центровые сети, но и за офисные, а также сети складов и дарксторов Яндекс Лавки. А это ОЧЕНЬ много удалённых точек присутствия, и при проблемах с Wi‑Fi на каждую сетевика не отправишь.

Для быстрого сканирования параметров сети на местах я создал WiProber под Android и WiFi Prober под iOS — получился сетевой «комбайн» для инженера, который сначала был нашим внутренним инструментом, а теперь есть и в общем доступе. Под катом расскажу, что умеют эти приложения, и какие ограничения операционных систем удалось обойти при их создании.

Читать далее

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

Я перестал доверять стримингам. Поэтому написал свой iOS-плеер — с CarPlay и без вранья про звук

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

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

Для своей коллекции я написал плеер. Для себя. Через полгода это превратилось в нишевое приложение для iOS на 11 языках: с собственным DSP, распознаванием музыки, онлайн радио и CarPlay.

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

Читать далее

Как я избавился от тысяч строк валидации в Swift

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

Каждый раз, когда нужно добавить новую модель в проект, приходится писать буквально одинаковый код: с одинаковыми проверками, с одинаковыми корректировками, с одинаковыми Codable, с одинаковыми тестами.

Полагаю, вы тоже постоянно с этим сталкиваетесь, особенно при работе с текстом: почистить от лишних пробелов, убрать декоративные символы, привести к нужному регистру, сделать проверку на «не пусто» и так далее.

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

Читать далее

Как я создал аккаунт Apple Developer (Apple разработчика) на юридическое лицо после 1 апреля 2026 года

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

Друзья, всем привет. Это моя проба пера на Хабре. Меня зовут Максим Талалаев, я достаточно давно управляю людьми. Вот теперь занимаюсь этим в сфере IT. Делаю с командой проект по созданию и развитию платформы временной (гибкой) занятости.

Пишем на PHP. Используем Laravel и Lifewire с Filament. Базы на PostgreSQL. Приложения писали на Flutter, хотя в первое время нас здорово выручал самописный mini‑App в телеграм. В общем все, как у всех.

И вот недавно встал вопрос в загрузке приложений на известные всем площадки: GooglePlay, RuStore. На «десерт» мы оставили AppStore, так как мифов о нем ходило гораздо больше, чем о двух вышеупомянутых источниках. Я не буду подробно останавливаться на самой процедуре, по которой написано немыслимое количество статей и материалов,а сразу перейду к моментам, на которые лично у меня ушло больше всего душевных и временных терзаний, а также управленчески неэффективно потраченного времени (ну, это уже по завершении всех этапов так можно сказать. Конечно, когда я был в процессе, мне так не казалось.). Естественно, я прошел все стадии, начиная от «Создать аккаунт разработчика на организацию в России сейчас невозможно» до «А ты попробуй найти специализированное бюро, которое тебе для Apple корректно сделает перевод на иностранный язык».

Читать далее

NAT traversal в embedded P2P-мессенджере на Go: почему overlay routing, а не STUN/TURN/ICE

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

Несколько месяцев пилю embedded P2P-мессенджер на Matrix-протоколе как личный pet-проект в свободное от основной работы время. Стек: форк Dendrite (Matrix homeserver на Go), Pinecone overlay routing от matrix.org research, gomobile bind для упаковки в .aar и .xcframework, modernc.org/sqlite вместо CGO-варианта (иначе gomobile капризничает). Не туториал и не “hello world на gomobile”, а серьёзная архитектурная амбиция в свободное время. Делюсь reasoning’ами почему такие архитектурные выборы и где они начинают течь.

Без обещаний неубиваемости. Проект в активной разработке, на этапе интеграции в клиентское приложение поверх Rust SDK matrix.org. Цифры приведу с явной маркировкой “где замерено на моём стенде, где плановая оценка, что ещё не проверено”. Production-NAT-кейсы (CGNAT, реальные мобильные сети) - впереди в следующем рывке. Если что-то принципиально новое всплывёт - напишу продолжение.

Читать далее

Как оптимизировать картинки в Android и не сломать UX: метрики, практики и компромиссы

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

Если экран с картинками начинает тормозить, проблема редко сводится к одному AsyncImage. Разбираю, что действительно стоит измерять, как использовать preview и prefetch, зачем делить устройства на tier и почему одинаковое поведение на всех девайсах почти всегда ошибка.

Читать далее

Как мы выбирали стек для PWA после блокировки в App Store: от Swift к React за считанные месяцы

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

Привет, Хабр! Меня зовут Константин Шкурко, я ведущий разработчик мобильных приложений в РСХБ. Сегодня хочу рассказать историю о том, как всем известные обстоятельства заставили нас в сжатые сроки искать альтернат­ивные пути доставки нашего инвестиционного приложения «Свои инвестиции» пользователям iOS - и как это изменило наш технологический стек.

Когда Apple заблокировала российские банковские приложения в App Store, перед нами встала непростая задача. У нас были десятки тысяч активных пользователей на iOS, которые пользовались брокерским приложением для управления своими инвестициями. Торговля акциями, облигациями, аналитика портфеля, выставление заявок - всё это внезапно стало недоступно для значительной части клиентской базы.

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

Читать далее

Корутины и то как они работают на низком уровне

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

Всем привет! Меня зовут Иван, я Android разработчик и сегодня я хочу поговорить с вами об такой вещи как Coroutines в языке Kotlin

Не знаю как у вас, а я всегда интересовался как устроены те или иные вещи на низком уровне, поэтому когда я начал активно заниматься Android разработкой и познакомился с Kotlin одним из главных вопросов который не уходил у меня из головы, как устроены Coroutines на низком уровне?

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

Читать далее