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

Размещение рекламы: @tanyasanovna

Автор канала: @Lamprof
Download Telegram
И еще разок 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() }) }
}
}
👍7🤔6🔥3👎1😁1
Большое исследование мобильных разработчиков

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

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

👉Пройти опрос
👍53
Новый Experimental Styles API в Jetpack Compose

Устали от простыней кода с InteractionSource и animate*AsState просто чтобы поменять цвет кнопки при нажатии? В Compose завозят решение!

👉 Всё в одном блоке: Больше не нужно жонглировать модификаторами и стейтами. Вы создаете единый блок Style, где описываете базовый вид и реакции на различные состояния (hovered, pressed, focused)
👉 Автоматические анимации: Достаточно обернуть изменения в блок animate { ... } (можно передать свой AnimationSpec), и система сама плавно заанимирует переходы
👉 Умная инвалидация под капотом: Свойства стилей хранятся с использованием битовых масок. Если при нажатии меняется только цвет (свойства отрисовки), Compose инвалидирует только фазу draw, полностью пропуская рекомпозицию и layout
👉 Доступ к темам: StyleScope имеет доступ к CompositionLocal, так что можно легко брать цвета из темы прямо внутри стиля, и они будут обновляться при ее смене

ClickableStyleableBox(
onClick = onClick,
style = {
background(Color.Green)
size(150.dp)
hovered {
animate { background(Color.Yellow) }
}
pressed {
animate(tween(100)) { background(Color.Red) }
}
}
)
13👍10🔥4🥱2
Android LLM leaderboard!

Бенчмарк для моделей с уклоном в андроид разработку

Ссылка на Android Bench: https://developer.android.com/bench
👍6😁2
Android Good Reads
Новые метрики в Google Play Store Новые метрики касающие энергопотребления приложений. Планка качества приложений повышается. Пока что метрика в бете, но с Марта 2026 года приложение будет убрано из рекомендаций, если приложение не удовлетворяет следующему:…
Google Play раскатывает это обновление!

Внутри разбирают популярные сценарии и что с ними делать

👉 Некоторые подключаемые библиотеки могут влиять на это, увы, с этим, вы ничего не сделаете, но сможете отследить в Android Vitals
👉 Загрузка или выгрузка файлов
👉 Одноразовые или периодические операции в фоне
👉 Bluetooth соединение
👉 Location трекинг
👉 Частое снятие показаний с сенсоров (всякие гироскопы и прочее)
👉 Remote messaging не через гугловский FCM. Да-да, если у вас собственная реализация слушания ивентов - увы и ах

Внутри статьи рекомендации по тому как избежать проблем
👍4😱2
Исследуем CompositionLocal API

С этим API вы уже знакомы
val LocalUser = compositionLocalOf { "GoodReads" }

@Composable
fun App() {
CompositionLocalProvider(LocalUser provides "AndroidGoodReads") {
UserProfile()
}
}

@Composable
fun UserProfile() {
val name = LocalUser.current
Text("Hello, $name")
}

Внутри статьи рассказывают:

👉 Разбор внутреннего устройства: как связаны CompositionLocal, ProvidableCompositionLocal и их различные вариации
👉 Что на самом деле создают функции compositionLocalOf, staticCompositionLocalOf и compositionLocalWithComputedDefaultOf, и в чем разница между результатами их работы
👉 Механика работы CompositionLocalProvider и свойства .current. Как правильно передавать локальные данные между различными композициями
👉 Внутренняя кухня Compose: работа с Value Holders, использование Persistent Maps и интеграция на уровне Composer
👉 Рекомендации по оптимизации производительности и разбор типичных ошибок, которых следует избегать при использовании CompositionLocal
👍8🔥4😁1
Альфа Room 3.0 Alpha

Обновление одной из флагманских библиотек. Я всегда стараюсь использовать что-то по меньше и шустрее, типа sqldelight, но знаю, что этого монстра многие используют! А чо внутри то?

👉 KMP и WASM
👉 Чтобы избежать конфликтов с Room 2.x, androidx.room теперь стал androidx.room3
👉 Отказ от SupportSQLite: Библиотека теперь полностью работает на драйверах androidx.sqlite. Для постепенного перехода предусмотрен артефакт room3-sqlite-wrapper
👉 Только Kotlin и KSP: Генерация Java-кода, а также поддержка Java Annotation Processing (AP) и KAPT полностью прекращены
👉 Coroutines First: Из-за требований веб-платформ все API стали асинхронными. Блокирующие функции в DAO больше не поддерживаются — они должны быть либо suspend, либо Flow. Наканец-та!
👉 Кастомные типы возвращаемых значений: Добавлена аннотация @DaoReturnTypeConverter. Она позволяет разработчикам создавать собственные интеграции (например, для RxJava, Paging, LiveData)
👉 Текущее поколение Room 2.x переходит в maintenance mode. Новые фичи добавляться не будут, планируются только исправления ошибок и обновления зависимостей до релиза стабильной Room 3.0
👍9🔥31
🔒 Безопасность Android-приложений: углубляемся в тему с Podlodka Android Crew

Современные Android-приложения работают с пользовательскими данными, платежами и приватным контентом. Это буквально мишень для злоумышленников всех мастей.

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

С 30 марта по 3 апреля пройдет новый сезон Podlodka Android Crew — это будет онлайн-конференция, полностью посвящённая безопасности мобильных приложений на Android.

💡Участники сезона разберут:


🔐С чего начинается безопасность приложения

🧩 Как UI может стать точкой взлома

👀 Как выглядит Android-приложение глазами атакующего

🧬 Где реально помогают passkeys и биометрия, а где — нет

💳 Как защищаются платежи и видеоконтент в Android-приложениях и не только — программа обновляется на сайте.

Формат — классический для Podlodka Android Crew: 5 дней, 10+ спикеров, 10 сессий и закрытое комьюнити в Telegram.

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

👉 Early-bird билеты на сезон Podlodka Android Crew доступны до 23 марта
👍2🔥2
Боремся с лишними рекомпозициями в Compose

Если вы хоть раз пытались понять, какого черта ваш экран перерисовывается 10 раз при скролле или вводе текста, то это для вас. Подъехали сразу две годные тулзы, которые подходят к проблеме перфоманса с абсолютно разных сторон:

👉 DejaVu
Мощная библиотека, которая превращает проверки рекомпозиций в полноценные тесты

Под капотом: Это test-only решение, то есть в прод не улетит ни строчки лишнего кода. Подключается максимально просто: инициализируете правило createRecompositionTrackingRule<>() в тестовом классе, вешаете стандартный Modifier.testTag() на нужный Composable и пишете ассерты на количество перерисовок

В чем фишка: Идеально для CI. Библиотека отслеживает счетчики для каждого инстанса отдельно и выдает аналитику. Если кто-то из команды или AI-ассистент сломает стейт, тест упадет и покажет таймлайн проблемы с диффом параметров, из-за которых случилась рекомпозиция

Github (55 ⭐️): https://github.com/himattm/dejavu

👉 Compose Rebound
Инструмент для мониторинга "бюджета рекомпозиций" прямо во время работы приложения

Под капотом: Работает на базе Kotlin Compiler Plugin. Во время компиляции плагин автоматически резолвит имена Composable-функций и назначает им лимиты в зависимости от роли (например, 3 рекомпозиции в секунду для экрана, 30/с для кнопок, 120/с для анимаций)

В чем фишка: У Rebound есть шикарный плагин для IDE. Он не просто считает перерисовки, а отделяет вынужденные рекомпозиции (из-за родителя) от тех, что вызваны изменением параметров самого компонента. Помогает находить реальные спайки и аномалии, а не просто пугать вас большими цифрами в Layout Inspector

Github (37 ⭐️): https://github.com/aldefy/compose-rebound

Такое мы внедряем!
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
Вступайте в Podlodka AI Engineers Club

Если ваша основная цель на этот год – прокачаться в использовании AI в разработке, то вы не одни. Все пытаются разобраться и в том, как оптимально использовать агентов самому, и в том, а как под это дело перестроить процессы в команде. Но поставить цель легче, чем ее достичь. State-of-the-art модели, инструменты и подходы меняются каждую неделю, лучшие практики ещё не устоялись, а городские сумасшедшие либо хоронят программирование, либо пытаются нафармить просмотры за ваш счет.

Мы в Подлодке хотим помочь опытным инженерам, которые учатся работать с AI – да что там, и самим себе тоже. Поэтому в начале марта мы запустили Podlodka AI Engineers Club – закрытое сообщество для тех, кто уже пробует AI в работе и хочет делать это системно, а не на ощупь.

👉Что внутри. Каждую неделю – воркшопы и лайвкодинги с людьми, которые внедряют AI в реальных продуктах. Разбор конкретных инженерных практик: как строить своих агентов, как работать по Spec-Driven Development, как собирать комбайн, превращающий таски Jira в PRы, как масштабировать это на команду и в бигтехе, и в небольшом стартапе.

Между встречами – сеть закрытых чатов в Telegram, клубные созвоны с шарингом опыта, random coffee, совместные эксперименты с AI.

👉Кто уже в программе. Среди экспертов – инженеры из компаний разного масштаба: Степан Гончаров (xAI), Роман Елизаров (Яндекс), Андрей Бреслав (CodeSpeak), Денис Неклюдов (Google), Алексей Козятинский (Cursor) и много других крутых ребят. Полная программа на март-апрель есть на сайте.

👉А кто в клубе. Мы собрали уже 350 инженеров с медианным опытом 12 лет – российский и зарубежный бигтех, банки, стартапы. Большинство уже активно используют агентов в своей работе, поэтому обсуждаем прямо прикладные вопросы. У кого-то в компаниях AI внедряется очень активно, а кто-то работает в супер зарегулированных отраслях, где запрещено почти все – так что мы собираем весь спектр проблем.

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

Подробности, расписание и заявка – на сайте. А если есть какие-то конкретные вопросы, пишите прямо в личку @etolstoy!
🤣5😎43👍3
Делаем жизнь пользователя проще и выводим в топ свои Android-приложения: 26 марта hh.ru проведёт митап по Android-разработке

В программе доклады от экспертов:
• Константин Дубинко (hh.ru) поделится опытом ухода от навигации на базе Fragment и Cicerone в сторону чистого Compose при помощи навигационной библиотеки Modo.
• Денис Конопелькин (Циан) расскажет, как ускорить проверки в Android‑проекте с помощью Impact‑анализа.
• Максим Качинкин (Dodo Engineering) разберет, как проектировать ИИ-фичи в мобильном приложении, когда ИИ живет не на бэкенде, а на клиенте.

Подписывайся на канал Охэхэнные новости и регистрируйся на митап. Встречаемся 26 марта!
3👍3😁3💅2
Android Good Reads
Итак, вопрос с собеседования! Чем отличается Dispatchers.Main от Dispatchers.Main.immediate Внутри разбирают с картинками: 👉 А что если продьюсить на Main, а консьюмить на immediate. И вообще перебрать всевозможные комбинации? 👉 А зачем выбирать immediate?…
Coroutine Dispatcher in Android: Полный гайд

Очередной полный гайд о том как надо и как не надо и в каких ситуациях. Можно кидаться им в тех, кто в вашем окружении сует везде withContext(Dispatchers.IO) и потом внутри withContext(Dispatchers.Main)

Офф дока в догонку: https://kotlinlang.org/docs/coroutine-context-and-dispatchers.html
🔥10👍52
Немножко накинул на вентилятор про современное состояние AI
@androidraft
AI не сделает вас богатым, а исправление ошибок в AI slopware сделает

Ради интереса попросили топовые LLM (Claude, ChatGPT, Gemini) написать простейшую апку: стянуть данные из трех API и обработать. Итог? Все три выдали последовательные вызовы без какого-либо кэширования. Зато с красивыми комментариями и претензией на production-ready

О чем это говорит:

👉 ИИ плодит спагетти-код. Это уровень ленивого студента. Внешне выглядит чисто, но на деле страница рендерится минуту, как на диалапе в 1995-м
👉 У LLM нет инженерной интуиции. Они не понимают вычислительную сложность, алгоритмы и причины, по которым архитектура ляжет уже при 100 юзерах
👉 Бизнес копит самый дорогой техдолг в истории. Компании, поверившие в AI-first, скоро столкнутся с дикими тормозами и космическими счетами за инфраструктуру. А их «10х-инженеры» с нейросетями по факту окажутся 0.5х-инженерами

Что в итоге:
Пока инфоцыгане продают курсы по «правильному промптингу», качайте фундаментальные навыки

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

Пост о статье писал в рамках упражнения Dissoi logoi, ибо я слишком верю в революцию ИИ
😁14🤨53🤔1🤣1
Android Good Reads
HotReload теперь доступен тем, кто работает с Compose Если вы скучаете по заброшенному и сломанному instant run, или немного завидовали друзьям с Flutter и React Native, которые обновляют UI во время разработки моментально - то теперь и вы так же можете делать…
This media is not supported in your browser
VIEW IN TELEGRAM
HotSwan - Android hot reload for Jetpack Compose

Теперь чисто под Android нативный таргет. Установка простая в app модуль через плагин. Пробуем!

Либа JB под JVM таргет специфична (только KMP проект)
HotSwan под Android таргет (и в KMP проекте тоже)


На гифку надо кликнуть, чтоб открылась в хорошем качестве
5👍4🔥2