AppFiles - Mobile Development – Telegram
AppFiles - Mobile Development
2.13K subscribers
2.76K photos
38 videos
11 files
3.69K links
Библиотеки, обучающие статьи, курсы и видео для (мобильных) разработчиков. Если есть вопросы - пишите @lbogolubov.
Download Telegram
Лучшие приложения с открытым исходным на Kotlin

Обсуждение на Reddit - знаете ли вы хорошие приложения с открытым исходным кодом, написанные на Kotlin, сложные и нормально структурированные?

• Bitwarden Android — менеджер паролей
• Now in Android — официальное учебное приложение Google для изучающих Android-разработку
• Atomic — Periodic Table — периодическая таблица химических элементов, пет-преокт одного из участников
• Telegram — исходники мессенджера
• Tachiyomi/Mihon — открытый ридер манги для Android (код сложен и не очень хорошо структурирован)
• KotlinConf — приложение самой большой конференции по Kotlin (сделано на Kotlin Multiplatform и Compose Multiplatform)
• Home Assistant Companion for Android — приложение Google для домашней автоматизации
• Rijksmuseum — мультимодульное мультиплатформенное приложение на Kotlin и Compose, которое предлагает захватывающий способ изучения художественной коллекции Рейксмузея в Амстердаме
• Premier League — полнофункциональное приложение с открытым исходным кодом на KMP, содержащее результаты матчей английской футбольной лиги, пет-преокт одного из участников
• Pokedex Compose — приложение про покемонов, которое демонстрирует современную разработку для Android с использованием Compose, Hilt, Coroutines, Flow, Jetpack и Material Design на основе MVVM-архитектуры

Статья: https://apptractor.ru/info/github/luchshie-prilozheniya-s-otkrytym-ishodnym-na-kotlin.html
Платформа: Android
👍1
📺 Видео и подкасты за неделю на @AppFiles

(iOS Ru) Нервное смузи из Swift Package Registry
(iOS Ru) Альтернативы XCUITest, или Как и зачем разработчику писать автотесты
(iOS En) Set Up a Local Test Server with Swift in Under 5 Minutes + iOS app SwiftUI
(iOS En) Expandable Header with Hero Effect - Slack Header Animation | SwiftUI
(iOS En) SwiftUI - Scratch to Reveal animation
(iOS En) What's new in Swift 6.1?
(iOS En) SwiftUI Micro-interactions - Slide To Confirm
(iOS En) Xcode 16.3 is Available Today (What's New?)
(And Ru) Modo в действии: быстрая и гибкая навигация для Jetpack Compose
(And Ru) Как сделать своп движка звонков в легаси-коде и не выгореть
(And Ru) Backup в Android, или Как сэкономить бизнесу миллионы
(And En) Linting on the Side of Caution: Safety & Security - Android Developers Backstage
(And En) Google Play PolicyBytes - April 2025 policy updates
(And En) Kotlin 2.1.20 - Atomics, UUIDs, and more! - TypeAlias Show
(Crs Ru) Это вам не игрушки: портирование кроссплатформенной С++ игры на iOS
(Crs Ru) Accessibility Flutter-приложений, или Как увеличить трафик на 20
(Crs En) Lynx Tutorial – JS Framework for Cross Platform Development
(Crs En) Hot Reload For Flutter Web is Finally in Beta
(Dev En) Top 5 Mobile System Design Concepts Explained
(Dev En) Freelancing as Mobile Dev vs. Full-time Job - Which Path Is Best For YOU?
(Dev En) Introducing Agent Development Kit
(Dev En) Train Your Own LLM – Tutorial

Что было год назад:

(And Ru) Экзоскелет для ExoPlayer
(Crs Ru) Как мы сделали ставку на KMP
(Crs Ru) Зачем мне Kotlin в iOS-разработке? Я только Swift выучил!
(Dev Ru) Как дизайнить доступность для скринридера
(Dev Ru) Проблемы маленьких приложений при увеличении нагрузки по данным
(Dev Ru) Как выжать все соки из Jenkins
(Dev Ru) Убиваем Lottie? Тащим Rive?
(Dev Ru) Вся правда про удаленку
(Dev Ru) Зачем нужен Zig, и чем он отличается от других языков
Please open Telegram to view this post
VIEW IN TELEGRAM
StorySDK - это платформа для создания и добавления историй в мобильные приложения (с веб-конструктором).

Интегрировав StorySDK вы сможете сделать онбординг, отображение групп историй с помощью виджета, изменять настройки, например, включение полноэкранного режима, показ/скрытие заголовка, установка продолжительности каждой истории и цвета прогресса.

Сам сервис бесплатен до 1000 MAU, дальше нужно будет платить.

StorySDK на GitHub: https://github.com/StorySDK/story-ios-sdk
Платформа: iOS
⭐️: 34
👍1
Демоприложения: как жить, когда у вас 90+ application-модулей

В предыдущей статье основной акцент был на сокращении времени сборки и синхронизации кода с Android Studio. Но так уж выходит, что, решая одну проблему, мы порождаем другие. Если раньше был один единственный application module, к которому подключались все остальные модули для сборки в конечный артефакт(apk, aab), то сейчас таких модулей стало приблизительно на 90 больше.

Меня зовут Роман Заремба и я расскажу, как мы ушли от кода интеграции в application-модулях, пересмотрели базовые решения, придумали подход collector + initializer, перешли на библиотеку App Startup, избавились от нее и стали использовать стандартный Java ServiceLoader.

Статья: https://habr.com/ru/companies/tbank/articles/899714/
Платформа: Android
👍1
SwiftUI: Реализация разделенного координатора совместно с DeepLink (Universal link)

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

Использование концепции MVVM порождает еще один философский вопрос: может ли один и тот же экран с одной и той же viewmodel иметь различные типы входных параметров. Конечно, для идеологии чистого кода — ответ однозначен. Но ведь если нет нужды в создании нового вида или новой view model, то подавляющее количество разработчиков предпочтет переиспользовать один и тот же экран и для отображения десериализированного объекта, и для сериализированных параметров, передаваемых строкой в пути навигации.

Статья: https://habr.com/ru/articles/899764/
Платформа: iOS
👍1
Интегрируем TimelineView в SwiftUI-приложение

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

Статья: https://apptractor.ru/info/articles/timelineview-swiftui.html
Платформа: iOS
👍1
WriteBuddy - помощник для ведения заметок на Compose. Есть два режима. Режим Sticky - это функция, позволяющая пользователям размещать на экране различные клейкие элементы, такие как стикеры, изображения и текстовые поля, и управлять ими. Пользователи могут добавлять наклейки, перемещать их, изменять их размер и свойства. Режим ToolMode предоставляет новые функциональные возможности благодаря сенсорному взаимодействию с пользователем. Тут пользователи могут писать на экране рукой или клеить ленты.

WriteBuddy на GitHub: https://github.com/henni99/WriteBuddy
Платформа: Android
⭐️: 93
Как работать с запросами разрешений в Appium: распознаём, что от нас хочет iOS

Мы разрабатываем и поддерживаем приложения для огромной пользовательской базы, и без мобильных автотестов тут не обойтись. Сегодня я расскажу, как мы решили одну из самых неприятных (из интересных) проблем в автоматизации iOS‑приложений — работу с системными запросами разрешений. Сами события возникли еще год назад, но хочется об этом рассказать. Если вы сталкивались с тем, что тесты падают из‑за неожиданно появляющихся системных диалогов — эта статья может вам помочь.

Статья: https://habr.com/ru/companies/bitrix/articles/900578/
Платформа: iOS/тестирование
Введение в Trio

В Airbnb мы разработали Android-фреймворк для экранной архитектуры Jetpack Compose, который мы назвали Trio. Trio построен на нашей библиотеке с открытым исходным кодом Mavericks, которая используется для поддержания навигации и состояния приложения внутри ViewModel.

Статья: https://apptractor.ru/info/articles/vvedenie-v-trio.html
Платформа: Android
1👍1
Не подсматривай: защищаем данные пользователей от скриншотов

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

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

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

Статья: https://habr.com/ru/companies/deiteriylab/articles/900028/
Платформа: разработка
1
Как я сократил время сборки Gradle на 50%

В этой статье мы рассмотрим практические стратегии повышения производительности сборки Gradle в Android-проектах, использующих Kotlin. Мы рассмотрим полезные конфигурации gradle.properties, обсудим, как обновление версий Gradle, Kotlin и Java может дать ощутимую разницу, а также подробно рассмотрим компромиссы между скриптами сборки на Groovy и Kotlin - да, Groovy все еще имеет небольшое преимущество, когда речь идет о скорости.

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

Статья: https://apptractor.ru/info/articles/gradle-50.html
Платформа: Android
1👍1
Kurozora - это универсальный портал для всего, связанного с аниме. Приложение дает вам доступ к огромному каталогу аниме, манги и игр. Оно разработано таким образом, чтобы быть отзывчивым, поддерживающим любые экраны, подстраивающимся в своей теме под любого пользователя. Внутри Swift, SwiftLint, R.swift и Jazzy и собственный KurozoraKit для работы, собственно, с API сайта.

Kurozora на GitHub: https://github.com/Kurozora/kurozora-app
Платформа: iOS
⭐️: 57
👍2
Осваиваем дебаунсинг в iOS с помощью Swift

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

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

Статья: https://medium.com/@connect2ayu/mastering-debouncers-in-ios-with-swift-prevent-unnecessary-work-with-elegance-7e04e46641d7
Платформа: iOS
👏: 40
👍2
От дашбордов к более глубокому пониманию: улучшите качество и производительность приложений с помощью новых сведений Play Console

Google представила обновления в Play Console, направленные на улучшение качества приложений и удобство работы разработчиков. Вот ключевые нововведения:

• Обновлённый дашборд
• Новые метрики для повышения качества
• Центр уведомлений

Статья: https://apptractor.ru/info/articles/ot-dashbordov-k-bolee-glubokomu-ponimaniyu-prilozheniy-obnovleniya-play-console.html
Платформа: Android
1
Swift Reduce: объединение элементов в одно значение

Метод Swift reduce позволяет получить одно объединенное значение из коллекции элементов. Вы можете использовать его для преобразования массива в словарь, а другой распространенный пример - суммирование чисел. Это введение должно пробудить ваш интерес к reduce.

Статья: https://apptractor.ru/info/articles/reduce.html
Платформа: iOS
😁2🫡1
Как Gojek в 3 раза ускорил iOS-сборки с помощью Bazel

Когда проект разрастается до сотни модулей, сборка становится болью. В Gojek она занимала до 35 минут на CI. Команда решила кардинально изменить подход — и перешла на Bazel, build-систему от Google.

Вот что у них получилось:

Сборка в CI: с 35 до 10–15 минут
Локальная сборка: всего 30–45 секунд
Плюс — стабильность, кэш, и меньше сюрпризов от Xcode

🧠 Путь был непростой:

• Постепенная миграция модулей
• Генерация BUILD-файлов
• Настройка удалённого кэша
• Переход на инкрементальную сборку

В итоге: меньше времени на ожидание — больше времени на разработку.

Статья: https://medium.com/gojekengineering/gojeks-journey-to-3x-faster-ios-builds-with-bazel-90fbe3f22f81
Платформа: iOS
👏: 56

👍 если хотите русский перевод
🔥2
runCatching против try-catch в Kotlin — кто кого?

Если ты пишешь на Kotlin, то наверняка задавался вопросом: стоит ли переходить с классического try-catch на модный runCatching?

Полный разбор с примерами в этой статье.

Статья: https://proandroiddev.com/runcatching-vs-try-catch-in-kotlin-a-comprehensive-error-handling-comparison-e2f7611f0dc1
Платформа: Android
👏: 61

👍 если хотите русский перевод
🤔2🔥1
☕️Стажировка на SDET android в Kaspersky

Открыт набор на оплачиваемую стажировку SafeBoard — прямо сейчас мы ищем SDET Android и iOS developer’ов. Возможно, это именно тот шанс, которого ты ждал, чтобы стартовать в IT!

Тебя ждет работа над реальными проектами в крутой команде, зарплата, компенсация питания, а также спортзал в офисе, сауна, игровые комнаты, кофейные паузы и многое другое 😇

Присоединяйся, если ты учишься в вузе в Москве/МО на любом курсе, кроме выпускного, или в Школе 21 и сможешь работать от 20 часов в неделю.

Переходи на следующий уровень, регистрируйся https://kas.pr/z7er?erid=2W5zFGRfhaQ

Реклама. Рекламодатель АО «Лаборатория Касперского» ИНН 7713140469
Simple String Resources Obfuscation - проект демонстрирует простой метод обфускации константных строк в коде модулей Android (приложений, библиотек). Подход основан на создании сгенерированного набора исходных текстов obfuscate с модифицированным кодом, полученным из набора исходных текстов develop, который предназначен для обычной разработки. Различные модификации кода для исходного набора obfuscate обрабатываются с помощью скриптов Gradle. В этом случае шифруются строковые ресурсы в формате <string ...>...</string>. Элементы, которые не должны шифроваться скриптами, могут быть помечены атрибутом skip: <string skip=«true» ...>...</string>.

Simple String Resources Obfuscation на GitHub: https://github.com/theredsunrise/SimpleStringResourcesObfuscation
Платформа: Android
⭐️: 4
1
Тестирование Android-приложений в масштабе Netflix

В статье рассказывается о том, как команда Netflix тестирует своё Android-приложение, насчитывающее более миллиона строк кода и поддерживающее более 400 модулей.​

Ключевые моменты статьи:

• Эволюция приложения: Изначально приложение было гибридным (native + WebView), но из-за проблем с производительностью и сложности создания нативного интерфейса было полностью переписано на нативный код. Сейчас команда постепенно переводит приложение на Jetpack Compose.​
• Структура команды: Ранее существовала отдельная команда SDET (Software Developer Engineer in Test), которая занималась написанием автоматических тестов. Сейчас ответственность за тестирование распределена между командами разработчиков, при этом два SDET-инженера продолжают поддерживать команды при необходимости.​
• Многообразие устройств: Приложение поддерживает широкий спектр устройств, включая устройства с низкой производительностью (например, Android Go) и складные смартфоны. Это требует обширного тестирования на физических устройствах.​
• Тестовая пирамида: Хотя идеальная структура тестирования представляет собой пирамиду (юнит-тесты в основании, затем интеграционные и UI-тесты), в реальности структура напоминает песочные часы из-за зависимости от тестирования на физических устройствах и наличия устаревшего кода.​
• Инструменты для тестирования: Для юнит-тестирования используются такие инструменты, как Strikt (для промисов), Turbine (для тестирования Kotlin Flows), Mockito (для создания моков), Hilt (для внедрения зависимостей) и Robolectric (для тестирования бизнес-логики, взаимодействующей с Android).​

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

Статья: https://apptractor.ru/info/articles/testirovanie-android-prilozheniy-v-masshtabe-netflix.html
Платформа: Android/тестирование
1