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

Размещение рекламы: @tanyasanovna
Download Telegram
Очередная напоминалка от Google Play. 31 Марта 2026 года немного изменится вид иконок в Google Play Store, увеличив радиус скругления.

Я хотел было возмутиться, что им там делать нефиг, но они, на самом деле, подгоняют всё под material3

Гайдлайны тут
😱7🤣6👍4
Android Good Reads
Продолжаем историю с Glitch эффектом. Как сделать этот же эффект не через Composable, а с помощью Android AGSL shaders. Внутри вас ждет: 👉 Что такое шейдеры 👉 Реализация 👉 Детальный сравнительный анализ производительности обоих подходов В статье очень много…
This media is not supported in your browser
VIEW IN TELEGRAM
Еще про шейдеры

👉 Внутри пошагово, с примерами и объяснениями разбирают применение шейдеров
👉 Это важно, чтоб ваше приложение было более производительное
👉 Чуть более хайповая статья от того же автора про то как сделать Upside-Down эффект из Stranger Things
👉 Про шейдеры на BottomNavBar - совсем простенько, зато юзкейз!

Репозиторий с кодом и примерами: https://github.com/makzimi/glitch-shader
🔥4👍3
Jetpack Compose Memory Leaks: A Reference-Graph Deep Dive

Разбор ошибок при работе с Compose приводящим к утечкам памяти. В итоге:
👉 Чаще используйте DisposableEffect(owner) во избежании проблем с зануливанием слушателей
👉 Никогда не храните Composable-лямбды или UI-объекты во ViewModel или синглтонах. Вместо этого храните состояние (StateFlow) и события (SharedFlow)
👉 Избегайте использования GlobalScope и областей видимости всего приложения для работы, связанной с UI
👉 Используйте LaunchedEffect или viewModelScope в зависимости от того, к чьему жизненному циклу привязана задача
👉 Добавляйте ключи к remember. Если объект зависит от X, используйте remember(X)
👉 Не захватывайте контекст Activity в долгоживущие колбэки . Используйте rememberUpdatedState или перепроектируйте архитектуру так, чтобы UI-слой занимался UI-задачами. Актуально не только для Compose
👍112
Compose MP 1.10

👉 @Preview теперь и в commonMain
👉 Navigation 3 поддерживается, но пока сыровато
👉 Compose Hot Reload стабильный

Не из пресс релиза
👉 Депрекейтнули dependency aliases, compose.ui теперь всё
👉 Депрекейтнули PredictiveBackHandler
👉 Минимальная версия Kotlin - 2.2.10
👉 Вытащили DialogProperties и PopupProperties в стабильные
👉 Поддержка AGP 9.0.0 - я пытался перехать на AGP 9.0, но то кастомные плагины ломаются, то зависимости перестают работать. Не могу ничего сказать
👍3🔥3👎1
Android Good Reads
Про Server Driven UI. Ранее автор разбирал ограничение Client Driven UI. А теперь продает нам преимущества SDUI. 👉 Как следует из названия, экраны отрисовываются по инструкциям с сервера 👉 Несмотря на кажущуюся независимость клиента от сервера, ваше приложение…
Remote Compose

Отдельный пласт приложений - SDUI, сложно-тяжко и не всегда нативно выглядит. Можно почитать в предыдущем посте. А тут очень тихо релизнулся нативный аналог. Под релиз даже статья выходила:
https://proandroiddev.com/remotecompose-another-paradigm-for-server-driven-ui-in-jetpack-compose-92186619ba8f

Основная фишка - полная интеграция в Compose, что позволяет вам сделать частично динамический кусок вашего интерфейса без встраивания такого монстра как SDUI
🔥5👍3
This media is not supported in your browser
VIEW IN TELEGRAM
Я устал писать боилерплейт в Compose и написал свой Emmet-like плагин для Android Studio

Мы все любим Compose, но "Nesting Hell" и бесконечный бойлерплейт из Column, Row и Modifier убивают продуктивность.

Встречайте YARC (Yet Another Rapid Compose) — плагин для Android Studio, который привносит скорость Emmet в разработку Android UI.

Вместо того чтобы писать 15 строк кода вручную, просто наберите: col/row/txt*3 и нажмите Cmd+Opt+E. Вы мгновенно получите готовое дерево компонентов.
👉 Быстрее, чем ИИ: Не нужно ждать ответа сервера или исправлять "галлюцинации"
👉 Умнее, чем Live Templates: Поддерживает динамическую вложенность и математику
👉 Open Source: От Android-разработчика для Android-разработчиков

IntelliJ Marketplace
GitHub (11 ⭐️) https://github.com/andrew-malitchuk/yet-another-rapid-compose
👍15😁10🔥3
Save for later

Новая фича в Google Play консоли. Помогает дробить изменения перед отправкой на ревью. Будет полезно, чтобы не блокировать весь релиз целиком из-за сторонних изменений.
👍6🔥3
Навыки, которые мы теряем, пока AI делает скучную работу

Чот я всё хвалю и хвалю AI, надо и поругать в сегодняшней статье. Автор проводит параллель с пилотами, которые теряют навыки ручного управления из-за надежды на автопилот, и утверждает, что то же самое происходит сейчас с разработчиками

👉 Скука — это тренировка. Написание тестов, документации и бойлерплейта — это не просто рутина. Это «повторения», которые формируют интуицию и помогают предугадывать баги и граничные сценарии
👉 Невидимая атрофия. Потеря навыка происходит незаметно. Вы по-прежнему закрываете тикеты, метрики выглядят хорошо, но способность глубоко понимать систему и находить сложные баги (которые AI пропускает) исчезает
👉 Иллюзия продуктивности. Ссылаясь на исследования (включая отчет GitClear 2025), автор отмечает, что с приходом AI количество рефакторинга упало, а копипасты — выросло. Опытные инженеры могут даже замедляться, используя AI, не замечая этого

Отказываться от AI глупо, но важно не превратиться в оператора, который не может работать без инструмента. Решение — периодически писать код и тесты самому, чтобы поддерживать форму
💯19👍6😱3👌2🔥1
Android Studio Panda 1 | 2025.3.1 Canary 5

Обрастает фичами. Хотелось бы верить что по клику на Update all libraries with AI агент сходит, посмотрит релиз ноутсы, сопоставит зависимости, подскажет или сам поправит минорные изменения, но нет

Это градловая таска, которую он запихивает в агента, чтобы там уже править ошибки. Спасибо 😡
😁15😱2
Shared Internals: кросс-модульная видимость

Разбираем KEEP-0451, предлагающий ввести shared internal, как еще один скоуп видимости внутри модуля и некоторых зависящих модулей

Кратко весь сехматоз описывают так
A ──shares──▶️ B ──shares──▶️ C

C имеет доступ к A shared internals


Сценарий простой и вы с ним сталкивались в многомодульном приложении: модуль с тестами хочет иметь доступ к internal функциям основного модуля.

Как по мне, это извращенная friends декларация из плюсов. Плохо ли?

Оригинальный KEEP-0451 почитать тут
🤯5😐3😢2
Итак, вопрос с собеседования! Чем отличается Dispatchers.Main от Dispatchers.Main.immediate

Внутри разбирают с картинками:
👉 А что если продьюсить на Main, а консьюмить на immediate. И вообще перебрать всевозможные комбинации?
👉 А зачем выбирать immediate?
👉 Почему AndroidX команда выбрала immediate стандартным диспатчером для lifecycleScope и viewModelScope?

Ладно, я немного преувеличил и думаю, что такого рода вопросы скоро, все-таки, пропадут с собеседований...
👍14🤔10🔥2💯1💅1
LeakCanary теперь встроен в профайлер внутри Android Studio, начиная с Panda 1

В чем особенность? Компьют перенесли с мобильного девайса на ваш лаптоп. Теперь поиск в дампе будет быстрее
👍18🔥6
Кажется, это было трендом еще в 2016 году, но давайте освежим. Модуляризация в Android для больших команд
И сразу же часть 2 с примером

От себя скажу, что на эту статью лучше посмотреть как на чужой опыт и не перенимать один в один. Прежде чем приступать к такого рода изменениям - попробуйте и обкатайте их на отдельном проекте и проверьте как это будет работать
😁7👍3🔥3
Как kotlinx.serialization генерирует код

​В этой статье разбирается внутреннее устройство compile плагина kotlinx.serialization: от стратегии двухпроходной генерации IR (промежуточного представления) до оптимизации «золотой маски» для проверки обязательных полей. Плагин превращает обычные аннотации @Serializable в эффективные и типобезопасные сериализаторы, полностью обходясь без рефлексии или генерации кода во время выполнения

​А зачем это знать?
​Можно успешно использовать библиотеку, и не зная этих нюансов. Однако понимание внутренних механизмов поможет вам решать редкие связанные баги и принимать оптимальные по производительности решения
👍5
И еще разок Dependency Injection vs Service Locator

Вместо того чтобы просто сравнивать либы, автор делит их на две категории:

Истинный Dependency Injection (Dagger, Hilt, Anvil, kotlin-inject, Metro)

👉 Строятся на Inversion of Control (IoC)
Строгая валидация графа на этапе компиляции (если собралось — в проде из-за DI не упадет). Разрешение зависимостей за O(1) в рантайме. Идеально для тестов и больших команд
Требуют больше явного кода от разработчика, замедляют сборку

Service Locators (Koin, Kodein, Spring DI, Compose CompositionLocals)

👉 Фокус на Developer Experience и скорости написания кода.
Почти нулевой оверхед на сборку (все происходит в рантайме), минимум бойлерплейта
Разрешение зависимостей за O(n), ошибки вылезают только при выполнении, а значит вылезает еще 1 категория багов на проде
Please open Telegram to view this post
VIEW IN TELEGRAM
👎8👍6🥴32
Петиция KeepAndroidOpen

В августе 2025 года Google объявила, что начиная с сентября 2026 года разрабатывать приложения для платформы Android будет невозможно без предварительной централизованной регистрации в Google. Эта регистрация будет включать:

👉 Оплату сбора Google
👉 Согласие с условиями использования Google
👉 Предоставление удостоверения личности государственного образца
👉 Загрузку доказательств владения приватным ключом подписи разработчика
👉 Указание всех текущих и будущих идентификаторов приложений

Если вкратце - распространять приложения станет сильно сложнее. На странице петиции описаны (на разных языках) последствия которые нас ждут после вступления правил в силу
👍11😁3
Goodbye ViewModel. Hello retain!

Потенциальная замена для viewModel из коробки. Основная проблема которой, это отдельная поддержка viewModel из каждого DI. retain же работает как Composable и не нуждается в отдельном @HiltViewModel

Переписывать на retain в ближайшие пару лет никто, конечно же, не будет, но знать про это все-таки стоит

@Inject
class AuthPresenter(...) {
val state: StateFlow<UiState>
fun login(creds: Credentials) { .. }
fun logout() { .. }
}

interface AuthScreenProviders {
@IntoSet
@Provides
fun provideRoute(presenter: Provider<AuthPresenter>): RouteEntryProviderScope = {
entry<Route.Auth> { AuthScreen(presenter = retain { presenter() }) }
}
}
👍8🤔6🔥3👎1😁1
Большое исследование мобильных разработчиков

Ребята из DevCrowd запустили новое большое исследование мобильных разработчиков (а они проводят их уже много лет). И вот в 2026 году его результаты, кажется, будут действительно неожиданными – разработка за последний год поменялась очень сильно, и эта волна точно затронула и Android.

В опросе будем разбираться с тем, что происходит на рынке по грейдам и зарплатам, выживает ли кроссплатформа, как мобильщики используют AI в работе, куда расти, и как искать работу. Результаты выложим где-то в апреле!

👉Пройти опрос
👍53