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

SoundRemote на GitHub: https://github.com/SoundRemote/client-android
Платформа: Android
⭐️: 70
👍1
📺 Видео и подкасты за неделю на @AppFiles

(iOS Ru) Работа в Booking, жизнь в Амстердаме, автогонки в Европе
(iOS Ru) Многопоточность с нуля на примере пиццы
(iOS En) SwiftUI Inline Toasts - Xcode 16
(iOS En) Special Effects with SwiftUI Text
(iOS En) Mastering SwiftUI Transitions – Custom & Built-in Animations
(iOS En) Build a Custom Location Picker in SwiftUI: Search & Map Interactions
(iOS En) SwiftUI - Auto / Manual Scrolling Infinite Carousel in 4 Minutes - Xcode 16
(And Ru) Разработка SDK
(And Ru) Прожарка на код-ревью от Яндекса
(And Ru) Алиса, открой багажник!
(And Ru) Зачем нужен виртуальный дисплей в Android
(And En) Developing for the SDK Runtime
(And En) Now in Android: 115 - Gemini in Android Studio, Enhancing Safety and Security, and more
(And En) The 3 Biggest Coding Mistakes I Made In My Android Projects
(And En) Full Guide to Testing APIs on Android & KMP With Ktor MockEngine
(And En) How Junie Helps You Code Faster with Kotlin in IntelliJ IDEA
(And En) Double Dispatch: Prelude to the Visitor Pattern
(And En) What if your IDE could talk back... and help? Junie by JetBrains is here.
(And En) Why did my build fail? Using AI to troubleshoot faster with Failure Summaries
(Dev Ru) Разработчик и стартап: работать - основать - избегать?
(Dev Ru) Чего боится твой тимлид?
(Dev Ru) Как прогнозируют погоду в 2025 году — ML, Fortran и Big Data
(Dev En) How to Embed HTML5 Games in Apps & Grow App Revenue
(Dev En) Code Your Own Llama 4 LLM from Scratch – Full Course
(Dev En) Essential Machine Learning and AI Concepts Animated

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

(iOS Ru) Организация и поддержка нативных UI-тестов в iOS
(And Ru) Находим и увольняем low-перформеров
(Dev Ru) Как проходит архитектурная секция в команду мобильной разработки Яндекс 360 (+ все собеседования)
(Dev Ru) Настройка CI/CD
Please open Telegram to view this post
VIEW IN TELEGRAM
Как Dropbox масштабирует тестирование Android-приложения, сохраняя доверие пользователей

Статья от команды Android-разработчиков Dropbox подробно описывает, как компания трансформировала свою стратегию тестирования, чтобы обеспечить высокое качество и надежность своего приложения при масштабировании.​

Эволюция стратегии тестирования

Изначально Dropbox полагался на обширные End-to-End (E2E) тесты, которые симулировали поведение пользователей. Однако со временем эти тесты стали громоздкими и ненадежными, особенно после перехода на модульную архитектуру. Это привело к замедлению обратной связи и снижению доверия к результатам тестов.​

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

Инструменты и подходы


• Модульность: Переход на модульную архитектуру позволил изолировать компоненты и упростить тестирование.
• Инструменты тестирования: Использование современных библиотек, таких как Espresso и Robolectric, улучшило качество юнит-тестов.
• CI/CD: Интеграция с Firebase Test Lab и использование Flank для параллельного выполнения тестов ускорили процесс тестирования.
• Анализ покрытия: Переход от кастомных решений к стандартным инструментам, таким как Jacoco, повысил надежность анализа покрытия кода.​

📈 Результаты

Благодаря этим изменениям, Dropbox сократила среднее время выполнения CI-пайплайна с 75 до 25 минут, улучшив производительность и стабильность приложения.​

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

Статья: https://medium.com/androiddevelopers/how-dropbox-leverages-testing-to-maintain-high-level-of-trust-at-scale-b7b1bdf6161e
Платформа: Android/тестирование
2
Если бы CoreData порвала с legacy, приняла современный Swift и вышла замуж за GraphQL - вы бы получили SwiftletModel.

SwiftletModel - это то, чем вы хотели бы видеть SwiftData, если бы она была переосмыслена с нуля. Библиотека дает вам мощь управления графами на уровне CoreData с простыми Swift-структурами, скоростью работы в памяти и нулевым шаблонным кодом.

SwiftletModel не является традиционным ORM или слоем базы данных. Она не абстрагирует SQL и не управляет дисковой персистентностью. Это безопасный с точки зрения типов, нормализованный, in-memory движок графовой модели - место для объединения, формирования и управления данными о бизнес-субъектах из различных источников без особых усилий.

SwiftletModel отлично подходит для следующих сценариев:

• Сложные доменные модели: Идеально подходит для приложений со сложными доменными моделями, содержащими множество взаимосвязанных типов сущностей.
• Легкое локальное хранилище: Подходит для тех случаев, когда вы хотите избежать накладных расходов на разработку постоянных хранилищ, таких как CoreData, SwiftData, Realm или SQLite.
• Приложения, ориентированные на бэкенд: Идеально подходит для приложений, в которых бэкенд является основным источником истины и нет необходимости в полноценной локальной базе данных.
• Множество источников данных: Настоящее обезболивающее для приложений, которые управляют и объединяют данные из нескольких источников - API бэкенда, локальных файлов, облачных сервисов, HealthKit, Location и т.д. - в единый, типобезопасный in-memory граф.

Несмотря на то, что модели данных SwiftletModel работают преимущественно в памяти, они представляют собой простые Codable-структуры, что позволяет легко интегрировать их с любыми решениями для хранения данных: плоскими файлами, CRDTs, GRDB, CoreData/SwiftData, SQLite, iCloudKit, Firebase, API бэкэндов и т. д.

SwiftletModel на GitHub: https://github.com/KazaiMazai/SwiftletModel
Платформа: iOS
⭐️: 54
👍2
Как запустить локальную LLM (AI) в Android Studio

Если вы мобильный разработчик и следите за AI-трендами, наверняка задумывались о том, как интегрировать языковые модели (LLM) в свои приложения прямо из Android Studio. В этой статье я расскажу, как это можно сделать быстро и просто, не полагаясь на внешние API и облачные решения.

Статья: https://habr.com/ru/articles/904648/
Платформа: Android
1
Offline First в мобильных приложениях. CRUD на стороне клиента

Надеюсь, эта статья поможет оценить объем работы и предугадать, какие подводные камни ожидают вас при реализации поддержки offline first в ваших приложениях :)

Статья: https://habr.com/ru/companies/friflex/articles/904448/
Платформа: разработка
1
SharingGRDB: быстрая, легкая замена SwiftData

Компания Point-Free выпустила значительное обновление библиотеки SharingGRDB, которая предлагает быструю, эргономичную и легкую замену SwiftData, работающую на базе SQL. Она предоставляет API, аналогичные @Model, @Query и #Predicate, но настроена на прямой доступ к базовой базе данных (то, от чего абстрагируется SwiftData), что дает вам больше возможностей, больше гибкости и больше производительности при сохранении и получении данных в приложении.

Статья: https://apptractor.ru/info/articles/sharinggrdb.html
Платформа: iOS
Cколько раз ваши представления SwiftUI перерисовываются: узнаем с помощью Инструментов

Если вы столкнулись с проблемой производительности SwiftUI-приложения, причина может заключаться в слишком частой перерисовке представлений. Apple предоставляет инструменты, которые позволяют увидеть, сколько раз SwiftUI перерисовывает представления, а также свойства представлений, которые вызывают перерисовку. В этой статье мы расскажем, как использовать эти инструменты.

Статья: https://apptractor.ru/info/articles/ckolko-raz-vashi-predstavleniya-swiftui-pererisovyvayutsya-uznaem-s-pomoschyu-instrumentov.html
Платформа: iOS
Android Gif Search - LazyVerticalGrid с картинками на MVVM с использованием Dagger 2 + Hilt с Retrofit 2, Moshi, Kotlin Coroutines, JUnit, Espresso и Robolectric тестами.

Gif Search на GitHub: https://github.com/jaredsburrows/android-gif-search
Платформа: Android
⭐️: 406
This media is not supported in your browser
VIEW IN TELEGRAM
Как одна строчка кода может сломать ваш iPhone

Еще в середине 2024 года автор в iOS нашел уязвимость, которая может навсегда (до восстановления из бэкапа) брикнуть устройство.

Дело в том, что процессы в ОС могут обмениваться уведомлениями Darwin, это низкоуровневый механизм для простого обмена данными в операционных системах Apple. При этом они:

• Не требуют особых привилегий для получения
• Не требуют специальных привилегий для отправки
• Доступны как общедоступный API
• Не имеют механизма проверки отправителя

И именно такие сообщения использовались для работы ключевых системных процессов, вроде входа и выхода устройства из «режима потери» Find My или запуска режима «идет восстановление».

notify_post(«com.apple.MobileSync.BackupAgent.RestoreStarted»)


Последний и послужил отличным "отказом в обслуживании", поскольку операция неизбежно завершалась неудачей после тайм-аута, ведь устройство фактически не восстанавливалось, и единственным средством решения этой проблемы было нажатие кнопки «Restart», что приводило к перезагрузке устройства.

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

Итого - 9 месяцев на исправление в iOS 18.3 (теперь уведомления принимаются только от системных процессов) и $17,500 за найденную ошибку.

Статья: https://apptractor.ru/info/articles/kak-odna-strochka-koda-mozhet-slomat-vash-iphone.html
Платформа: iOS
🙈2
Руководство по потреблению памяти Android Studio

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

1. Включите индикатор памяти и настройте размер кучи IDE
2. Оптимизируйте настройку демона Gradle для сборок
3. Включите параллельные сборки проектов
4. Используйте автономный режим Gradle и кэш сборки
5. Управляйте использованием памяти эмулятора Android (или используйте физическое устройство)
6. Отключите неиспользуемые плагины и функции в Android Studio

Статья: https://apptractor.ru/info/articles/rukovodstvo-po-potrebleniyu-pamyati-android-studio.html
Платформа: Android
1👍1
SSZipArchive - простая библиотека для архивации и разархивации файлов на iOS, macOS, tvOS, watchOS и visionOS. Умеет распаковывать zip-файлы, в том числе защищенные паролем или зашифрованных AES, создавать архивы такие же архивы - с паролями и шифрованием (в том числе и прямо из NSData).

SSZipArchive на GitHub: https://github.com/ZipArchive/ZipArchive
Платформа: iOS
⭐️: 5.5K
Стиль программирования в крупномасштабных кодовых базах - на примере SwiftUI

Как поддерживать чистоту и единообразие кода в больших проектах на SwiftUI? Команда Fiverr делится своим подходом в статье на Medium. Они рассказывают, как создавали и внедряли гайд по стилю кодирования, который помогает масштабировать кодовую базу и облегчает командную разработку.

В статье подробно разбирается, почему важно придерживаться единой структуры файлов, как правильно использовать // MARK: для навигации, и почему архитектурная последовательность вроде MVVM становится критичной при росте проекта. Также затрагиваются вопросы форматирования кода, модульности и повторного использования компонентов — всё ради того, чтобы в любой момент новый разработчик мог быстро погрузиться в проект без хаоса и лишних вопросов.

Эта статья — отличный пример того, как инженерная культура напрямую влияет на качество продукта.

Статья: https://medium.com/fiverr-engineering/mastering-coding-style-guides-for-large-scale-codebases-with-a-swiftui-case-study-29619450bc79
Платформа: iOS
👏: 617
👍1
Линтер уходит: ускорение сборки APK-файлов для Android

Автор делится опытом оптимизации сборки APK-файлов в Android-проектах. Он обнаружил, что задача lintVitalAnalyzeRelease, выполняемая по умолчанию при сборке релизных APK, может занимать значительное время, особенно в проектах с множеством модулей.​

Используя Gradle Build Scan, он проанализировал временные затраты на различные задачи сборки и выяснил, что отключение выполнения lint-задач в CI-среде может существенно сократить общее время сборки. Это особенно актуально для автоматизированных систем сборки, где каждый запуск происходит в чистом окружении, и кэширование Gradle не используется.​

Если вы не используете отчеты lint в своих CI-процессах, рассмотрите возможность их отключения, чтобы ускорить сборку и сэкономить ресурсы. Однако помните, что lint-проверки важны для обеспечения качества кода, поэтому полностью отказываться от них не рекомендуется.

Статья: https://proandroiddev.com/lint-be-gone-speed-up-your-android-release-apk-builds-aafb7cf430a7
Платформа: Android
👏: 83
Реактивное управление состоянием в Compose - MVI архитектура

​В статье рассматривается применение архитектурного паттерна MVI (Model-View-Intent) в Jetpack Compose для управления состоянием пользовательского интерфейса.​

MVI предлагает четкую структуру с односторонним потоком данных: пользовательские действия (Intents) обрабатываются ViewModel, которая обновляет Model, а изменения в Model автоматически отражаются в View. Это обеспечивает предсказуемость и упрощает отладку.​

В Jetpack Compose реактивность реализуется с помощью StateFlow. ViewModel содержит MutableStateFlow, представляющий текущее состояние UI. View подписывается на StateFlow и автоматически обновляется при изменении состояния, без необходимости вручную вызывать методы обновления.​

Интенты реализуются как функции в ViewModel, которые изменяют состояние. Это упрощает архитектуру и делает код более читаемым.​

Таким образом, MVI в сочетании с Jetpack Compose и StateFlow позволяет создавать масштабируемые, тестируемые и легко поддерживаемые приложения с четким разделением ответственности между компонентами.

Статья: https://proandroiddev.com/reactive-state-management-in-compose-mvi-architecture-71546c9f1b52
Платформа: Android
👏: 103
Мастерство фокусов на Compose

Среди прочего у нас есть приложение для Android TV. Работая над ним, я столкнулся с тем, что система фокусов в Jetpack Compose устроена сложнее, чем кажется на первый взгляд. Поскольку для ТВ-приложений и устройств без сенсорного управления работа с фокусом играет ключевую роль в навигации, мне понадобилось детально разобраться в теме. Результатами делюсь в статье.

Статья: https://habr.com/ru/companies/habr_rutube/articles/902310/
Платформа: Android
Почему ваше приложение SwiftUI работает медленнее, чем вы думаете

В статье автор делится опытом оптимизации производительности приложений на SwiftUI, основываясь на реальных примерах и анализе с помощью инструмента Instruments.​

Автор начинает с демонстрации проблем, возникающих при использовании избыточных модификаторов и неэффективного управления состоянием в SwiftUI. На примере списка туров группы Metallica он показывает, как чрезмерное количество модификаторов и неправильное использование @State могут привести к значительным просадкам FPS при прокрутке списка.​

Используя Instruments, он выявляет, что каждый элемент списка пересоздается и перерисовывается при каждом изменении состояния, что приводит к снижению производительности. Он предлагает решение: вынести каждый элемент списка в отдельный компонент TourDateRow, который реализует протокол Equatable. Это позволяет SwiftUI эффективно отслеживать изменения и избегать ненужных перерисовок.​

Кроме того, автор подчеркивает важность правильного использования property wrappers. Он рекомендует использовать @State для локального состояния, @ObservedObject и @EnvironmentObject для совместного использования состояния между представлениями, а @StateObject для объектов, которые должны сохраняться на протяжении всего жизненного цикла представления.​

Также обращается внимание на оптимизацию анимаций. Советуют ограничивать область применения анимаций, контролировать их продолжительность и избегать ненужных анимаций, которые могут привести к снижению производительности.​

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

Статья: https://medium.com/@wesleymatlock/why-your-swiftui-app-is-slower-than-you-think-c3e9bb46174b
Платформа: iOS
👏: 130
Night Clock - минимальные, не отвлекающие от работы часы, которые сохраняют экран постоянно включенным. Идеальное решение для прикроватной тумбочки или рабочего стола. Простые, чистые, созданные для того, чтобы светить всю ночь, не обжигая глаза.

Night Clock на GitHub: https://github.com/amitmerchant1990/night-clock
Платформа: Android
⭐️: 31
👍1
Prefire - библиотека для легкой автоматической генерации каталогов интерактивных компонентов (Playbook) и тестов с использованием Preview

Может использоваться для снепшот-тестирования и обнаружения UI регрессий, улучшения превью в SwiftUI состояниями и пользовательскими историями, работы в CI, вроде GitHub Actions, интеграции с Xcode и CLI-инструментами.

Prefire на GitHub: https://github.com/BarredEwe/Prefire
Платформа: iOS
⭐️: 346
🤡1
Что нового в Swift 6.2

Обновление включает множество улучшений, направленных на повышение удобства и безопасности разработки.

Одним из ключевых нововведений является улучшение поддержки параллелизма, что делает работу с асинхронным кодом более надёжной. Также были добавлены новые возможности в строковую интерполяцию, включая поддержку значений по умолчанию, что упрощает форматирование строк. Кроме того, метод enumerated() теперь соответствует протоколу Sequence, что расширяет его применение в различных сценариях.

Swift 6.2 также включает множество мелких, но полезных изменений, таких как добавление raw идентификаторов и улучшения в области безопасности типов. Эти обновления направлены на повышение стабильности и предсказуемости языка.

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

Статья: https://www.hackingwithswift.com/articles/277/whats-new-in-swift-6-2
Платформа: iOS
3
Как я создал плагин для решения самой раздражающей меня проблемы в KMP

В статье разработчик делится опытом создания плагина OpenInTools, призванного упростить работу с KMP проектами. Он столкнулся с проблемой постоянного переключения между различными средами разработки, такими как IntelliJ IDEA для общего кода, Xcode для iOS-компонентов и Cursor для шаблонного кода. Эти частые переключения отвлекали его от основной работы и снижали продуктивность.

Чтобы решить эту проблему, он разработал плагин OpenInTools для JetBrains IDE, который добавляет кнопки на панель инструментов, позволяя быстро открывать проекты в VS Code, Cursor и Xcode. Плагин автоматически определяет рабочие пространства Xcode и предоставляет их в выпадающем меню, избавляя от необходимости вручную искать нужные файлы. Он также предлагает возможность настройки путей для нестандартных конфигураций.

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

Статья: https://medium.com/@abd3lraouf/how-i-built-a-plugin-to-solve-my-most-annoying-kmm-dev-problem-91acf3ab2c60
Платформа: Android/кроссплатформа
👏: 53
👍2