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

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

Размещение рекламы: @tanyasanovna
Download Telegram
Android-разработчики, Ozon приглашает на месяц Mobile Offer

Что по стеку:
Kotlin Coroutines, Dagger2, Jetpack Compose, Architecture Components (View Model, Room, etc.), Clean Architecture, UDF, Single Activity, Jetpack Navigation, Unit, Snapshot, UI-тесты.

Что по проектам: основное приложение для покупателей и B2B для продавцов. В ближайших планах разработка ещё двух приложений с нуля, о них — на интервью 😉
Выбор команды за тобой!

Подать заявку и уточнить подробности можно на этом лендинге.
Please open Telegram to view this post
VIEW IN TELEGRAM
Вышел Compose Multiplatform 1.5.0

Посмотрите, какой шикарный релиз!

👉Новые API, доступные в common коде: Dialogs, Popups, WindowInsets.
👉Скроллинг, который работает так же, как в iOS.
👉Поддержка DynamicType в iOS.
👉Для управления ресурсами больше не требуется CocoaPods.
👉Стабилизирован тестовый фреймворк для десктопа.

Уже пробовали Compose Multiplatform? Расскажите в комментах, как именно!
Konsist – линтер для архитектуры

Konsist – новый линтер с доступом к PSI, который позволяет писать довольно сложные архитектурные чеки, например:

👉Наличие определенных суффиксов или префиксов у классов, реализующих интерфейс.
👉Расположение классов в определенном пакете в зависимости от аннотации.
👉Ограничение доступа классам из определенного пакета к другим пакетам.
👉У всех конструкторов параметры отсортированы по алфавиту.
Сколько денег приносят пользователи iOS и Android

Обновленная аналитика по тому, сколько всего пользователей покупает что-то в App Store и Google Play, и сколько денег они приносят.

👉В мире 650 миллионов активных пользователей App Store и 2.5 миллиарда активны пользователей Google Play.
👉Активный пользователь App Store тратит в месяц 10.4$. Google Play – 1.4$.
👉Получается, пользователи вашего приложения на iOS в среднем в 7.4 раз ценнее, чем на Android.
Нужно ли делать онбординг в приложение коротким

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

Но это не всегда так. Как рассказывается в статье, в некоторых случаях длинный и сложный онбординг из 50 экранов, занимающий 10 минут времени, может активировать пользователей существенно лучше.
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