AppFiles - Mobile Development
2.18K subscribers
3.14K photos
41 videos
13 files
4.12K links
Библиотеки, обучающие статьи, курсы и видео для (мобильных) разработчиков. Если есть вопросы - пишите @lbogolubov.
Download Telegram
Hydra - защита Android-приложения

Hydra - Gradle-плагин RASP (Runtime Application Self-Protection) для Android.  Добавьте его, как любой другой плагин сборки, и он динамически внедрит усиленный нативный слой защиты прямо в ваш APK — без кода, без вызовов SDK, без серверов. Примените плагин, соберите приложение, и полученный APK-файл будет защищенным. «Под капотом» применение Hydra добавляет в ваш APK сильно обфусцированное с помощью OLLVM нативное ядро (libdicore.so), уникальную для каждой сборки эталонную базу проверки целостности и рандомизированный загрузчик. Защита запускается в момент создания процесса и полностью работает на устройстве — в нативном коде.

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

При этом защита не усложняет процесс разработки. Защита, которую можно включить одной строкой в конфигурации плагина, с большей вероятностью действительно попадёт в релиз. Поэтому Hydra придерживается принципа: лучше хорошая защита, которая реально применяется, чем идеальная защита, от которой отказались из-за сложности внедрения.

Hydra на GitHub: https://github.com/iamjosephmj/hydra
Платформа: Android
⭐️: 28

👨‍🦯‍➡️ AppFiles: код, инструменты, практики, производительность
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Пять ошибок при работе с Jetpack Compose, из-за которых тормозит recomposition

Jetpack Compose в 2026 году стал стандартом разработки UI на Android, но в проектах регулярно повторяется одна и та же история: на экране со списком в пару сотен элементов прокрутка идёт рывками, профайлер показывает скачки кадров до 200 миллисекунд, а команда чешет голову и предлагает откатиться обратно на RecyclerView.

Проблема почти всегда не в Compose, а в том, как написан UI: recomposition спроектирован как дешёвая операция, но эта дешевизна работает только при соблюдении ряда правил, которые в документации описаны рассыпанно и часто игнорируются.

Разберём пять ошибок, из-за которых производительность Compose-экранов проседает заметно для глаза, и покажем, как их находить и чинить.

Статья: https://habr.com/ru/companies/otus/articles/1049282/
Платформа: Android

👨‍🦯‍➡️ AppFiles: код, инструменты, практики, производительность
Please open Telegram to view this post
VIEW IN TELEGRAM
Preview-Driven скриншот тестирование для локалей, ключей и масштабов шрифта

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

Они хотели такой же видимости и на Android.

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

Статья: https://apptractor.ru/info/articles/preview-driven-skrinshot-testirovanie-dlya-lokaley-klyuchey-i-masshtabov-shrifta.html
Платформа: Android/тестирование

👨‍🦯‍➡️ AppFiles: код, инструменты, практики, производительность
Please open Telegram to view this post
VIEW IN TELEGRAM
AetherEngine - медиаплеер для iOS, tvOS и macOS

AetherEngine — это движок медиаплеера для платформ Apple. FFmpeg демультиплексирует, VideoToolbox декодирует, AVPlayer обрабатывает Dolby Atmos. Он правильно обрабатывает сложные компоненты (HDR, Dolby Vision, Dolby Atmos, покрытие контейнеров, покрытие кодеков) и предоставляет один AetherPlayerView (UIKit / AppKit) или AetherPlayerSurface (SwiftUI) плюс несколько асинхронных методов. Нет AVPlayerViewController, нет настраиваемых элементов управления, нет аналитики. Привяжите представление, вызовите play(), считывайте опубликованные свойства для получения состояния.

На платформах Apple реальный выбор сводится к AVPlayer, обладающему глубокой интеграцией с ОС, но работающему только с форматами, поддерживаемыми Apple, и движку на основе VLC или mpv, который воспроизводит практически всё, но обрабатывает собственные кадры и обходит встроенную обработку Dolby Vision, Atmos и HDR. AetherEngine создан для того, чтобы предоставить вам оба варианта: широкий спектр форматов FFmpeg, наложенный поверх VideoToolbox и AVPlayer, благодаря чему Dolby Vision, Atmos и Match Content продолжают работать. KSPlayer — ближайший аналог, он достигает того же результата тем же путём, что и AVPlayer, но поставляется как полноценный плеер со своим собственным пользовательским интерфейсом и ограничивает доступ к MKV, Dolby Vision и Atmos платным уровнем лицензии LGPL (бесплатная версия — GPL). AetherEngine — это встраиваемый движок, управляемый из вашего SwiftUI, с широким спектром кодеков и HDR в ядре с открытым исходным кодом.

AetherEngine на GitHub: https://github.com/superuser404notfound/AetherEngine
Платформа: iOS
⭐️: 84

👨‍🦯‍➡️ AppFiles: код, инструменты, практики, производительность
Please open Telegram to view this post
VIEW IN TELEGRAM
Пять ошибок начинающих Android‑разработчиков при работе с жизненным циклом

Начинающие разработчики про это забывают, и через месяц после релиза накапливаются утечки, после поворота экрана теряются данные форм, а после возврата из фона приложение крашится с NullPointerException в неожиданных местах.

Разберём пять типичных ошибок, на которых сыпется почти каждый первый Android‑проект, и покажем, какие инструменты появились в современном Android‑стеке для борьбы с этой болью

Статья: https://habr.com/ru/companies/otus/articles/1049294/
Платформа: Android

👨‍🦯‍➡️ AppFiles: код, инструменты, практики, производительность
Please open Telegram to view this post
VIEW IN TELEGRAM
Anti-Vocale - транскрибация голосовых сообщений на Android

Anti-Vocale - приложение для Android, позволяющее расшифровывать голосовые сообщения локально на устройстве без подключения к интернету. Anti-Vocale перехватывает аудиофайлы, которыми делятся пользователи (из WhatsApp, Telegram и т. д.), расшифровывает их с помощью встроенных моделей распознавания речи и выводит результат в виде уведомления с возможностью копирования и обратной отправки одним касанием.

Фичи:

• Полностью автономный режим — вся обработка происходит на устройстве, данные не покидают ваш телефон
• Несколько движков ASR — выбирайте между моделями Gemma (LLM), Whisper, Parakeet TDT, Qwen3-ASR или Nemotron 3.5 (потоковая передача)
• Интеграция с функцией обмена — делитесь аудио из любого мессенджера для транскрипции
• Цели обмена для конкретных моделей — выбирайте конкретную модель непосредственно из меню обмена Android
• Повторная транскрипция — повторите любую транскрипцию с другой моделью
• Умные уведомления — скопируйте результат или отправьте его обратно в исходное приложение одним касанием
• Индикатор достоверности — отображает обнаруженный язык и предупреждает о результатах с низкой достоверностью
• Прогрессивное отображение — текст транскрипции отображается по сегментам, вместо ожидания полного результата
• Действия с помощью жестов — проведите пальцем по записям лога, чтобы скопировать, поделиться или удалить
• Постоянный журнал транскрипции — все транскрипции сохраняются в локальной базе данных с возможностью поиска
• Обработка с учетом очереди — обрабатывает несколько одновременных запросов с отображением прогресса
• Оценка времени выполнения на основе калибровки — оценки прогресса улучшаются по мере адаптации модели к вашему устройству
• Статистика производительности — отслеживайте реальную скорость транскрипции для каждой модели на вашем устройстве
• Удаление тихих сегментов VAD — при необходимости удаляйте тихие сегменты перед транскрипцией для более быстрых результатов
• Настраиваемые потоки вывода — автоматическое определение или ручная установка количества потоков для оптимизации производительности
• Настройки для каждого приложения — настройте поведение уведомлений для каждого мессенджера
• Картинка в картинке — смотрите транскрипцию в реальном времени в плавающем окне при использовании других приложений
• Многоязычный интерфейс — интерфейс приложения полностью переведен на английский и итальянский языки
• Автоматическое копирование — при необходимости автоматически копируйте транскрипцию в буфер обмена
• Поддержка задач/автоматизации — запускайте транскрипцию с помощью широковещательных интентов

Anti-Vocale на GitHub: https://github.com/RisorseArtificiali/anti-vocale
Платформа: Android
⭐️: 19

👨‍🦯‍➡️ AppFiles: код, инструменты, практики, производительность
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Как нарисовать тысячи объектов на карте и не убить FPS: эволюция рендера на Mapbox GL

В прошлой статье про нетривиальные анимации я обещал показать «ту самую карту с облаками, zoom и движением по кривой Безье». Пришло время. Начну, правда, не с самой анимации, а с того, что было до неё: прежде чем что-то красиво анимировать на карте, надо это что-то на карте хотя бы нарисовать.

Контекст: я делал геолокационную соцсеть. На карте – «облака», посты, привязанные к точке на местности. Их может быть много. Очень много. И вся история ниже – про то, как я пять раз упёрся в производительность и что с каждым разом делал.

Статья: https://habr.com/ru/articles/1051362/
Платформа: iOS

👨‍🦯‍➡️ AppFiles: код, инструменты, практики, производительность
Please open Telegram to view this post
VIEW IN TELEGRAM
Сетчатые градиенты в Jetpack Compose

Долгие годы сетчатые (mesh) градиенты были той прекрасной вещью, которую мы постоянно заимствовали с других платформ. Вы видели их повсюду — в I****, на обоях Apple, на маркетинговых страницах Stripe, в каждом файле Figma, созданном после 2022 года. SwiftUI добавил MeshGradient ещё в iOS 18. На Android мы обходились хитрыми шейдерными хаками и отличными сторонними библиотеками.

Сейчас это изменится. Jetpack Compose теперь имеет собственный API для создания сетчатых градиентов, встроенный прямо в androidx.compose.ui. В этой статье мы рассмотрим, что это такое, нарисуем несколько примеров и поговорим о том, чем он отличается как от SwiftUI, так и от решений сообщества, которые вы, возможно, уже используете.

Статья: https://apptractor.ru/info/articles/setchatye-gradienty-v-jetpack-compose.html
Платформа: Android

👨‍🦯‍➡️ AppFiles: код, инструменты, практики, производительность
Please open Telegram to view this post
VIEW IN TELEGRAM
SwiftStreamingMarkdown - рендеринг Markdown с поддержкой стриминга

SwiftStreamingMarkdown - библиотека от Microsoft для рендеринга Markdown текста, поддерживающая плавную потоковую обработку.

• Плавные и производительные переходы при поступлении нового текста
• Нативный рендеринг встроенных и блочных формул LaTeX
• Интерфейс встроенных ссылок на источники для ответов LLM
• Гибкая настройка типографики, тем оформления и контекстных меню iOS
• Встроенные инструменты для аналитики и отслеживания взаимодействий

SwiftStreamingMarkdown на GitHub: https://github.com/microsoft/SwiftStreamingMarkdown
Платформа: iOS
⭐️: 223

👨‍🦯‍➡️ AppFiles: код, инструменты, практики, производительность
Please open Telegram to view this post
VIEW IN TELEGRAM
1
📺 Видео и подкасты за неделю

(iOS Ru) Архитектура, перформанс, дебаг: как мы делали медиаленту
(iOS Ru) SwiftSyntax: пишем свой DI framework
(iOS En) iOS 27 Style Glass Sliders Using SwiftUI
(iOS En) What's new in Swift and SwiftUI (WWDC 2026)
(iOS En) Setting up Gemini in Xcode's Coding Agent
(iOS En) Swift Macros Demystified: Build a Freestanding Expression Macro
(iOS En) Weather App Style Sticky Scroll Section Using SwiftUI
(And En) How to understand Play’s expanded billing options and lower fees
(And En) Is THIS How Android Apps Communicate In Future? - Exploring the NEW AppFunctions
(And En) NEW Scoped ViewModels API in Jetpack Compose
(Crs Ru) Как мы внедряли Compose Multiplatform в Я.Team
(Crs Ru) yx_state + yx_scope + yx_navigation: единый стек Flutter-приложений
(Dev Ru) T-Shape мобильный разработчик
(Dev Ru) Найм в эпоху AI — собеседования, IT найм, рынок труда

Прошлогодние видео:

(iOS Ru) Молот и наковальня iOS-разработчика
(iOS Ru) А так ли нужны акторы в Swift Concurrency?
(iOS Ru) Реактивный Swift Concurrency
(And Ru) Эти фичи Kotlin меняют правила игры
(And Ru) Что не так с Android разработкой?
(And Ru) Эволюция Android тестов с Marathon Test Runner

👨‍🦯‍➡️ AppFiles: код, инструменты, практики, производительность
Please open Telegram to view this post
VIEW IN TELEGRAM
Composables UI - коллекция компонентов для Jetpack Compose и Compose Multiplatform

Composables UI — это набор современных, accessible компонентов для Jetpack Compose и Compose Multiplatform.

Jetpack Compose построен на основе Material Compose, реализации языка дизайна Google Material Design в Compose. Material Compose — отличная отправная точка для создания приложений с помощью Compose. Но он также воспринимается как библиотека компонентов, разработанная для создания приложений Google. Его сложно настраивать как в плане стиля, так и в плане пользовательского опыта. Вам либо нужно принять дизайнерские решения Material, либо перестраивать те же компоненты самостоятельно. 

В то же время Jetpack Compose развивается за пределами Android благодаря Compose Multiplatform от JetBrains. Но Material Design выглядит неуместно за пределами Android, особенно на iOS. Material Compose также не разработан с учетом использования курсора. В результате приложения могут казаться слишком большими на настольных компьютерах и в веб-браузере.

Именно эту проблему решает Composables UI, используя следующие принципы:

• Универсальность: компоненты автоматически адаптируются к возможностям устройства, таким как сенсорный ввод, ввод с мыши и клавиатуры.
• Открытый исходный код: код под лицензией MIT, который легко модифицировать.
• Красивые настройки по умолчанию: авторы тщательно продумывают дизайн, чтобы вы могли создавать современные приложения для всех платформ без специальных навыков проектирования.
• Возможность копирования и вставки: каждый компонент находится в отдельном файле, поэтому вы можете скопировать его напрямую.

Composables UI на GitHub: https://github.com/composablehorizons/composables-ui
Платформа: Android/кроссплатформа
⭐️: 37

👨‍🦯‍➡️ AppFiles: код, инструменты, практики, производительность
Please open Telegram to view this post
VIEW IN TELEGRAM
1
Хардкорная агентская разработка под iOS, часть 1: отдельный Mac Mini для агентов

Я не раз ловил себя на мысли, что я уже давно только и делаю, что жму “allow”, “allow everytime”, редко вникая в суть того, что спрашивает агент, но полностью доверить агенту делать всё, что ему заблагорассудится, мне как-то боязно. Всё-таки на основном макбуке много личных и рабочих данных, которые агент может случайно (или через prompt injection) удалить или слить в сеть. Стрёмно. Поэтому я какое-то время играл в игру “я типа читаю, что ты у меня спрашиваешь”.

Хотя правильное решение — запуск агента в режиме YOLO (в случае claude — с флагом --dangerously-skip-permissions). И тогда при правильной постановке задачи агент может часами сам работать и делать то, что нужно, уведомляя меня только по выполнении.

Это первая статья цикла. Здесь — базовая настройка Mac Mini и вся возня с SSH, чтобы YOLO-агент работал на отдельной машине без ручного ввода паролей и переживал разрывы сети. Специфику iOS-разработки (git worktree, параллельное тестирование, idb, прогон приложения, грабли симулятора и прочее) я вынес в следующие части, так что статья будет полезна не только iOS-разработчикам, но и всем, кто хочет запускать YOLO-агентов и не париться о безопасности. С некоторыми оговорками, разумеется, подробности ниже.

Статья: https://habr.com/ru/articles/1052174/
Платформа: iOS

👨‍🦯‍➡️ AppFiles: код, инструменты, практики, производительность
Please open Telegram to view this post
VIEW IN TELEGRAM
Искусственный интеллект провел со мной собеседование на должность iOS-разработчика

Две недели назад я искал новые возможности для заработка и наткнулся на платформу экспертов micro1.

Идея у неё простая: вы используете свои профессиональные знания, чтобы помогать в обучении нового поколения моделей искусственного интеллекта.

Я ввёл в поиске «iOS» и нашёл две вакансии iOS-разработчика. Требования были вполне привычными: знание Swift, UIKit и SwiftUI, несколько лет опыта, почасовая оплата.

Я отправил заявку. В тот момент я ещё не понимал, кто — или что именно — будет проводить со мной собеседование.

Статья: https://apptractor.ru/info/articles/iskusstvennyy-intellekt-provel-so-mnoy-sobesedovanie-na-dolzhnost-ios-razrabotchika.html
Платформа: собеседование

👨‍🦯‍➡️ AppFiles: код, инструменты, практики, производительность
Please open Telegram to view this post
VIEW IN TELEGRAM
Copy-on-Write в Swift: подготовка к собеседованию

За годы я сидел по обе стороны стола: и как кандидат, и как собеседующий — в том числе на позиции в крупные продуктовые компании. И именно Copy-on-Write раз за разом оказывался той темой, на которой видно разницу между «слышал слово» и «понимаю механизм». Тема звучит обманчиво просто — «копируем только при записи», — но крупняк любит докапываться до формулировок: не «массив копируется по значению», а когда именно копируется буфер, что проверяется перед записью, почему у функции проверки именно такая сигнатура. Один неаккуратный оборот — и за него тут же цепляются уточняющим вопросом.

Сразу скажу про планку ожиданий, чтобы снять тревогу: на практике от кандидата редко хотят академически точного описания рантайма Swift до последнего бита. Хотят, чтобы вы держали в голове рабочую модель («struct снаружи, общий буфер с refcount внутри, копия на первой записи в разделяемый буфер») и могли её развернуть на пару уровней вглубь, не плавая в базовых понятиях вроде семантики значения и ссылки. Сидя по другую сторону стола, я отсекаю не тех, кто не знает внутренностей компилятора, а тех, кто путается в фундаменте и выдаёт заученные фразы, под которыми ничего нет. Поэтому статья идёт от фундамента к деталям: сначала то, что обязательно надо понимать, потом то, чем можно приятно удивить.

Статья: https://habr.com/ru/articles/1052522/
Платформа: iOS

👨‍🦯‍➡️ AppFiles: код, инструменты, практики, производительность
Please open Telegram to view this post
VIEW IN TELEGRAM
Нам всем нужен такой учебник
💅3
BlazeDB - нативная для Swift встраиваемая база данных для локального хранения данных

BlazeDB - встраиваемая зашифрованная однопроцессная документная база данных для Swift с ACID-транзакциями, восстановлением после сбоев на основе журнала предзаписи и шифрованием AES-256-GCM при хранении. Для каждой базы данных создаётся отдельный зашифрованный файл. Не требует отдельного сервера и обязательных сетевых запросов.

BlazeDB на GitHub: https://github.com/Mikedan37/BlazeDB
Платформа: iOS
⭐️: 13

👨‍🦯‍➡️ AppFiles: код, инструменты, практики, производительность
Please open Telegram to view this post
VIEW IN TELEGRAM
Лента роликов на iOS: опыт работы с AVPlayer

В T-Инвестициях на iOS лента коротких роликов — это 90% трафика, именно ее оптимизации мы уделяем больше всего внимания. В первой версии пользователи могли ждать старта видео больше 15 секунд. Мы разобрались в ограничениях AVPlayer, оптимизировали буферизацию и снизили задержки на 12% в хвосте распределения. Рассказываю, как мы улучшали пользовательский опыт и почему AVPlayer не лучшее решение для ленты роликов.

Статья: https://habr.com/ru/companies/tbank/articles/1053402/
Платформа: iOS

👨‍🦯‍➡️ AppFiles: код, инструменты, практики, производительность
Please open Telegram to view this post
VIEW IN TELEGRAM
Внедрение Gemini Nano в реальное приложение: ограничения, о которых никто не предупреждает

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

Статья: https://apptractor.ru/info/articles/gemini-nano-real.html
Платформа: Android

👨‍🦯‍➡️ AppFiles: код, инструменты, практики, производительность
Please open Telegram to view this post
VIEW IN TELEGRAM
Laydr - file-based типобезопасная система навигации

Laydr — это file-based типобезопасная система навигации для Compose Multiplatform и Android-приложений на Compose. Структура приложения описывается через наглядный каталог routes/, а Laydr генерирует Kotlin-маршруты, билдеры путей, карты маршрутов, локальные Compose-точки входа и интеграцию с Navigation 3 — всё то, что при ручной поддержке со временем обычно начинает расходиться и устаревать.

Laydr пригодится, когда навигация в Kotlin-приложении превратилась в сеть скопированных строк маршрутов, дублирующейся настройки графа, повторного разбора аргументов, обёрток макетов, реестров вкладок и устаревшего связующего кода. Маршруты становятся понятной структурой каталогов, Laydr генерирует предсказуемую навигационную обвязку, а интерфейс на Compose, состояние, данные, доступ к зависимостям, навигационные элементы и платформенные правила остаются явно описанными в коде приложения.

Laydr на GitHub: https://github.com/mobiletoly/laydr
Платформа: Android/кроссплатформа
⭐️: 7

👨‍🦯‍➡️ AppFiles: код, инструменты, практики, производительность
Please open Telegram to view this post
VIEW IN TELEGRAM