Антоха Разраб c AI – Telegram
Антоха Разраб c AI
129 subscribers
30 photos
2 videos
42 links
Делаю продукты в соло с помощью AI. На работе Sr. Android Engineer

Канал БЕЗ рекламы
Download Telegram
https://proandroiddev.com/scenario-based-testing-viewmodels-bdbd4e58e5ba


Представленный текст обсуждает концепцию сценариев тестирования для ViewModels в разработке приложений для Android. Основной проблемой, которая рассматривается, является сложность обеспечения качества путем увеличения охвата кода при тестировании ViewModels из-за их более широкого объема по сравнению с более мелкими компонентами, такими как репозитории и сценарии использования. Упоминается общая ловушка – тестирование кода вместо намеренного поведения ViewModel.

Для решения этой проблемы предлагается изменить подход к тестированию на основе сценариев пользователей, сделав тесты более всесторонними. Этот концепт широко используется в UI- и интеграционном тестировании, но представляет собой вызов при юнит-тестировании из-за отсутствия слоя пользовательского интерфейса. Для преодоления этого вводится имитация UI-слоя для симуляции действий пользователя.

Реализация включает создание ProxyUI для имитации поведения пользовательского интерфейса и симуляции действий пользователя. Тестовые случаи состоят из действий пользователей, и каждый юнит-тест имеет три неотъемлемые фазы: создание тестируемого блока, выполнение действий пользователя с использованием ProxyUI и проверка результатов.

Применение сценариев тестирования направлено на улучшение читаемости тестов для широкой аудитории, обеспечение качества тестов через четкое слоение и, в конечном итоге, повышение общего качества разработанных приложений.
https://proandroiddev.com/kotlin-design-patterns-proxy-explained-14b7b0afb8fb
Kotlin Design Patterns: Proxy Explained: В этой статье рассматривается шаблон проектирования Proxy, выделяя его цель, реализацию и преимущества. Демонстрируется, как управлять жизненным циклом RealSubject, расширять его функциональность и соблюдать принцип открытости/закрытости.
Структурные шаблоны проектирования: Статья обсуждает роль шаблона Proxy в контексте структурных шаблонов проектирования, подчеркивая его способность добавлять дополнительную логику и управлять жизненным циклом базовых объектов.
Пример: Безопасное чат-приложение: Статья предоставляет конкретный пример применения шаблона Proxy в сценарии чат-приложения, иллюстрируя, как шифровать и дешифровать сообщения для улучшения безопасности.
Сравнение с шаблоном Декоратор: Статья различает шаблон Proxy от шаблона Декоратор, отмечая, что Proxy обрабатывает управление жизненным циклом независимо, в то время как Декоратор зависит от контроля клиента для композиции объектов и жизненных циклов.
Рекомендуемая литература: Kotlin Design Patterns and Best Practices: Рекомендация книги для дальнейшего изучения шаблонов проектирования и лучших практик Kotlin, включая такие темы, как параллельное программирование, микросервисы и функциональное программирование.
https://lucasoshiro.github.io/posts-en/2023-02-13-git-debug/
Git в качестве инструмента отладки: Git может служить ценным ресурсом для отладки благодаря его способности хранить всю историю каждого файла в репозитории.
Понимание основ Git: Для эффективного использования Git для отладки необходимо понимать основы, такие как Коммиты, Ветви, История Коммитов, Область подготовки и Рабочий Каталог.
Использование git ls-files и Pathspecs: Путем использования git ls-files вместе с Pathspecs разработчики могут эффективно фильтровать и находить определенные файлы в репозитории, обеспечивая целенаправленные поиски и операции.
Использование git grep: git grep предлагает расширенную функциональность по сравнению с традиционными инструментами grep, позволяя проводить комплексные поиски по всему репозиторию и обеспечивая улучшенную производительность и опции форматирования вывода.
Исследование возможностей продвинутого Git Log: Помимо базового использования, Git Log предоставляет дополнительные функции, такие как ограничение вывода по конкретным путям, отображение патчей и идентификация коммитов, связанных с введением или удалением строк, улучшая его полезность для задач отладки.
https://habr.com/ru/companies/magnit/articles/803565/
Статья посвящена автоматизации процесса генерации токенов дизайн-системы для Android приложений на основе данных из Figma API. Автор статьи Никита Яцкивский, главный разработчик мобильной платформы в компании «Магнит», делится своим опытом по созданию собственного генератора токенов, чтобы обеспечить консистентность и синхронизацию токенов с дизайном, а также экономить время разработчика на обновлении токенов.
Причины, по которым было решено создать собственный генератор токенов:
Необходимость поддержания консистентности и синхронизации токенов с дизайном;
Снижение вероятности ошибок из-за человеческого фактора;
Экономия времени разработчика на обновлении токенов.
Автор также рассматривает существующие решения для автоматизации процесса работы с токенами, такие как Style Dictionary от Amazon, FigmaGen от Headhunter и FigmaExport от RedMadRobot, но находит их недостатки в том, что они являются 3rd party библиотеками, которые сложно приспособить к особенностям продукта.
В итоге было решено разработать собственный генератор токенов на основе Gradle Convention Plugin с языком Kotlin, Retrofit 2 для сетевых запросов, Moshi для сериализации, Kotlin Poet и org.w3c.dom для генерации кода, а также Echonoscript, Scrimage и класс Svg2Vector из Android SDK для генерации изображений.
https://proandroiddev.com/android-proto-datastore-should-you-use-it-36ae997d00f2
https://proandroiddev.com/testing-proto-datastore-63580efbf5fc
Proto DataStore - это замена SharedPreferences, позволяющая сохранять объекты и обеспечивающая типовую безопасность.
Тестирование Proto DataStore плохо документировано, и руководство по тестированию Preferences DataStore имеет ограниченное сходство.
Для тестирования Proto DataStore необходимо создать экземпляр с использованием DataStoreFactory.create, передавая класс сериализатора и лямбда-метод для создания файла.
Тестирование включает создание потока для Proto DataStore, использование класса репозитория для взаимодействия с ним и проверку ожидаемых результатов.
При тестировании нескольких тестов может возникнуть проблема утечки DataStore, которую можно решить, удалив и создав DataStore для каждого тестового случая.
Proto DataStore использует Protocol Buffers для сериализации структурированных данных, которые являются независимыми от языка и обеспечивают механизм определения типов данных.
Для использования Proto DataStore добавьте необходимые зависимости, создайте каталог proto, определите файл .proto и постройте проект для генерации классов данных.
После определения объектов данных создайте класс сериализатора, чтобы сообщить DataStore, как читать/писать объекты.
Создайте экземпляр DataStore, используя делегата свойств, который требует имя файла и класс сериализатора.
Взаимодействуйте с DataStore, используя Flow, который предоставляет доступ к свойствам, определенным в DataStore.

Интересные моменты:
Proto DataStore позволяет сохранять объекты, обеспечивая типовую безопасность, в отличие от SharedPreferences.
Руководство по тестированию Proto DataStore неполное, а руководство по тестированию Preferences DataStore имеет ограниченное сходство.
Удаление и повторное создание DataStore для каждого тестового случая разрешает проблему утечки DataStore во время тестирования.
Protocol Buffers являются независимыми от языка и предоставляют механизм определения типов данных.
https://swarm.ptsecurity.com/android-jetpack-navigation-deep-links-handling-exploitation/

Проверьте, является ли ваше приложение уязвимым для проблемы обработки глубоких ссылок в Android Jetpack Navigation: Если ваше приложение использует Android Jetpack Navigation и имеет экспортируемые активности, оно может быть уязвимым для проблемы обработки глубоких ссылок. Протестируйте ваше приложение, создав стороннее приложение, которое отправляет намерение глубокой ссылки на экспортируемую активность вашего приложения, пытаясь открыть определенный фрагмент.

Обновите до последней версии Android Jetpack Navigation: Google признал проблему и рекомендует следовать странице Условная навигация, чтобы гарантировать, что экраны, требующие входа в систему, условно перенаправляют пользователей на эти экраны при достижении через глубокую ссылку. Убедитесь, что вы используете последнюю версию библиотеки Android Jetpack Navigation.

Реализуйте безопасную обработку глубоких ссылок: Реализуйте безопасную обработку глубоких ссылок, следуя рекомендациям страницы Условная навигация. Это гарантирует, что только авторизованные пользователи могут получить доступ к определенным фрагментам через глубокие ссылки.

Рассмотрите использование Proto DataStore для хранения данных: Proto DataStore - это замена SharedPreferences, которая позволяет сохранять объекты, обеспечивая типовую безопасность. Если вы разрабатываете новое приложение или рассматриваете обновление вашего механизма хранения данных, Proto DataStore - хороший выбор.

Протестируйте Proto DataStore в вашем приложении: Если вы решите использовать Proto DataStore, убедитесь, что проведете его тщательное тестирование. Существует ограниченное руководство по тестированию Proto DataStore, поэтому вам может потребоваться экспериментировать с различными подходами к тестированию.

Будьте осторожны при использовании глубоких ссылок: Глубокие ссылки могут быть эксплуатированы, поэтому всегда следуйте bewst practices для безопасной обработки глубоких ссылок. Это включает в себя проверку намерения, проверку авторизации пользователя и гарантию, что через глубокие ссылки могут быть открыты только авторизованные фрагменты.
Android 15 Beta!

Семимильными шагами гугл готовится к Google I/O

👉 Edge2Edge скролл. Красиво, но мы знаем сколько боль приносит работа с toolbar и appbar. Чего нам ждать тут? Убирают привычным нам хак setDecorFitsSystemWindows
👉 Улучшение работы с NFC
👉 Автоархивирование приложений, анонсировано было ранее
👉 Улучшенный профайлинг
👉 Поддержка людей с ограниченными возможностями
👉 Сквозное шифрование
👉 Защищенное фоновые процессы
👉 Начало стабилизации релиза
"Повышение производительности вашего приложения за счет кэширования API-запросов с использованием OkHttp":
Реализация кэширования с OkHttp: Кэширование API-запросов с использованием класса CacheControl из OkHttp помогает улучшить производительность приложения. Этот метод позволяет сохранять ответы API с заданным сроком годности, уменьшая количество API-запросов и снижая время отклика.
Определение правил кэширования: Правила кэширования могут быть установлены в зависимости от статуса интернет-соединения. Например, когда соединение активное, можно использовать кэшированные ответы за последние 30 минут, а в режиме офлайн — ответы, возраст которых составляет до 1 дня, для улучшения пользовательского опыта.
Использование перехватчиков для кэширования: Механизм перехватчиков из OkHttp позволяет модифицировать HTTP-запросы и ответы, что способствует реализации правил кэширования. Функции, такие как maxAge() и maxStale(), контролируют свежесть ответов, помогая эффективно управлять кэшем.
Проблемы с традиционным подходом

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

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

Hilt: Популярный фреймворк внедрения зависимостей для Android, который можно использовать с Jetpack Compose.
Koin: Легковесный фреймворк внедрения зависимостей, который поддерживает Jetpack Compose и мультиплатформенную разработку.
Ручное внедрение зависимостей: Может быть реализовано вручную, но требует больше шаблонного кода и может быть подвержено ошибкам.
Наилучшие практики

Используйте фреймворк внедрения зависимостей для управления зависимостями между компонуемыми элементами.
Держите компонуемые элементы слабо связанными и сосредоточенными на своих конкретных задачах.
Используйте подъем состояния для управления состоянием приложения на более высоких уровнях пользовательского интерфейса или вне его пределов.
https://medium.com/androiddevelopers/navigation-compose-meet-type-safety-e081fb3cf2f8

1. Navigation Compose предлагает новый способ навигации между компонуемыми элементами в приложении Jetpack Compose: API Navigation Compose позволяет разработчикам перемещаться между компонуемыми элементами в Compose-приложении, используя компонент Jetpack Navigation. Этот новый подход заменяет традиционную навигацию на основе XML более функциональным стилем программирования, используя функции composable() для объявления направлений и navController для навигации между ними.

2. Безопасность типов — ключевой вопрос в Navigation Compose: В отличие от оригинального компонента Navigation, Navigation Compose не поддерживает плагин Safe Args для генерации кода, который обеспечивал безопасность типов для аргументов навигации. Вместо этого разработчикам необходимо структурировать свой код для обеспечения безопасности типов во время выполнения, используя такие техники, как обертки направлений в закрытых классах и создание типобезопасных оберток для извлечения аргументов из SavedStateHandle.

3. Наилучшие практики для Navigation Compose включают инкапсуляцию логики навигации и использование типобезопасных расширений: Чтобы достичь безопасности типов и избежать сбоев, разработчикам следует инкапсулировать логику навигации в отдельных файлах, открывать расширения NavController для безопасной навигации и использовать типобезопасные обертки для извлечения аргументов. Этот подход помогает убедиться, что аргументы имеют правильный тип и все необходимые аргументы присутствуют, делая навигацию более надежной и устойчивой.
👎1
https://proandroiddev.com/whats-native-c8d84ccda667

Статья обсуждает концепцию "native" в контексте мобильной разработки, особенно в экосистемах Android и iOS. Автор аргументирует, что определение "native" стало сложным и тонким с появлением кроссплатформенных технологий.

Исторически "native" относилось к приложениям, разработанным с использованием языков, специфичных для платформы, таких как Java для Android и Objective-C для iOS. Однако с появлением дизайн-систем, таких как Material Design для Android и плоского дизайна для iOS, акцент сместился с технической реализации на пользовательский опыт и интерфейс.

Автор предлагает, что дизайн-системы и пользовательский опыт не определяют, является ли приложение native или нативным. Вместо этого термин "native" зависит от контекста платформы, для которой оно предназначено. Например, JavaScript считается нативным в веб-разработке, потому что это основной язык взаимодействия с веб-браузерами.

Современные мобильные фреймворки, такие как React Native и Flutter, созданы для помощи разработчикам в создании приложений для мобильных платформ, но они не соответствуют техническим критериям для нативной функциональности. Они работают в своих изолированных средах, требуя промежуточных слоев или переводов для взаимодействия с системой, что может привести к избыточности и неэффективности.

В отличие от этого, Kotlin выделяется как нативный язык благодаря своей архитектуре компилятора, позволяющей прямое взаимодействие с Java, Swift, JavaScript и WebAssembly. Встроенная интероперабельность Kotlin устраняет необходимость в промежуточном слое или виртуальной машине, позволяя ему без проблем обмениваться объектами между платформами и генерировать нативный код для каждой целевой платформы.

Статья заключает, что концепция "native" относительна и зависит от контекста платформы, для которой она предназначена. В то время как дизайн-системы и пользовательский опыт важны, они не определяют, что означает быть нативным. Вместо этого способность к обмену памятью и стеком вызовов с базовой системой является ключевым критерием для нативной функциональности, и Kotlin соответствует этому критерию.
👍1
Понимание порядка модификаторов:
Модификаторы применяются в порядке "с конца к началу" и "изнутри наружу".
Чем выше по цепочке находится модификатор, тем позже он будет применён.
Последний применяемый модификатор — это модификатор, который стоит самым первым в цепочке для компонентов, так как кастомизация, поступающая извне, должна быть применена вокруг того, что компонент уже содержит.
Параметр modifier:
Хорошо написанные функции UI-компонентов с аннотацией @Composable должны принимать параметр modifier: Modifier, который по умолчанию равен Modifier (пустая реализация).
Этот модификатор применяется к корневому узлу компонента, и дополнительные модификаторы могут быть присоединены после него.
Визуализация порядка модификаторов:
При добавлении отступов или границы к компоненту логично применять их вокруг компонента.
Этот визуальный подход помогает понять, что модификаторы применяются "с конца к началу" и "изнутри наружу".
Пример кода:
В статье приводятся примеры правильного использования модификаторов, демонстрируя, как связывать модификаторы и как они применяются в правильном порядке.
Общий вывод:
Статья направлена на упрощение понимания порядка модификаторов в Jetpack Compose, используя визуальный и интуитивный подход.
https://zsmb.co/remembering-modifier-order/
👍2
Делай проще, сложнее не делай

Преимущества Feature Gates: Они обеспечивают согласованные графики выпуска, позволяют проводить A/B-тестирование и помогают снизить риски во время развертывания новых функций.
Временный характер: Feature Gates требуют сосуществования старых и новых версий кода, что требует плановых очисток, чтобы избежать долгосрочных обязательств кодовой базы.
Проблемы с удалением: Встроенные условные операторы (if/else) для feature gates могут усложнить усилия по очистке.
Упрощение очистки: Использование интерфейсов и модулей Dagger может изолировать код, специфичный для функций, что упрощает будущие удаления.
Общий принцип: Упрощение задач увеличивает вероятность их завершения, подчеркивая важность упрощения процессов в целом.