Android Good Reads
رفتن به کانال در Telegram
Самые интересные статьи, видео и новости, связанные с Android разработкой. Не больше трёх материалов в день. Размещение рекламы: @tanyasanovna
نمایش بیشتر4 010
مشترکین
+324 ساعت
-27 روز
-1930 روز
آرشیو پست ها
4 010
Repost from Антоха Разраб про AI
Все идет по пути к тому что у каждого тула будет CLI версия. Обсидиан запустил пару месяцев назад, а вот и Google (Пере)представляет Android CLI
По ощущениям оч кастрированный и является надстройкой над
adb
(c) Антоха Разраб про AI4 010
Android CLI зацикливает на себе весь цикл разработки для андроид c агентами. Вам не нужно прыгать и искать какие скилы подтянуть в проект, какой контекст по андроид разработке предоставить. All-in-one от гугла (sdk, эмуляторы, запуск билдов ... )
Ни для чего другого, кроме как мобильной разработке, это не подходит, так что поставить точно рекомендую.
4 010
Compose анимации без пересборки
Дебажить анимации трудно и долго. Hot reload помогает и тут. Внутри анимация
Grid, кастомная анимация волны на Canvas, изменение типа анимации tween -> spring, изменение animateContentSize
HotSwan обновляет примитивы в обход компиляции Gradle, за счет этого и получается такой результат4 010
Dagger, Yatagan или Metro DI?
Android-команда Яндекс Путешествий сравнила DI-фреймворки, чтобы узнать, как ускорить сборку. Что из этого вышло, на чём остановились ребята и как прошла миграция — смотрите в канале Яндекс Вертикалей.
Кстати, сейчас там проходит розыгрыш промокодов на 10 и 20 тысяч рублей на ваши путешествия. Успевайте поучаствовать😉
4 010
Strong Skipping Mode не делает типы stable — он лишь позволяет skip’ать
composable с unstable параметрами, если передан тот же самый объект по ссылке ===, тогда как stable типы по-прежнему сравниваются через equals() из-за этого он не помогает, если создаются новые инстансы (типа listOf(), copy()), и рекомпозиция всё равно происходит, поэтому stability позволяет пропускать перерисовку для разных объектов с одинаковыми данными, а Strong Skipping — это оптимизация для случаев с переиспользованием одной и той же ссылки, а не замена пониманию стабильности
Внутри много кода, а не воды для самопроверки4 010
+1
Почему используем STOMP c вебсокетами?
Когда у тебя в одном соединении живут входящие звонки, call events и WebRTC signaling, raw WebSocket быстро превращается в ручной роутинг JSON-пакетов.
STOMP решает это за счет:
👉 destination-based routing
👉 подписок на нужные топики
👉 structured frames
👉 heartbeat из коробки
Итог простой: меньше самописной магии, чище обработчики, легче дебажить и расширять real-time фичи
4 010
Repost from Антоха Разраб про AI
+1
Тем временем Google активировал Android developer verification, против которого собирали петицию. Хоть и пошел немного на попятную, частично разрешив установку с ОЧЕНЬ херовыми условиями
Все апки пометили галочкой. Весь процесс работы с приложениями превращается в ужас с Apple...
Антоха Разраб
4 010
Android Studio Preview Quail Canary 1
👉 Удобная интеграция
App Quality Insight -> Fix with AI
👉 Интеграция LeakCanary в профайлер с новыми фичами
👉 Material Symbol support
👉 Новая считалка рекомпозиций
Android Good Reads4 010
Android: Offline-first system design
Таких статей мы читали и слушали уже миллион. На картинке вы видите конечный результат проектирования, но эта статья неплохо показывает то, как прийти к такому решению последовательно. Такого типа задачки это часть этапа собеседований (system design)
🔗 Freedium link
Внутри: путь от "Апка крашится без доступа к интеренету" к Offline-first
Android Good Reads
4 010
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 numbers = listOf(1, 2, 3, 4)
println(numbers.isSorted())
// true
val users = listOf(
User("Alice", 24),
User("Bob", 31),
User("Charlie", 29),
)
println(users.isSortedBy(User::age))
// false
}
Android Good Reads4 010
Используем
@RequireOptIn чтоб пометить Composable для использования только в превью
Собственно говоря, весь код на превьюшке. Будет бодро слать вам ошибку компиляции, пока вы не добавите @Suppress или не уберете помеченную функцию
Android Good Reads4 010
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+
4 010
Я думал делать разбор еще 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
4 010
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
4 010
Не знаю, кто в 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 и пачку новых менеджеров/сервисов, часть из которых пока документирована довольно туманно
В самой статье найдете конкретные ссылки на то что заинтересовало прям в документацию4 010
Я не фанат статей с хабра, но тут отражена моя боль по публикации приложений в сторах. Более того автор пошел дальше и даже денежку смог вывести.
Ловил блокировки, закидывал модераторов документами и прочее. В общем, полный пакет!
Альтернативные сторы со своими болячками. Может кто поделиться как оно там?
Свой опыт описал тут, постов было несколько, потому что процесс реально долгий
4 010
TikTok поделился опытом миграции на Jetpack Compose
Главные цифры и профит:
👉 Объем кода уменьшился на 58% по сравнению с реализацией на классических
Views
👉 Время загрузки экранов сократилось до 78% на новых или полностью переписанных экранах (и на 20–30% при локальных миграциях)
👉 Compose решил проблему double taxation при измерении элементов, что сильно упростило оптимизацию
Технические инсайты от команды:
📌 Стратегия: Миграцию проводили постепенно. Начали с экрана QR-кода, замерили профит и только потом пошли в сложные флоу
📌 RecyclerView: Использование множества мелких ComposeView внутри одного ViewHolder вызывает оверхед на композицию. Идеальный вариант — один корневой ComposeView на весь ViewHolder
📌 ViewPager: Если у вас Fragment внутри ViewPager со сложной логикой (например, динамическая высота под A/B тесты), лучше переписать на Compose сам ViewPager — это дает больший прирост производительности, чем просто миграция фрагмента4 010
Если вы пропустили анонс прошлой недели - в экспериментальном режиме добавили поддержку SPM в KMP. А это значит что можно наконец-таки избавиться от сотню лет задепрекейченного
cocoapods с его медленными зависимостями.
Это была одна из самый проблемных точек KMP за последний год у меня в работе4 010
HotSwan - Android hot reload for Jetpack Compose
Теперь чисто под Android нативный таргет. Установка простая в app модуль через плагин. Пробуем!
Либа JB под JVM таргет специфична (только KMP проект) HotSwan под Android таргет (и в KMP проекте тоже)На гифку надо кликнуть, чтоб открылась в хорошем качестве
