AppFiles - Mobile Development
описание
Библиотеки, обучающие статьи, курсы и видео для (мобильных) разработчиков. Если есть вопросы - пишите @lbogolubov.
Лучшие посты
за три месяцабез подписи
Наше Android-приложение написано на Swift Уже не вызывают удивление iOS-приложения, написанные на Kotlin или даже Kotlin/Compose. А вот Polymarket, крупнейший сервис пари и предсказаний в мире, сделал свое Android-приложение с использованием Swift. Внутри приложения работает почти 170 000 строк промышленного Swift-кода: модели, сетевой слой, бизнес-логика и более 120 моделей представления. Тот же самый код используется в приложении для iOS. Одна кодовая база — два приложения. Как они это сделали, что сломалось по дороге и почему разработчики повторили бы этот путь снова - в статье. Статья: https://apptractor.ru/info/articles/nashe-android-prilozhenie-napisano-na-swift.html Платформа: кроссплатформа 👨🦯➡️ AppFiles: код, инструменты, практики, производительность
Tidy - управление задачами Приложение для управления задачами со всеми необходимыми функциями. Фичи: • Повторяющиеся задачи — Создавайте задачи, которые повторяются ежедневно, еженедельно или ежемесячно. • Вложенные подзадачи — Организуйте работу с помощью глубоко вложенных подзадач, без ограничений по глубине. • Поиск — Быстро находите любую задачу с помощью встроенного поиска. • Резервное копирование — Автоматическое и ручное резервное копирование; экспорт данных в файл JSON. Tidy на GitHub: https://github.com/Gauravkr7488/Tidy Платформа: Android ⭐️: 15 👨🦯➡️ AppFiles: код, инструменты, практики, производительность
Обработка исключений в Kotlin Coroutines Пытаюсь лучше понять работу Kotlin Coroutines. Беру небольшую тему про Kotlin Coroutines и пытаюсь разобраться и написать шпаргалку (максимально кратко и лаконично). Сегодня про обработку ошибок. Статья: https://habr.com/ru/articles/1070060/ Платформа: Android 👨🦯➡️ AppFiles: код, инструменты, практики, производительность
Спустя 3 года и 200 миллионов строк я наконец-то перестал использовать UUID в качестве ключа Дело было не в этом. Тот же запрос, та же таблица, тот же код, который мы выпустили три года назад, — только теперь он незаметно перестал работать быстро. Я открыл план выполнения запроса, ожидая увидеть случайную аномалию, но вместо этого получил стену цифр, от которых любой бэкенд разработчик мгновенно замирает. Статья: https://apptractor.ru/info/articles/spustya-3-goda-i-200-millionov-strok-ya-nakonets-to-perestal-ispolzovat-uuid-v-kachestve-klyucha.html Платформа: база данных 👨🦯➡️ AppFiles: код, инструменты, практики, производительность
Xcode 27, похоже, меняет правила игры Проведя с этой бета-версией достаточно времени, могу без преувеличения сказать: Xcode 27 выглядит как самое продуманное обновление инструмента за последние годы. Оно не просто добавляет новые функции. Оно пересматривает базовые предположения о том, как разработчики действительно работают, и перестраивает среду вокруг более удачных решений. Это всё ещё бета-версия, поэтому до финального выпуска многое может измениться. Но уже сейчас всё выглядит на удивление цельно и определённо заслуживает обсуждения. Вот что особенно привлекло моё внимание. Статья: https://apptractor.ru/info/articles/xcode-27-pohozhe-menyaet-pravila-igry.html Платформа: iOS 👨🦯➡️ AppFiles: код, инструменты, практики, производительность
Debroid - автономный отладчик Android-приложений для ИИ-агентов Debroid (DEBug + AnDROID) — это headless CLI, работающий по протоколу Java Debug Wire (JDWP), позволяющий агентам ИИ — Claude Code, Grok Build, Codex, OpenCode, Cursor, Antigravity или любому другому приложению с терминалом — отлаживать работающее Android-приложение так же, как это делал бы человек в Android Studio: устанавливать точки останова, перехватывать исключения, пошагово выполнять код, проверять и изменять переменные, отслеживать поля — всё без графического интерфейса и в строгом, машиночитаемом формате JSON. Традиционные среды разработки Android очень визуальны. Хотя помощники ИИ могут писать код, они фактически «слепы», когда дело доходит до отладки, поскольку они не могут щелкать мышью по интерфейсу Android Studio, чтобы проверить память или приостановить выполнение. Debroid устраняет этот пробел. Он действует как слой преобразования между чистым терминалом (который агенты ИИ отлично используют) и виртуальной машиной Android. Предоставляя интерфейс командной строки, который выводит детерминированный JSON, агент ИИ может автономно предположить наличие ошибки, запустить приложение, определить точную строку кода, считать текущее состояние устройства и оценить возможность исправления — предоставляя агентам тот же глубокий анализ ситуации во время выполнения, который ранее был доступен только разработчикам-людям. Debroid на GitHub: https://github.com/PatilShreyas/debroid Платформа: Android ⭐️: 70 👨🦯➡️ AppFiles: код, инструменты, практики, производительность
От object detection к классическому CV: разрабатываем сканер для слабых смартфонов Хочу рассказать об одной из самых сложных наших разработок — динамического визуального кода, который должен считываться камерой обычного смартфона в реальном времени. Внутри продукта эта технология называется MotionCode. Внешне всё выглядит довольно просто: панель воспроизводит последовательность визуальных элементов, камера телефона считывает их, а приложение восстанавливает код. На практике путь от первого прототипа до стабильной работы оказался гораздо сложнее. Мы успели обучить модель для object detection, столкнуться с ограничениями мобильного железа, отказаться от нейросети и почти без опыта в компьютерном зрении построить собственный real-time-пайплайн обработки кадров. Статья: https://habr.com/ru/articles/1067188/ Платформа: разработка 👨🦯➡️ AppFiles: код, инструменты, практики, производительность
Наконец-то я нашел применение для .fixedSize Если бы неделю назад мне сказали, что .fixedSize спасёт мне вторую половину рабочего дня, я бы рассмеялся. Уже одно название словно предупреждает: этот модификатор загонит вас в угол. Кому вообще нужны представления, зафиксированные в статическом размере? Поэтому, как и многие разработчики на SwiftUI, я мысленно отправил его в категорию «модификаторы, которыми я никогда не воспользуюсь». А затем мне досталась задача по компоновке, которую — вот неожиданность — можно было аккуратно решить только с помощью .fixedSize. И она преподала мне урок, который стоило усвоить много лет назад: плохих API не существует — бывают лишь интерфейсы, для которых вы ещё не нашли подходящий сценарий. Каждый модификатор SwiftUI появился по определённой причине. Принципиально избегая какого-то из них, вы без всякой пользы сокращаете собственный набор инструментов. Статья: https://apptractor.ru/info/articles/nakonets-to-ya-nashel-primenenie-dlya-fixedsize.html Платформа: iOS 👨🦯➡️ AppFiles: код, инструменты, практики, производительность
9 лет Android-разработки, 3 месяца без работы - как выбраться из тупика? Разработчик с более чем девятилетним опытом Android-разработки пожаловался на Reddit, что уже три месяца не может найти новую работу и начинает сомневаться, хочет ли вообще оставаться в мобильной разработке. Обсуждение быстро превратилось в довольно показательный срез состояния рынка Android-разработчиков в 2026 году: в комментариях появились специалисты с 5, 9, 12 и даже 14 годами опыта, которые месяцами не могут найти работу, почти не получают интервью или начинают переучиваться на backend, web и AI. • Что случилось с автором • «Ты не разучился программировать, ты просто заржавел» • Android-вакансий действительно стало меньше • Возможно, проблема не только в Android • Android слишком узкая специализация? • Куда уходят Android-разработчики • AI не обязательно конкурент Android — он может стать его продолжением • Появилась проблема «гиперспециализированных» вакансий • Senior-интервью тоже вызывают раздражение • Flutter тоже не выглядит очевидным спасением • «Всё уже написано» • Три месяца теперь воспринимаются почти как нормальный срок • Что в итоге советует сообщество Статья: https://apptractor.ru/info/articles/9-let-android-razrabotki-3-mesyatsa-bez-raboty-kak-vybratsya-iz-tupika.html Платформа: Android/карьера 👨🦯➡️ AppFiles: код, инструменты, практики, производительность
Погружение в One‑Time Events в Android Представьте, перед вами задача — после авторизации пользователя навигировать его на главный экран, или показать snackbar, например, об ошибке. В Android для таких событий есть специальное название — One‑Time Events, или же просто Effects — события, которые мы отправляем UI из ViewModel и хотим, чтобы они обработались ровно один раз. И они отличаются от состояния экрана! Состояние существует всегда, а effect отправляется и обрабатывается единожды; в состоянии существуют данные, с которыми user взаимодействует, или которые повторно могут отображаться на экране, когда как effect — совершенно противоположное. Моделировать такой паттерн можно несколькими способами: через состояние, SharedFlow или Channel. В этой статье мы разберем на простом примере каждый подход и обсудим минусы и плюсы, а также обсудим лучшее обходное решение! Статья: https://habr.com/ru/articles/1067070/ Платформа: Android 👨🦯➡️ AppFiles: код, инструменты, практики, производительность
Picture-in-Picture в iOS: от запуска до переключения контента С системной функцией Picture-in-Picture (PiP) сталкивались, пожалуй, все владельцы iPhone: кто-то смотрит видео на фоне переписки, кто-то общается по видеосвязи в любимых мессенджерах. Для пользователя это просто удобство, а для разработчика видеосервиса - отдельный механизм со своей инфраструктурой, жизненным циклом и набором ограничений. В этой статье я разберу интеграцию PiP как встроенного плеера: от первого запуска до переключения контента. Поделюсь нюансами, с которыми вы точно столкнётесь на практике, и покажу, как обойти типовые грабли Статья: https://habr.com/ru/companies/ivi/articles/1065430/ Платформа: iOS 👨🦯➡️ AppFiles: код, инструменты, практики, производительность
📺 Видео и подкасты за неделю • (iOS En) Apple Photos App Tab Bar Using SwiftUI • (iOS En) What's New in Xcode 27 • (iOS En) Stacked Glass Toasts Using SwiftUI • (iOS En) Balancing High and Low-Level Programming in Swift • (And En) What AI Gets Wrong About Android... • (And En) If you don't type code yourself, you're falling behind. • (And En) The place where leaking abstraction, data races and security vulnerabilities all meet • (And En) What’s New in Kotlin 2.4 • (And En) Kotlin Performance Tracing on Android: From Coroutines to Reality • (And En) Flow with Exposed: Life Finds a Way • (And En) Koin + Kotlin Compiler = ♥️ • (And En) 5 Experimental Kotlin Features You Don't Want to Miss • (And En) Multiple ViewModel Architecture in Jetpack Compose • (Crs En) Kotlin/Wasm: Finally, the missing piece for a full stack Kotlin webapp! • (Dev Ru) Заказываем кофе с помощью AI • (Dev Ru) От вайбкодера к контекст-инженеру • (Dev Ru) Вся магия Laravel — PHP, архитектура и highload • (Dev En) Python for Engineers & Robotics – Master NumPy, Pandas, and ChatGPT Automation Прошлогодние видео: • (iOS Ru) Расширяем iOS-разработку с помощью AI • (And Ru) ByteWeaver. Инструментирование байт-кода во имя великого блага • (Crs Ru) Разработка на iOS и KMP, и жизнь на полной скорости • (Crs Ru) Почему вам не нужен Kotlin Multiplatform • (Crs Ru) Создание indoor-карты здания во Flutter • (Dev Ru) 30 вопросов команде и себе — техника и практика формулировка хороших вопросов 👨🦯➡️ AppFiles: код, инструменты, практики, производительность
📺 Видео и подкасты за неделю • (iOS En) Complex UI: Apple Sports App's Timeline Slider Interaction Using SwiftUI • (iOS En) SwiftUI Image Caching Explained - Faster Lists & Better Performance • (iOS En) iOS 27 Siri Bubble Effect Using SwiftUI • (And Ru) 7 стадий AI в разработке: от скептика к архитектору • (And En) Android AI Tools: Vibe coding, sub-agents, and the Android CLI • (And En) The 8 Golden Rules of Writing Clean Functions - Clean Code In Kotlin • (And En) Crafting Delightful Experiences • (And En) Increasing Quality of AI Generated Kotlin Code • (And En) How Kotlin Powers Functional Design: MCP Edition • (And En) Securing Gradle Builds Full Course • (Crs En) Can Kotlin Swift Interop Ever Be Perfect? • (Crs En) Livecoding Soundscapes with Compose Multiplatform • (Crs En) Hot-Reloading Kotlin/Native • (Crs En) Compose beyond UI : Display and Print! • (Dev Ru) UX-ресерч в эпоху AI — AI в исследованиях, ResearchOps, Muse Group • (Dev En) Introducing Gemini Robotics 2 • (Mrk En) Все видео Google Playtime EMEA 2025 Прошлогодние видео: • (iOS Ru) Код, который не тормозит: секреты производительности на iOS • (And Ru) Combine с нуля — реактивщина это просто • (Dev Ru) Тулкиты кодогенерации Android vs iOS 👨🦯➡️ AppFiles: код, инструменты, практики, производительность
Showcase Layout Compose - подсветка UI Showcase Layout Compose создает красивые анимированные эффекты подсветки для ваших интерфейсов. С поддержкой нескольких платформ и двумя различными вариантами для демонстрации: • ShowcaseLayout: Классическое полноэкранное наложение с вырезами • TargetShowcaseLayout: Современная целевая подсветка с настраиваемыми формами Showcase Layout Compose на GitHub: https://github.com/tahaak67/ShowcaseLayoutCompose Платформа: Android/кроссплатформа ⭐️: 124 👨🦯➡️ AppFiles: код, инструменты, практики, производительность
Diligence - экраны "О приложении" на SwiftUI Diligence — это легковесный пакет Swift, содержащий набор UI-элементов для создания About экранов приложений для iOS и macOS. Diligence на GitHub: https://github.com/inseven/diligence Платформа: iOS ⭐️: 21 👨🦯➡️ AppFiles: код, инструменты, практики, производительность
Шпаргалка: Structured Concurrency и отмена корутин Что будет, если запустить тяжелую фоновую обработку данных, а пользователь закроет экран? Если мы не контролируем этот процесс, потоки продолжат работу, сжигая батарею, процессорное время и создавая утечки памяти. Для решения этой проблемы в Kotlin Coroutines применяется концепция Structured Concurrency. Статья: https://habr.com/ru/articles/1068314/ Платформа: Android 👨🦯➡️ AppFiles: код, инструменты, практики, производительность
Wurstfinger - клавиатура для людей с толстыми пальцами Wurstfinger — это клавиатура для iOS, вдохновленная MessagEase и написанная на SwiftUI. Она переносит удобные для большого пальца жесты из Thumb-Key и оригинальной раскладки MessagEase на устройства Apple, включая круговые жесты для заглавных букв, жесты возврата для знаков препинания и правила создания символов с диакритическими знаками. Традиционные клавиатуры QWERTY занимают лишнее место на экране и требуют точного нажатия. Wurstfinger использует сетку 3х3 со свайпами, поэтому ваши большие пальцы меньше перемещаются и чаще нажимают на нужные клавиши — даже на маленьких экранах. После того, как вы освоите эту клавиатуру (несколько дней практики), вы будете печатать быстрее и с меньшим количеством ошибок. Wurstfinger на GitHub: https://github.com/cl445/wurstfinger Платформа: iOS ⭐️: 25 👨🦯➡️ AppFiles: код, инструменты, практики, производительность
Пет-проекты джунов (Android) На собеседовании часто хотят видеть свой личный пет-проект. Проект, в котором человек самостоятельно придумал идею, организовал код, спроектировал архитектуру и наступил на свои собственные грабли. Ведь именно самостоятельная разработка — от локальной базы данных до UI — дает самый мощный буст в навыках (особенно, когда одно и то же приложение переписал 3 раза =)). Поэтому у автора этой статьи появилось желание помочь начинающим разработчикам. Он собрал идеи для пет-проектов, которые личня бы оценил =), а также подобрал актуальные инструменты и бесплатные API для их реализации. Статья: https://habr.com/ru/articles/1068942/ Платформа: Android 👨🦯➡️ AppFiles: код, инструменты, практики, производительность
Поддержка нескольких версий iOS в SwiftUI без превращения ваших представлений в хаос Одно из главных достоинств SwiftUI — это скорость его развития. На каждой конференции WWDC представляются новые API, новые модификаторы и небольшие улучшения, повышающие удобство использования, благодаря которым код пользовательского интерфейса становится чище и выразительнее. Естественно, вам хочется начать их использовать. А потом компилятор напоминает вам, что ваше приложение по-прежнему поддерживает старые версии iOS. 'sectionIndexLabel' is only available in iOS 26.0 or newer На первый взгляд, это не кажется большой проблемой. Swift поддерживает проверки доступности уже много лет, поэтому обертывание нового кода в директиву if #available кажется очевидным решением. К сожалению, SwiftUI не всегда так прост. Большинство представлений построены как длинные цепочки модификаторов, и вы не можете просто добавить проверку доступности в середину одного из них. Дублирование всего представления для разных версий iOS работает, но быстро становится сложным в поддержке по мере роста вашего UI. Вместо этого цель должна заключаться в изоляции логики совместимости, сохраняя при этом само представление практически идентичным. В этой статье мы рассмотрим несколько методов, которые значительно упрощают поддержку нескольких версий iOS без ущерба для читаемости. Статья: https://apptractor.ru/info/articles/podderzhka-neskolkih-versiy-ios-v-swiftui-bez-prevrascheniya-vashih-predstavleniy-v-haos.html Платформа: iOS 👨🦯➡️ AppFiles: код, инструменты, практики, производительность