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

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

Размещение рекламы: @tanyasanovna
Download Telegram
Android Good Reads pinned «Привет! Меня зовут Антон, и последние 4 месяца я пишу для вас выжимки интересных статей про Android. Кажется, пора познакомиться? Я живу и работаю в Швеции, где мы разрабатываем приложение на KMP с Jetpack Compose сразу для обеих платформ, поэтому в выборе…»
Navigation Compose meet Type Safety

Начиная с версии Navigation 2.8.0-alpha08, навигация будет типо-безопасной

👉 Граф навигации собирается с использованием Kotlin DSL, XML или вручную через NavGraph, но последние изменения сосредотачиваются именно на Kotlin DSL
👉 Теперь, если вы допустите ошибку с аргументом, передаваемым в навигацию, это будет обнаружено еще на этапе компиляции. Возможности проверки в рантайме из XML становятся делом прошлого
👉 Навигация стремится оставаться отдельным компонентом, чтобы не смешиваться с остальной частью приложения и обеспечить возможность легкого перехода в случае необходимости. SOLID friendly!

🤔 Итого:
Мы получаем более простую и стабильную в использовании навигацию, но менее гибкую в настройке
Please open Telegram to view this post
VIEW IN TELEGRAM
Что такое нативная разработка?

Обсудим концепцию нативной разработки в контексте Android и iOS. Это понятие размылось с появлением кроссплатформенных технологий.

Исторически, нативная разработка относилась к приложениям, разработанным с использованием языков, специфичных для своей платформы (Java/Kotlin для Android и Objective-C/Swift для iOS). Однако с появлением дизайн-систем, акцент сместился с технической реализации на UI/UX. Использование родных системе компонентов предполагало что приложением может сойти за нативное?

Автор предлагает, что дизайн-системы и пользовательский опыт не определяют, является ли приложение нативным. Скорее это зависит от контекста платформы, для которой оно предназначено.

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

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

Итого:
Концепция нативности приложения относительна и зависит от контекста платформы, для которой она предназначена. В то время как дизайн-системы и пользовательский опыт важны, они не определяют, что означает быть нативным. Вместо этого способность к обмену памятью и стеком вызовов с базовой системой является ключевым критерием для нативной функциональности, а Kotlin соответствует этому критерию.
Изменения в Google Play Console

Много небольших изменений для релиз-менеджеров или отвественных за рост приложения, но с точки зрения разработки мне интересна именно эта фича! Теперь, если у вас ANR краш в SDK с которым вы ничего не можете сделать - его можно пошарить с разработчиком этого SDK
Compose и адаптивные layout!

👉 Представлены NavigationSuiteScaffold, ListDetailPaneScaffold & SupportingPaneScaffold. Для организации экранов. Посмотреть как каждый выглядит можно тут
👉 Compose для Android TV переходит в бету
👉 Смотрим на красивые виджеты с Jetpack Glance!

Сегодня ожидается чуть больше новостей, касающихся Android от Google I/O!

Изображение взято с Jetcaster, показывающее как офигенно Compose выглядит на всех Android девайсах
Обновление для часов!

👉 Много обновлений для циферблатов и расширения их функциональности
👉 Watch OS 5 developer preview! - энергоэффективнее и производительнее
👉 Jetpack Compose для Wear OS расширяется и растет. Уже релиз 1.3.1
👉 Блог о том как разработка для Wear OS на Compose позволила писать меньше кода в Soundcloud
👉 Больше инструментов для взаимодействия с часами из Android Studio. В последнем фиче дропе добавили превью для Tiles и ProtoLayout. Появилась возможность подкладывать данные с датчиков для фитнес приложений
Что еще показали?

👉 Анализатор от Google по соблюдению требований безопасности: https://checks.google.com/
👉 Большой апдейт по Compose, но мы уже разбирали его
👉 Вторая бета для Android 15
😅 Android Studio Koala Feature Drop (2024.1.2) Canary 1
👉 Напомнили что Android Automotive OS все еще живет и развивается. Сегодня должен быть доклад

На следующей неделе KotlinConf, ждем больше обновлений по Kotlin оттуда!
Android Good Reads
Coil с поддержкой Compose Multiplatform Вышла Alpha версия Coil 3.0.0 с поддержкой Compose Multiplatform! Wasm таргет будет работать, когда выйдет Ktor с его поддержкой.
Coil(Coroutine Image Loader) поддерживает все платформы с версии 3.0.0-alpha05: Android, JVM, iOS, macOS, Javascript и WASM! Прелесть в том, что не надо под каждую платформу писать свой загрузчик, если вы используете KMP.

Пример использования и того как это выглядит можно глянуть тут
Из приятного:
👉 Контроль над размером выделяемого кэша
👉 Контроль над weak/strong ссылками. Поможет с утечками?
👉 На Android использует стандартные компоненты для загрузки, на остальных платформах собственная обертка над Skia
👉 Миграция с версии 2 выглядит не сложно
Часы. Часы? Часы!

Рекомендации по использованию сторонних фреймворков от разработчицы из Гугла. Даже если не занимаетесь поддержкой wearable девайсов, то интересно глянуть на особенности разработки. Google I/O показал много обновлений для часов!

👉 Сборник Horologist библиотек. Помогают следовать гайдлайнам гугла. Например скорлу или удостовериться что часть элементов не скрыто под скруглением часов
👉 Скриншоты для странички Google Play, чтоб заявить о поддержке часов, даже если нет идеального девайса
👉 Шрифты и Splash screen (Wow!)
👉 Основная дока
Кэширование в Android

Автор рассматривает и предлагает архитектурные решения для следующих типов кэширования:

👉 Cache Only
👉 Network Only
👉 Network First
👉 Cache First - Network Second
👉 Cache First - Network for Later
👉 Cache First - Network Once
✍️ Бонусом, кэширование через networkBoundResource

Выглядит больше как шпаргалка по проектированию кэширования приложения на этапе интервью, но схемы однозначно стоит посмотреть и, возможно, забрать к себе в команду
Please open Telegram to view this post
VIEW IN TELEGRAM
О создании Preview в Jetpack Compose

Как вы подкладываете и обновляете данные для @Preview? В статье предлагается:

👉 Хардкодить данные напрямую
👉 Класть все данные в обьект и подменять в процессе подстановки. А более аккуратный способ — это воспользоваться PreviewParameterProvider (Хорошо описано тут)
👉 Написать полноценный отдельный фабричный метод для описания состояния @Preview. Мне кажется что это оверинжениринг, только если вы не всецело полагаетесь на превью в работе
👉 Использование существующего state holder

У нас в команде решили для каждого UI-класса определять несколько mock() функций с основными кейсами. В итоге у нас есть базовые превью, а при переиспользовании всегда видны возможные коллизии на основных кейсах.
System UI Compatibility and Immersive Status Bar

Разбираемся как в Compose обращаться с областью взаимодействия приложения

👉 enableEdgeToEdge() - растянуть область и забрать контроль у системы
👉 WindowInsets понять область отступа системных компонентов и вставить в padding вашего объекта
👉 Modifier.systemBarsPadding() или Modifier.safeDrawingPadding() сделать тоже самое, но с помощью модификатора
Посмотрите на этот кусочек кода. Выглядит странно, хотя точно используется вашим приложением. Ну а кто транзитивно не использует okio?

Именно с этого момента начинается статья об оптимизации подсчета количества символов в числе. Итоговые результаты такие:
Немного анонсов грядущих изменений в Kotlin. Вероятно, появится объединение типов и ошибок

Более подробно в тикете: kotl.in/f28fo8

Источник
Это не финальный вид, а только предположение о том, как может выглядеть реализация
Сравниваем 2 APK на уровне dex. Не маст-хев инструмент, но посмотреть на сколько хорошо работают ваши proguard правила и сверить apk от релиза к релизу может быть удобно.

Сам инструмент: https://github.com/theapache64/dex-diff
Про новые layout с Google I/O

Новые ContextualFlowRow и ContextualFlowColumn дают чуть больше контроля над элементами, по сравнению со стандартными FlowRow и FlowColumn, хотя они тоже получили небольшое обновление


val items = List(100) { Random.nextFloat() }

ContextualFlowRow(
itemCount = items.size,
maxLines = 3,
maxItemsInEachRow = Int.MAX_VALUE,
horizontalArrangement = Arrangement.Start,
verticalArrangement = Arrangement.Top,
overflow = ContextualFlowRowOverflow.Clip,
modifier = Modifier,
) { index ->
Text(text = items[index].toString())
}


👉 Ключевое изменение в возможности получать index элемента, а так же lineIndex, indexInLine и maxWidthInLine(maxHeightInLine), maxHeight(maxWidthin) из ContextualFlowRowScope(ContextualFlowColumnScope)
👉 Вы могли заметить, что теперь можно указать максимальное количество элементов, а это значит что в элемент можно накинуть на 1 больше элемент чем мы разрешили. Что произойдет? Сработает 1 из 4 overflow policy: Clip, Visible, expandIndicator, expandOrCollapseIndicator, где вам отдается контроль над этими элементами
This media is not supported in your browser
VIEW IN TELEGRAM
Порядок применения модификаторов в Composable компонентах

👉 Хорошая привычка, прописывать Modifier для каждой @Composable функции
👉 Модификаторы применяются в порядке "от конца к началу, изнутри наружу"
👉 Примеры кода в статье