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

Размещение рекламы: @tanyasanovna
Download Telegram
Если вы пропустили анонс прошлой недели - в экспериментальном режиме добавили поддержку SPM в KMP. А это значит что можно наконец-таки избавиться от сотню лет задепрекейченного cocoapods с его медленными зависимостями.
Это была одна из самый проблемных точек KMP за последний год у меня в работе
👍8
TikTok поделился опытом миграции на Jetpack Compose

Главные цифры и профит:
👉 Объем кода уменьшился на 58% по сравнению с реализацией на классических Views
👉 Время загрузки экранов сократилось до 78% на новых или полностью переписанных экранах (и на 20–30% при локальных миграциях)
👉 Compose решил проблему double taxation при измерении элементов, что сильно упростило оптимизацию

Технические инсайты от команды:
📌 Стратегия: Миграцию проводили постепенно. Начали с экрана QR-кода, замерили профит и только потом пошли в сложные флоу
📌 RecyclerView: Использование множества мелких ComposeView внутри одного ViewHolder вызывает оверхед на композицию. Идеальный вариант — один корневой ComposeView на весь ViewHolder
📌 ViewPager: Если у вас Fragment внутри ViewPager со сложной логикой (например, динамическая высота под A/B тесты), лучше переписать на Compose сам ViewPager — это дает больший прирост производительности, чем просто миграция фрагмента
👍92🤔2
Я не фанат статей с хабра, но тут отражена моя боль по публикации приложений в сторах. Более того автор пошел дальше и даже денежку смог вывести.
Ловил блокировки, закидывал модераторов документами и прочее. В общем, полный пакет!
Альтернативные сторы со своими болячками. Может кто поделиться как оно там?

Свой опыт описал тут, постов было несколько, потому что процесс реально долгий
🤷‍♂3👍3
Не знаю, кто в Google решил, что Beta 3 — идеальный момент для такого объема изменений

👉 Beta 3 = platform stability, то есть API уже зафиксирован и пора прогонять финальную совместимость
👉 На больших экранах больше нельзя будет уклоняться от resizable/orientation/aspect ratio ограничений при targetSdk 17
👉 dynamic code loading закручивают еще сильнее: нативные библиотеки, загружаемые через System.load(), теперь должны быть read-only
👉 local network access для targetSdk 17+ теперь по умолчанию закрыт, нужен новый подход и новый ACCESS_LOCAL_NETWORK
👉 появился кастомайз фото-пикера, RAW14, vendor-defined camera extensions и API для определения типа камеры
👉 в desktop mode всё становится интереснее: interactive pinned windows, виджеты на внешних дисплеях, плюс Google явно двигается в сторону более внятного UX для десктопов
👉 добавили system location button: можно дать precise location только на текущую сессию
👉 настройку показа паролей разделили для touch и physical keyboard
👉 появился способ понять, что вы близко к ANR timeout. Наконец-то хоть какой-то ранний сигнал перед смертью процесса
👉 еще завезли FileManager, stricter StrictMode вокруг URI grants, bridged notifications и пачку новых менеджеров/сервисов, часть из которых пока документирована довольно туманно

В самой статье найдете конкретные ссылки на то что заинтересовало прям в документацию
👍64
Why HTTPS Alone Is Not Enough for Sensitive Android Payloads

👉 TLS не тож самое, что и защита данных на уровне самого сообщения. Если до сетевого слоя вы уже плохо реализовали крипту, HTTPS не спасет
👉 Как надо: AES-GCM с fresh IV, AAD и проверкой целостности
👉 Как НЕ надо: ECB, захардкоженные ключи, слабый MAC и особенно Base64 вместо шифрования
👉 Еще есть мини-демо с ECDH: не production-ready, но хорошо показывает, как вообще выглядит договоренность о session key на практике

Вопрос не в том, “мы же зашифровали?”, а в том, какие именно security properties дает ваша схема и что именно сломается, если срезать углы

Android Good Reads
👍6😱4
Android Good Reads
TikTok поделился опытом миграции на Jetpack Compose Главные цифры и профит: 👉 Объем кода уменьшился на 58% по сравнению с реализацией на классических Views 👉 Время загрузки экранов сократилось до 78% на новых или полностью переписанных экранах (и на 20–30%…
Я думал делать разбор еще 3 статей вышедших в Android блоге, но читать самопохвалы от google команды как то грустно, поэтому вот что стоит вынести из:

👉 Monzo boosts performance metrics by up to 35% with a simple R8 update
👉 Instagram and Facebook deliver instant playback and boost user engagement with Media3 PreloadManager
👉 How WHOOP decreased excessive partial wake lock sessions by over 90%

R8 у многих всё ещё работает не в полную силу из-за старого конфига, Baseline Profiles уже давно надо тащить в релизный цикл, для видосов стоит смотреть на Media3 PreloadManager и подгонять стратегию под конкретный UI, а по поводу работы в фоне пора регулярно смотреть в Android vitals, особенно на wake locks и долгоживущие Worker-ы.

production performance — это часто не “переписать всё”, а докрутить то, что Android уже даёт из коробки


Android Good Reads
👍5
This media is not supported in your browser
VIEW IN TELEGRAM
Cascade editor

Composable блочный редактор (как Notion/Craft) с возможностью масштабирования. Удобно встроится в проект, где нужно редактирование текста, но не хочется уводить это в вебвью или костылить свое

👉 Независимое состояние и жизненный цикл у каждого блока
👉 Удобное разделение, объединение и преобразование блоков
👉 Поддержка drag-and-drop для изменения порядка блоков
👉 Вставка новых элементов через slash-команды
👉 Возможность делать собственные рендереры блоков
👉 Поддержка rich-text форматирования внутри блоков
👉 Версионируемая сериализация документа, что упрощает сохранение и миграции

GitHub (70 ⭐️): https://github.com/linreal/cascade-editor
Compose 1.10, Kotlin 2.3, minSdk 28, iOS 16+


Android Good Reads
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥11👍3🤯2😨21
Используем @RequireOptIn чтоб пометить Composable для использования только в превью

Собственно говоря, весь код на превьюшке. Будет бодро слать вам ошибку компиляции, пока вы не добавите @Suppress или не уберете помеченную функцию

Android Good Reads
👍4🔥2
Kotlin 2.4.0 Sorted-Order валидация

Добавили новых extension функций в стандартную библиотеку для валидации того как отсортированы коллекции:
.isSorted()
.isSortedDescending()
.isSortedWith(comparator)
.isSortedBy(selector)
.isSortedByDescending(selector)

🔗 Ссылка на документацию

Ну и сразу пример:
data class User(val name: String, val age: Int)

fun main() {
val users = listOf(
User("Alice", 24),
User("Bob", 31),
User("Charlie", 29),
)
println(users.isSortedBy(User::age))
// false
}


Android Good Reads
👍7🔥2😱2
Android: Offline-first system design

Таких статей мы читали и слушали уже миллион. На картинке вы видите конечный результат проектирования, но эта статья неплохо показывает то, как прийти к такому решению последовательно. Такого типа задачки это часть этапа собеседований (system design)

🔗 Freedium link
Внутри: путь от "Апка крашится без доступа к интеренету" к Offline-first

Android Good Reads
👍6🔥6
Android Studio Preview Quail Canary 1

👉 Удобная интеграция App Quality Insight -> Fix with AI
👉 Интеграция LeakCanary в профайлер с новыми фичами
👉 Material Symbol support
👉 Новая считалка рекомпозиций

Android Good Reads
👍3
Тем временем Google активировал Android developer verification, против которого собирали петицию. Хоть и пошел немного на попятную, частично разрешив установку с ОЧЕНЬ херовыми условиями

Все апки пометили галочкой. Весь процесс работы с приложениями превращается в ужас с Apple...

Антоха Разраб
😢12👍2😡21🔥1
Почему используем STOMP c вебсокетами?

Когда у тебя в одном соединении живут входящие звонки, call events и WebRTC signaling, raw WebSocket быстро превращается в ручной роутинг JSON-пакетов.

STOMP решает это за счет:
👉 destination-based routing
👉 подписок на нужные топики
👉 structured frames
👉 heartbeat из коробки

Итог простой: меньше самописной магии, чище обработчики, легче дебажить и расширять real-time фичи
4👍3👏2👎1
Strong Skipping Mode не делает типы stable, лишь позволяет skip’ать composable с unstable параметрами, если передан тот же самый объект по ссылке ===, тогда как stable типы по-прежнему сравниваются через equals() из-за этого он не помогает, если создаются новые инстансы (типа listOf(), copy()), и рекомпозиция всё равно происходит, поэтому stability позволяет пропускать перерисовку для разных объектов с одинаковыми данными, а Strong Skipping - это оптимизация для случаев с переиспользованием одной и той же ссылки, а не замена пониманию стабильности

Внутри много кода, а не воды для самопроверки
🔥82😁2
Dagger, Yatagan или Metro DI?

Android-команда Яндекс Путешествий сравнила DI-фреймворки, чтобы узнать, как ускорить сборку. Что из этого вышло, на чём остановились ребята и как прошла миграция — смотрите в канале Яндекс Вертикалей.

Кстати, сейчас там проходит розыгрыш промокодов на 10 и 20 тысяч рублей на ваши путешествия. Успевайте поучаствовать😉
Please open Telegram to view this post
VIEW IN TELEGRAM
👍63🔥3
This media is not supported in your browser
VIEW IN TELEGRAM
Compose анимации без пересборки

Дебажить анимации трудно и долго. Hot reload помогает и тут. Внутри анимация Grid, кастомная анимация волны на Canvas, изменение типа анимации tween -> spring, изменение animateContentSize
HotSwan обновляет примитивы в обход компиляции Gradle, за счет этого и получается такой результат
🔥8😱4👍3
Android CLI зацикливает на себе весь цикл разработки для андроид c агентами. Вам не нужно прыгать и искать какие скилы подтянуть в проект, какой контекст по андроид разработке предоставить. All-in-one от гугла (sdk, эмуляторы, запуск билдов ... )

Ни для чего другого, кроме как мобильной разработке, это не подходит, так что поставить точно рекомендую!
🔥6