AppFiles - Mobile Development
Ir al canal en Telegram
Библиотеки, обучающие статьи, курсы и видео для (мобильных) разработчиков. Если есть вопросы - пишите @lbogolubov.
Mostrar más2 173
Suscriptores
-224 horas
+17 días
-830 días
Archivo de publicaciones
Один код для многих платформ - вот что вам никто не расскажет о KMP
Привет, Kotlin-разработчики. Скажу честно. Когда я начал разрабатывать своё приложение для разделения расходов на Kotlin Multiplatform, я подумал: «Напиши один раз, запускай везде. Что может быть сложного?»
Оказалось, может быть очень сложно. Но и невероятно полезно.
Это не очередной туториал «как начать работу с KMP». Таких и без того полно. Это скорее статья, которую я сам хотел бы прочитать до начала работы: реальные проблемы, реальные ошибки и реальные решения. Всё основано на моём опыте создания ExpenseSplitter KMP — полноценного приложения для совместного учёта расходов, которое работает на Android, Desktop и Web из одной общей кодовой базы.
Вот как всё было на самом деле.
Статья: https://apptractor.ru/info/articles/odin-kod-dlya-mnogih-platform-vot-chto-vam-nikto-ne-rasskazhet-o-kmp.html
Платформа: кроссплатформа
👨🦯➡️ AppFiles: код, инструменты, практики, производительность
Android CameraX: детекция лица в реалтайме для биометрии
Представим ситуацию: клиент хочет перевести большую сумму, используя мобильное приложение. Внутренние системы видят подозрительную активность и запрашивают проверку по селфи, человек наводит камеру на лицо — получает отказ. А все из-за того, что на бэкенде была получена размытая фотография потолка с кусочком лица пользователя, по которому никак не понять, действительно ли это владелец счета хочет провести операцию. Клиент звонит в поддержку, злится. Банк теряет доверие. Именно такие сценарии заставили нас серьезно заняться качеством записываемого фото.
Статья: https://habr.com/ru/companies/tbank/articles/900136/
Платформа: Android
👨🦯➡️ AppFiles: код, инструменты, практики, производительность
Kadr - декларативное создание видео для платформ Apple
SwiftUI для видео. Компонуйте, трансформируйте и экспортируйте видео на Swift — так, как действительно хочется писать код. Kadr - cовременная декларативная библиотека на Swift для создания видеокомпозиций на платформах Apple. Видео собираются с помощью DSL на основе result builder, а асинхронная работа построена на
async/await.
Поддерживаются многодорожечные временные шкалы, переходы, наложения, фильтры с анимацией по ключевым кадрам, собственные покадровые композиторы, привязанный ко времени звук с плавными перекрёстными переходами — всё это поверх AVFoundation и без сторонних зависимостей.
Kadr на GitHub: https://github.com/SteliyanH/kadr
Платформа: iOS
⭐️: 48
👨🦯➡️ AppFiles: код, инструменты, практики, производительностьНадежное выполнение фоновых задач в iOS: часть 1
Можно подумать, что если у вас в кармане лежит суперкомпьютер, то он уж точно должен уметь надёжно выполнять разные рутинные задачи в фоне, пока вы занимаетесь своими делами. Примерно так же, как
cron в Unix-системах делает это ещё с 1970-х.
В первой статье этой серии из трёх частей я расскажу о начале своего пути с BGTaskScheduler — фреймворком Apple для запуска фоновых задач на iOS. А также о том, как методом проб, ошибок и наблюдений мне удалось добиться достаточно хорошей надёжности в моём приложении Calendar Copilot, которое я использую для синхронизации событий между календарями.
Сразу раскрою итог: BGTaskScheduler не настолько надёжен, как cron, но добиться достаточно стабильного расписания можно. Правда, есть важная оговорка — вам или вашим пользователям придётся открывать приложение хотя бы раз в неделю или две. Если этого не делать, iOS со временем начинает реже запускать фоновые задачи, а затем вообще прекращает это делать ради экономии батареи.
Статья: https://apptractor.ru/info/articles/nadezhnoe-vypolnenie-fonovyh-zadach-v-ios-chast-1.html
Платформа: iOS
👨🦯➡️ AppFiles: код, инструменты, практики, производительностьШпаргалка: Kotlin Coroutines Channels и Actor‑модель
Пытаюсь лучше понять работу Kotlin Coroutines. Беру небольшую тему про Kotlin Coroutines и пытаюсь разобраться и написать шпаргалку (максимально кратко и лаконично). Сегодня поговорим про Каналы (
Channel) и паттерн Actor.
В предыдущих частях я писал, что обычные suspend‑функции возвращают результат только один раз. Но что делать, если у нас есть непрерывный поток данных, который асинхронно генерируется в одной корутине, а обрабатываться должен в другой (или даже в нескольких)? Нам нужна потокобезопасная «труба». В мире корутин этой трубой является Channel.
Статья: https://habr.com/ru/articles/1071290/
Платформа: Android
👨🦯➡️ AppFiles: код, инструменты, практики, производительностьDroidGauge - Local-first регрессионное тестирование Android-приложений
DroidGauge — это инструмент командной строки, ориентированный на локальную работу, для воспроизводимых измерений производительности приложений Android. Он не требует root-доступа, APK-файла на устройстве, облачных сервисов или внешних ресурсов для создания отчетов. Он выявляет регрессии производительности и энергопотребления Android локально с помощью одной команды adb и готового автономного отчета.
Возможности:
• Сбор показателей CPU, PSS-памяти, рывков при отрисовке кадров, батареи, температуры и сетевой активности отдельных приложений — если соответствующие данные доступны в используемой версии Android.
• Устойчивый сбор данных: недоступные команды и поля отмечаются как отсутствующие метрики, а не приводят к прерыванию всего запуска.
• Стабильный JSON-формат
schema_version: 1 со средним значением, p50, p95, минимумом, максимумом и изменением от первого до последнего измерения.
• Адаптивные HTML-отчёты в тёмной теме со встроенными SVG-графиками, без CDN, JavaScript, внешних шрифтов и дополнительных файлов.
• A/B-сравнение с учётом направления изменения (improved, regressed, stable) и детерминированными выводами на основе правил.
• Проверка в CI с кодом выхода 2 при обнаружении настроенных регрессий.
• Не собираются логи, списки приложений, содержимое экрана или другие персональные данные.
DroidGauge на GitHub: https://github.com/RuizheGu0/droidgauge
Платформа: Android
⭐️: 4
👨🦯➡️ AppFiles: код, инструменты, практики, производительностьЗабавные анимации с меш-градиентами в Jetpack Compose 1.12
В Jetpack Compose всегда были интерфейсы для линейных и радиальных градиентов. Но если хотелось получить более сложное смешивание цветов, подходящего встроенного решения не было. Теперь оно появилось: в Jetpack Compose 1.12 представлен
MeshGradientPainter.
Статья: https://apptractor.ru/info/articles/zabavnye-animatsii-s-mesh-gradientami-v-jetpack-compose-1-12.html
Платформа: Android
👨🦯➡️ AppFiles: код, инструменты, практики, производительностьMYCloudKit - синхронизация и и возможности обмена данными через CloudKit
MYCloudKit — это фреймворк, разработанный для упрощения и автоматизации операций синхронизации, удаления и получения данных из CloudKit для вашего приложения.
MYCloudKit на GitHub: https://github.com/mufasaYC/MYCloudKit
Платформа: iOS
⭐️: 215
👨🦯➡️ AppFiles: код, инструменты, практики, производительность
Repost from Mobile Development by AppTractor
⚡️⚡️Мобильные разработчики снова соберутся на Mobius этой осенью!
21–22 октября в Санкт-Петербурге и онлайне пройдет Mobius — конференция JUG Ru Group для мобильных разработчиков. По традиции в фокусе — практические задачи, нативный и кроссплатформенный подходы, архитектура и реальный опыт продуктовых команд.
✨Программа уже активно формируется, делимся наиболее интересными докладами:
🔹Портирование Android-приложений под HarmonyOS NEXT. Спикер расскажет про автоматизированный перенос с сохранением архитектуры: от преобразования Kotlin-кода в ArkTS до трансляции Jetpack Compose в ArkUI.
🔹AI-driven T-shape. Разбор реального опыта команды о том, как искусственный интеллект помогает осваивать соседние платформы и бэкенд, ускоряя развитие инженеров и уменьшая time-to-market.
🔹Liquid Glass своими руками на Metal. Анатомия визуального эффекта из iOS 26 и его воссоздание для более старых версий с разбором интеграции в кодовую базу Telegram.
📣 Встречаемся 21–22 октября (Санкт-Петербург + online).
Подробнее о программе и билетах — на сайте.
React Native в 2026 году: New Architecture, нативный код и AI в реальном проекте
React Native по-прежнему часто описывают формулой «один код для iOS и Android». В 2026 году она звучит слишком просто. Современное приложение на React Native — это общий продуктовый слой на TypeScript, нативный интерфейс, Hermes, Fabric, JSI, фоновые процессы, platform-specific код и довольно много решений о том, где именно должна выполняться каждая задача.
Мы столкнулись с этим в Synchra.24 — мобильном приложении для линейных и распределённых команд. В проекте больше тысячи TS/TSX-файлов и свыше ста экранов, но рядом с ними живут Kotlin и Swift: геопозиция, push-уведомления, биометрия, системные виджеты и работа с медиа. Это не история о функциях нашего продукта и не попытка его рекламировать. Это разбор того, чем на практике стала разработка на React Native к 2026 году — и какую часть этой работы действительно можно поручить нейросетям.
Статья: https://habr.com/ru/articles/1072522/
Платформа: кроссплатформа
👨🦯➡️ AppFiles: код, инструменты, практики, производительность
📺 Видео и подкасты за неделю
•
(iOS En) SwiftUI in motion
• (iOS En) AllTrails: Momentum without a rewrite
• (iOS En) Flow data through SwiftUI
• (iOS En) SwiftUI essentials
• (iOS En) A guide to layout in SwiftUI
• (iOS En) Design with SwiftUI
• (iOS En) Reorderable Modifier | Multi-Item Reordering | Section Reordering | SwiftUI
• (iOS En) Prominent Action Custom Tab Bar | SwiftUI
• (iOS En) Device Hub Explained - What Every Apple Developer Should Know
• (And Ru) Android Runtime под капотом
• (And En) The Multi-Agent Code Review Workflow For My Production Android Apps
• (And En) Vertical vs. Horizontal Slicing - The ONLY Right Way to Split Down Your App
• (And En) A tale of the Gradle DSLs
• (Crs En) SwiftPM support for Kotlin Multiplatform
• (Crs En) All platforms are unique but some platforms are more unique than others
• (Crs En) KMP at Scale in Kuaishou Super App for over 700M users
• (Dev Ru) Выпрямляем руки агентов: как сделать MCP удобными и действительно полезными
• (Dsg Ru) DesignOps: операционная система команды, которая работает на вас
• (Dsg Ru) Дизайн для программиста: пробую Claude Design
• (Dev En) Build a live translation broadcast app with the Gemini Live API and LiveKit
• (Dev En) Go Get It, with Kotlin Lessons Learned Evolving Uber’s Java Backend
Прошлогодние видео:
• (Dev Ru) Генерация UI Kit с использованием ИИ
• (Dev Ru) Надежность мобильных приложений: что это и как достичь
• (Dev Ru) Задача на логику из собеседования в Amazon (+ все собеседования)
👨🦯➡️ AppFiles: код, инструменты, практики, производительностьBoxlore - умный плеер подкастов для Android
Большинство приложений для подкастов обращаются к открытому API, выполняют буквальный поиск по словам, показывают чарты Apple — и на этом всё. Ошибитесь в написании названия шоу — и ничего не найдёте. Попробуйте искать по теме — получите совпадения по заголовкам, которые вообще не отражают смысл запроса. А когда вы уже внутри приложения, главный экран редко ощущается как ваш: одинаковые подборки для всех и почти никакого обучения на основе того, что вы действительно слушаете.
Boxlore создан именно вокруг этих двух проблем. Он помогает найти шоу даже при неточном написании названия или искать подкасты и отдельные эпизоды по смыслу, когда вы примерно знаете, что хотите, но не можете сформулировать точный запрос. А по мере прослушивания приложение становится персональнее: Home, Explore, очередь и загрузки переупорядочиваются прямо на устройстве с учётом ваших предпочтений. Появляются подборки по времени суток, Because You Like, персональные рекомендации For You, а также карточки для случайных открытий — когда хочется найти что-то такое, что вы сами никогда не стали бы искать. Данные о ваших предпочтениях остаются на телефоне. Можно слушать потоково или скачивать выпуски для офлайн-доступа, полноценно управлять очередью и обходиться без рекламы и платных ограничений там, где это действительно важно.
Умный каталог охватывает популярные подкасты из чартов и ежедневно расширяется — пока в нём есть не абсолютно все шоу в мире. Но даже за пределами этого индекса Boxlore продолжает работать как обычный клиент для подкастов: можно подписываться, слушать, скачивать выпуски и импортировать OPML.
Boxlore на GitHub: https://github.com/boxcreate/boxlore
Платформа: Android
⭐️: 59
👨🦯➡️ AppFiles: код, инструменты, практики, производительность
Как Tinder сократил холодные старты на 47%, благодаря R8 Configuration Analyzer
Используя R8 Configuration Analyzer, Tinder смог найти и удалить непреднамеренные блокировки оптимизации. Результаты оказались заметными сразу: холодные запуски сократились на 47%, размер загружаемого приложения уменьшился на 28,98% — до 61,5 МБ, а число заметных пользователю ANR снизилось на 28%.
Статья: https://apptractor.ru/info/articles/kak-tinder-sokratil-holodnye-starty-na-47-blagodarya-r8-configuration-analyzer.html
Платформа: Android
👨🦯➡️ AppFiles: код, инструменты, практики, производительность
Подготовьте ваше приложение к более широким ограничениям объема памяти
Отличный пользовательский опыт — одна из ключевых целей Android, а для этого устройства должны оставаться быстрыми, отзывчивыми и надёжными. Именно поэтому оптимизация памяти становится важнее, чем когда-либо. На фоне роста цен на память новые устройства сохраняют прежний объём оперативной памяти или даже получают меньше, однако пользователи по-прежнему ожидают такой же плавной и производительной работы приложений.
В Android 17 ввели ограничения памяти для отдельных приложений, начав с устройств Pixel. Их задача — защитить общую отзывчивость системы от приложений, которые потребляют слишком много памяти и вызывают замедление всего устройства. В течение следующего года всё больше производителей начнут использовать ограничения памяти Android для приложений на устройствах с объёмом ОЗУ от 4 ГБ до 16 ГБ и более. Если приложение превысит эти лимиты, система замедлит его работу, а затем может завершить процесс. Поэтому уменьшение объёма потребляемой приложением памяти становится критически важным: это помогает избежать ограничения производительности со стороны ОС и сохранить плавный пользовательский опыт.
В этой статье разберём, как эти ограничения работают внутри системы, как измерять потребление памяти с помощью новых метрик Android vitals и какие конкретные действия помогут оптимизировать приложение или игру.
Статья: https://apptractor.ru/info/articles/podgotovte-vashe-prilozhenie-k-bolee-shirokim-ogranicheniyam-obema-pamyati.html
Платформа: Android
👨🦯➡️ AppFiles: код, инструменты, практики, производительность
Stitch - инъекция зависимостей для SwiftUI
Stitch — это лёгкая библиотека внедрения зависимостей (DI), вдохновлённая SwiftUI и обеспечивающая безопасность на этапе компиляции. Она позволяет описывать карту зависимостей без необходимости использовать инструменты генерации кода.
Безопасность Stitch на этапе компиляции даёт уверенность в корректности настройки: если проект компилируется, значит зависимости сконфигурированы правильно. В отличие от типичных контейнеров зависимостей, здесь не возникает ошибок в рантайме из-за того, что какая-либо зависимость не была зарегистрирована.
Для описания карты зависимостей Stitch использует новые макросы Swift 5.9+, что делает API более удобным, а для получения объектов из карты предоставляет соответствующие реализации
@propertyWrapper.
Stitch предлагает следующие ключевые возможности:
1. Интеграция в жизненный цикл SwiftUI и привычный для SwiftUI стиль работы — использовать Stitch можно так же, как другие оболочки свойств SwiftUI.
2. Внедрение зависимостей через протоколы внутри представлений SwiftUI. Библиотека расширяет возможности ObservableObject, позволяя работать с протокольными типами и при этом корректно обновлять представления.
3. Доступ к Combine-издателям для свойств протокольных типов без необходимости добавлять в протокол переменные вида Publisher<Object, Never> и вручную проксировать их в реализации.
Stitch на GitHub: https://github.com/entrhq/stitch
Платформа: iOS
⭐️: 19
👨🦯➡️ AppFiles: код, инструменты, практики, производительностьSenior инженеры замолчали, и вот почему это плохой знак
Речь не о том, что у этих инженеров закончились мнения. Мнений у них по-прежнему хватает. Изменилось другое — куда эти мнения теперь направляются. Стало меньше замечаний на дизайн-ревью. Меньше возражений в архитектурных обсуждениях. Меньше тех моментов, когда человек с десятью годами производственного опыта говорит: подождите, я уже видел нечто подобное, и вот чем всё закончилось.
Встречи по-прежнему проходят. Решения по-прежнему принимаются. Но один конкретный вид трения стал почти незаметным. А это трение выполняло важную функцию.
Статья: https://apptractor.ru/info/articles/senior-inzhenery-zamolchali-i-vot-pochemu-eto-plohoy-znak.html
Платформа: разработка
👨🦯➡️ AppFiles: код, инструменты, практики, производительность
ZeroDroid - инструменты для анализа сетей, сигналов и безопасности
ZeroDroid — открытое Android-приложение, которое превращает смартфон в универсальный набор инструментов для анализа беспроводных сетей, радиосигналов, датчиков и безопасности. Проект объединяет 29 инструментов в пяти категориях: Wireless, RF & Signals, Sensors, Network и Security. Для работы используются аппаратные возможности самого телефона — Wi-Fi, Bluetooth и BLE, NFC, GPS, сотовый модем, магнитометр, барометр, микрофон, USB, UWB и ИК-порт, если они присутствуют в конкретном устройстве.
Среди наиболее интересных функций — анализатор Wi-Fi, BLE-сканер с просмотром GATT, инструменты NFC, Wi-Fi Direct и Wi-Fi Aware, анализ ультразвукового диапазона 18–24 кГц, работа с внешними SDR-приёмниками через USB OTG и мониторинг датчиков смартфона. Есть также GPS-трекер с информацией о GNSS-спутниках и записью NMEA, EMF Mapper на основе магнитометра, инспектор USB-устройств и анализатор сотовых вышек.
ZeroDroid написан на Kotlin с использованием Jetpack Compose и Material 3. Архитектура построена вокруг MVVM, StateFlow и Hilt, для локального хранения используется Room, для камеры — CameraX, а для распознавания QR-кодов — ML Kit и ZXing. Минимальная поддерживаемая версия — Android 8.0, хотя для полноценной работы современных Bluetooth и Wi-Fi API автор рекомендует более новые версии Android. Не все возможности доступны на каждом смартфоне: например, UWB, ИК-передатчик или барометр зависят от конкретного аппаратного оснащения.
ZeroDroid на GitHub: https://github.com/theabhishekchandra/ZeroDroid
Платформа: Android
⭐️: 22
👨🦯➡️ AppFiles: код, инструменты, практики, производительность
Android Skills — что выпустил Google и почему большинство разработчиков используют навыки неправильно
Вы, скорее всего, уже видели анонс. Android Skills запустили в апреле; реакция превзошла ожидания Google, а в начале августа команда Android Developer Relations опубликовала подробный материал, в котором объяснила философию проекта.
Большинство разработчиков восприняли это как обычное описание релиза.
На самом деле это набор архитектурных решений о том, как должна выглядеть Android-разработка с помощью ИИ. И если их не понять, можно в итоге получить конфигурацию агента, которая будет стоить дороже, работать медленнее и выдавать результаты хуже, чем если бы вы вообще ничего не настраивали.
Статья: https://apptractor.ru/info/articles/android-skills-chto-vypustil-google-i-pochemu-bolshinstvo-razrabotchikov-ispolzuyut-navyki-nepravilno.html
Платформа: Android
👨🦯➡️ AppFiles: код, инструменты, практики, производительность
Архитектура Android переходит от Event-Driven UI к State-Driven UI
Состояние — это то, за чем UI наблюдает постоянно. События или эффекты — это то, что UI должен обработать только один раз. Такой подход давно распространён в архитектурах MVVM и MVI. Однако если посмотреть на актуальные рекомендации Android-разработки по событиям UI, Google предлагает пересмотреть саму эту модель.
Статья: https://apptractor.ru/info/articles/arhitektura-android-perehodit-ot-event-driven-ui-k-state-driven-ui.html
Платформа: Android
👨🦯➡️ AppFiles: код, инструменты, практики, производительность
JS-инъекция для iOS-тестов: как подружить WKWebView и XCTest
Мы пишем UI-тесты для Ozon Банка, и примерно каждый второй экран — с WebView. Оферты, платёжные формы, веб-флоу — всё это рендерится внутри WKWebView. И здесь XCTest оказывается почти бессилен.
Статья: https://habr.com/ru/companies/ozonbank/articles/1016596/
Платформа: iOS/тестирование
👨🦯➡️ AppFiles: код, инструменты, практики, производительность
