Android Good Reads
3.88K subscribers
344 photos
13 videos
1 file
2K links
Самые интересные статьи, видео и новости, связанные с Android разработкой. Не больше трёх материалов в день.

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

Размещение рекламы: @tanyasanovna
Download Telegram
Fresh Code 2023 – грантовая программа для разработчиков мини-приложений

VK Mini Apps открывает регистрацию на традиционную грантовую программу, которая продлится два месяца, а уже в декабре создатели лучших 25 сервисов смогут получить гранты по 200 000 рублей!

👉 создайте оригинальное мини-приложение в тематиках программы;
👉 участвуйте в питчингах с экспертами;
👉 опубликуйте его ВКонтакте;
👉 подайте заявку на грант;
👉 дождитесь итогов.

Подробности и форма для участия – здесь
Как работают текстовые кодировки

Записали топовый выпуск Подлодки про разные неочевидные аспекты устройства текстовых кодировок и работы с ними. Больше всего, конечно, про Unicode. Если хотите узнать, почему в любом приложении, работающем с текстом, есть баги – обязательно слушайте!

По мотивам подкаста Никита Прокопов написал еще и шикарную статью, в которой подбил основные тезисы.
Интерактивный гайд по CRDT

Лучший пост недели. Очень просто и подробно разбираются принципы работы CRDT, сразу в виде кода и интерактивного плейграунда. Статья про JavaScript, но все сниппеты кода очень простые, и легко переносятся на Kotlin.
Релиз Emcee 20

Emcee – раннер для параллельного тестирования, который разрабатывает команда AvitoTech. С его помощью можно очень сильно ускорить прогон тестов – например, в самом Авитотех 600 UI тестов прогоняются 50 минут вместо 41 часа. Emcee можно использовать как в облаке, так и на своих машинах.

Так вот, на днях у ребят вышел большой релиз 20. В нем реализовали новый способ запуска тестов через CLI и запись видео прогона тестов. А в клаудную версию добавили поддержку Appium и интеграцию с GitHub Actions.

Короче говоря, если у вашего проекта много тестов, и вы хотите ускорить время их прогона – зайдите на сайт ребят и сами посмотрите все детали.

Реклама ООО "Авито Тех", ИНН 9710089440 erid: LdtCKHR4V
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, но лучше самостоятельно проверить, что все упомянутые моменты были переведены верно, иначе рискуете получить неверное поведение приложения или просто краш