Android Good Reads
3.62K subscribers
267 photos
12 videos
1.88K links
Самые интересные статьи, видео и новости, связанные с Android разработкой. Не больше трёх материалов в день.

Автор канала: @Lamprof

Размещение рекламы: @tatiana_2209
Download Telegram
Coil с поддержкой Compose Multiplatform

Вышла Alpha версия Coil 3.0.0 с поддержкой Compose Multiplatform! Wasm таргет будет работать, когда выйдет Ktor с его поддержкой.
Обновленный роадмап Kotlin

Команда Kotlin поделилась своими планами на ближайший год. Из самого интересного:

👉Прямой экспорт Kotlin в Swift
👉Поддержка Wasm Component model, что даст интероп с Wasm библиотеками, написанными на любом языке
👉Одинаковая схема инлайнинга для JVM и мультиплатформы
👉Поддержка SwiftPM
👉Поддержка Gradle project isolation
👉Релиз beta версии kotlinx-datetime

Я разобрал обновление роадмапа чуть подробнее у себя в Твиттере, так что можете подписываться!
Integrating Google Sign-In into Kotlin Multiplatform

Многие начинающие разработчики начинают писать приложение с кастомной авторизации (и часто на этом заканчиваются). Но вместо этого лучше взять какой-нибудь популярный способ, использовать готовый SDK и пойти дальше делать фичи.

Автор статьи берет для этого Compose + Kotlin Multiplatform, нативные библиотеки Google Sign-In для Android и iOS, собирает всё вместе в простой UI и приправляет сниппетами кода.

(За пост в канал спасибо @Phansier)
Android, Bluetooth and BLE the modern way: a complete guide

Каждый разработчик рано или поздно сталкивается с тем, что нужно сделать интеграцию через Bluetooth c каким-нибудь девайсом. Погружение в этот ад несовместимости и неотзывчивого API оставляет неизгладимое впечатление на всю жизнь. В статье разбираются основные отличия классического Bluetooth и BLE:

👉 BLE был создан как альтернатива, помогающая экономить заряд. (Привет носимые девайсы!)
👉 BLE и Bluetooth не совместимые стандарты
👉 В Android для работы с Bluetooth нужно держать 6 разрешений (для поддержки версий от Android 4.4)
👉 Данные хранятся в characteristics, откуда удобно можно тащить значения сенсоров девайса
👉 BLE медленный, не нагружайте его слишком частыми запросами
👉 Если во время тестирования что то сломалось - попробуйте выключить и включить Bluetooth программно.

(За пост в канал спасибо @Lamprof)
Mastering Lazy Lists in Jetpack Compose with Data Classes and MVI

Один из самых частых кейсов в разработке приложения - список с данными. Прибавьте к нему тягу к Compose, unidirectional data flow (UDF), архитектурам (aka MVI), и получите задачу, которую решает сегодняшняя статья.

Идеи Lazy Lists отличаются от RecyclerView и автор приводит связи между ними. И, хотя пример не использует библиотек для пагинации, он подойдет для понимания принципа построения простых списков на Compose с UDF-архитектурой.

(За пост в канал спасибо @Phansier)
Обновление Google Cast

Гугл каст существует с 2013 года, а мы получаем очередное мажорное обновление. Разработчикам онлайн-кинотеатров приготовиться!

👉 Output Switcher Больше контролов для управления потоком музыки или звука!
👉 Cast to devices nearby Теперь между гугловыми девайсами проще переключаться
👉 Cast from short-form video apps Поддержка трансляции коротких видео
👉 Persistent Cast icon Обновили SDK, теперь пользователи будут меньше теряться в приложениях, где есть поддержка хромкаст
👉 Shaka Player Новый плеер для гугл каст приемников
👉 Все больше поддерживаемых устройств

(За пост в канал спасибо @Lamprof)
Разбираем обновление Jetpack Compose 1.6

Compose обновился до версии 1.6, а за ним и Compose Multiplatform выпустил бета-релиз

💪 Увеличена производительность. Проблемы с производительностью списков постепенно решаются. Бенчмарки показывают 20% роста производительности при пролистывании и 12% ускорение времени запуска компонентов
💪 Улучшена работа с рекомпозицией. Преобразование remember во время компиляции в пользу производительности. Теперь ваши брейкпоинты в remember могут быть проигнорированы, если компилятор решит что remember тут не нужен
💪 Strong skipping mode. Экспериментальный режим, который обещает более предсказуемую работу с рекомпозицией для разработчиков
🖐 Поддержка нелинейного увеличения шрифта, а также удобная работа с отступами у текста
🖐 Поддержка Drag and drop. Полезно, когда ваше приложение запускают в сплит-скрине с другим

Пробежался по изменениям в альфа версиях сопутствующих библиотек:

👉 Теперь тесты для Compose не зависят от JUnit и могут быть запущены сразу для всех платформ!
👉 В версии 1.7 появится поддержка кликабельных ссылок внутри текста
👉 В следующей версии камеры добавят поддержку оверлея, что должно быть в разы быстрее и эффективнее, чем использование сторонней библиотеки
Динамическая иконка приложения в Android

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

👉 Добавляем activity-alias к основному activity с новой иконкой, столько сколько хотим вариантов иконок
👉 Используем PackageManager и переключаем setComponentEnabledSetting для необходимого activity-alias по его android:name
👉 Необходимо вернуть иконку пользователю? Обращаемся по основному activity, где находится стандартная иконка
👉 Можно независимо переключать иконки для пользователя благодаря BroadcastReceiver в любой момент времени
DIY: Твоя собственная библиотека для инъекции зависимостей

Лучший способ понять, какая библиотека для инъекции зависимостей вам нужна, — начать писать свою! Автор пишет DI-библиотеку и применяет ее на достаточно простом, но прикладном кейсе.

👉 Анти-паттерн. Если вы протаскиваете зависимость через десятки классов, только ради использования в последнем
👉 Автор изобретает заново шаг за шагом Google Guice, затем Dagger 1 и в конечном счете Dagger 2. Достаточно показательно, как приходили к существующим решениям в библиотеках
👉 Интересно было посмотреть, как генерируются factory-классы через KSP
👉 Красивая работа с аннотациями, которую можно рассматривать в отрыве от статьи

А что вы используете в проекте?
Оптимизация запуска приложения

Уже оптимизировали все запросы на старте приложения, а оно все равно долго запускается?

👉 Едим слона по частям и определяем корректные метрики для измерения старта приложения. Firebase в помощь
👉 Холодный/Горячий/Теплый старт - разделяем их и анализируем изменения по каждому отдельно
👉 Утаскиваем инициализацию тяжелых библиотек и content provider, не нужных на старте, на поздний этап с помощью Startup Library
👉 Генерируем Baseline Profiles, что приводит к небольшому приросту в 7 процентов
👉 Делаем дамп в профайлере, загружаем в Perfetto и ищем самые широкие столбцы - они отнимают больше всего времени
👉 Если в отображении много пропусков, добавляем trace в самые неочевидные для вас места
👉 Обращаем внимание на то, как рендерятся стартовые экраны. Возможно, стоит воспользоваться ViewStubs, чтобы предотвратить ненужные перетасовки лейаута?
👉 Для простых экранов LinearLayout немного быстрее, чем ConstraintLayout, если вы еще используете xml
Разбираем поддержку ресурсов в Compose Multiplatform

Недавнее обновление библиотеки Compose принесло улучшенную работу с ресурсами. Разбираемся, что и как!

👉 После обновления зависимостей в папке commonMain создаем composeResources
👉 По аналогии с ресурсами в Android создаем папки для ресурсов: drawable, font, values
👉Обращение к ресурсам аналогично R классу в Android:
Res.drawable.icon_one

👉 У новых ресурсов есть поддержка языков, по аналогии с ресурсами в нативном Android. То есть values-es является рабочим вариантом для локализации KMP приложения на испанский

Не забываем что это альфа релиз, ложка дегтя:
😡 Проблемы с плагином, исправлено в 1.6.0-dev1405
🤔 .ttf шрифты не работают, конвертируйте в .otf
😡 Нет поддержки plurals
😡 Res класс очень нестабилен и иногда не генирируется (пересборка проекта помогает)

UPD: Шрифты работают, issue
38 частых ошибок в Compose

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

💪 Проблемы с производительностью, обработкой состояний, рекомпозицией
💪 Утечки памяти, асинхронная работа, оптимизация работы с памятью
💪 Темы, стили
💪 Работа со сторонними библиотеками, локализация

С помощью этого списка можно довольно подробно разобраться в большом количестве ситуаций по схеме: Проблема - Анализ - Пример кода - Решение
Multiplatform magic: One Codebase, Three Platforms

Завершаем неделю статей про Jetpack Compose, рассмотрев пример кросс-платформенного приложения на KMP

👉 Отличный пример, чтобы понять, как работает KMP и как его можно приложить к вашему проекту. Используется и многопоточность на корутинах,и SQL база данных,и работа с API
👉 Стек технологий: ktor, compose, coroutines и sqldelight
👉 В этом примере используется API, а не SDK, что позволяет прикинуть как это будет выглядеть в вашем приложении с вашим REST API
👉 В конце статьи видео того как это работает на Android, iOS и Desktop

Одним из недостатков KMP в настоящее время является сложности с локализацией, что было опущено в статье. Но может в ближайших релизах станет лучше?
Дедлайны в Google Play

Грядущие обновления политик в Google Play могут принести неприятности. За их несоблюдение вы рискуете быть лишенным обновлений, а затем, временно удалены из магазина. Лучше заложить в планирование исправление этих проблем заранее!

Прошедший январь
🤜 SafetyNet считается устаревшей системой. Она в основном используется для капчи старого образца и иногда используется в старых версиях библиотек Firebase, связанных с авторизацией. Это обновление требует небольших доработок на бекенде!
🤜 Ограничение на использование GenAI.
🤜 Все новые приложения должны использовать свежий API для управления подписками

Февраль
🤜 Необходимо пройти верификацию аккаунта разработчика

Май
🤜 Все приложения должны использовать новый API для управления подписками
🤜 USE_FULL_SCREEN_INTENT выдается автоматически только приложениям, которым это нужно (возможно, будет добавлен флажок в Google Play).
🤜 Новые требования для приложений, связанных со здоровьем

Август
🤜 Ограничение приложений на использование пермишна связанного с доступом к фото и видео пользователя. Переходите лучше на системный способ выбора фото, или придется доказывать Google Play что это действительно надо

- Январь 2025
🤜 SafetyNet полностью будет отключена, старые верификации капчи более не будут работать
Improving unit test performance

Прикладные советы по ускорению запуска юнит-тестов. Основная идея заключается в отключении ненужных gradle task как локально, так и на CI

👉 Если вы используете Crashlytics, выключите injectCrashlyticsBuildIds для тестов
👉 Проверьте и удалите ненужные зависимости, использующие kapt
👉 Если вы пишете тесты аккуратно и используете моки вместо DI, то вам не нужен Dagger-Hilt для unit тестов и, следовательно, kapt и kaptTest для их конфигурации
👉 Если успешно отключили Dagger-Hilt, то и плагин не нужен. Убираем dagger.hilt.android.plugin
👉 Принудительно отключаем все kapt задачи после удаления всех его конфигураций kaptTest для unit тестов
Обновление приложения до targetSdk 34

Обязательное обновление targetSdkVersion ожидается, предположительно, в августе этого года. Добавляем задачку в беклог ближайшего спринта и не переживаем о предупреждениях из Google Play

👉 Если вы используете foreground сервисы, то для них появился foregroundServiceType, который нужно будет определить в манифесте
👉 Обновление Android привело к обновлению OpenJDK до 17. А это значит что могло сломаться: регулярные выражения, ProGuard и десериализация UUID.
👉 При использования BluetoothAdapter.getProfileConnectionState требуется BLUETOOTH_CONNECT (Должен быть и в манифесте и запрашиваться в рантайме)
👉 Ограничения для Intent. Тщательно проверьте, как используется android:exported в ваших приложениях. Неявный Intent может быть отправлен только к android:exported="true”
👉 У BroadcastReceiver новый параметр - ContextCompat.RECEIVER_EXPORTED. Добавляем его в зависимости от того, как вы с ним работаете
👉 Динамически подгружаемый код должен быть помечен как readOnly перед использованием
👉 Ограничения на работу с ZipFile. Теперь будет кидаться ошибка, если в имени есть модификаторы пути до файла ".." или "/".
👉 Расширение ограничений при запуске приложений в фоне. Добавляем еще один параметр в PendingIntent.

В целом, ассистент миграции поможет вам перевести приложение на новое SDK, но лучше самостоятельно проверить, что все упомянутые моменты были переведены верно, иначе рискуете получить неверное поведение приложения или просто краш
Разбираем, что нас ждет в Android 15

🤜 Продолжение работы над приватностью пользователей. Privacy Sandbox призывает помочь найти баланс между конфиденциальностью и персонализацией рекламы в приложениях.
🤜 Улучшение и расширение функционала Health Connect. Например новые данные о фитнесе и питании
🤜 File integrity - Обещают также защиту от потенциальных вирусов и неавторизованных модификаций приложений. Возможно будет полезно, что бы удостовериться, что вам в приложение не подложили подделанные или повреждённые файлы
🤜 Partial screen sharing - эта функция была представлена ещё в Android 14 QPR2, теперь согласие пользователя будет требоваться для каждой сессии MediaProjection
🤜 Больше контроля над камерой. Управляем мощностью вспышки на устройстве во время съемки. А так же яркостью превью для сьемки со слабым освещением
🤜 Расширение поддержки приложений для виртуальных MIDI приложений.
🤜 Android Dynamic Performance Framework (ADPF). Появятся API для работы с режимом энергоэффективности, данными о работе GPU и CPU, а также прогнозированием температуры устройства для более детального распределения нагрузки.

Android 15, как обычно, появится на устройствах Pixel раньше всего. Следить за обновлениями тут
Примерный план работ над стабилизацией Android 15
End-To-End Testing With Robot Pattern

Можно писать тесты на компоуз в лоб, а можно применить паттерн Робот!

👉 На самом деле автор адаптировал паттерн Page Object к экосистеме Jetpack Compose
👉 Для каждого экрана, для которого хотим написать тесты, пишем обёртку с вариантами использования экрана
👉 Благодаря этому повышается читаемость тестов и переиспользование кода. Не нужно по несколько раз прописывать авторизацию, например
👉 В статье также предлагают использовать baseСlass, но будьте осторожны, чтобы это не превратилось в антипаттерн
👉 Тесты выглядят аккуратно, зацените пример на гитхабе
🚀 Важная новость этой недели!

ViewModel
и вообще весь пакет Lifecycle теперь в Compose Multiplatform.
Их так же переписали на Kotlin, поэтому все зависимости *-ktx переехали в основные библиотеки

А еще теперь больше возможностей для написание тестов приложениям с поддержкой нескольких экранов
Please open Telegram to view this post
VIEW IN TELEGRAM