TGViewer
Channel Public Channel
Android Good Reads

Android Good Reads

@droidgr

Самые интересные статьи, видео и новости, связанные с Android разработкой. Не больше трёх материалов в день.

Размещение рекламы: @tanyasanovna
Subscribers
4.03K
Photos
420
Videos
17
Links
2.2K

Showing posts older than #2300 · Back to latest

Older Posts 20 shown
Post #2299 2.79K
Сегодня, кстати, начинается следующая важная конференция - KotlinConf. Записи будут доступны позже на сайте, а прямая трансляция начинается через 10 минут.

Неделя насыщенная на новости по андроид разработке.
KotlinConf KotlinConf 2027, Apr 21–23, Kraków KotlinConf is the official Kotlin conference by JetBrains. It is a place for the community to gather and discuss all things Kotlin.
  • 🔥 5
  • ❤ 2
  • 👍 2
Post #2298 2.55K
Android Good Reads Сегодня стартует Google I/O 2025. Самая интересная для нас с вами часть тут
По чуть-чуть будем обозревать новости с Google I/O. Первое на что обращаем внимание - очередная навигация. Из плюсов - большая гибкость и больше контроля над навигацией в приложении. Как следствие - возможное переусложнение навигации, необходимость миграции и невероятные велосипеды в каждой компании.

Немного кода с Nav3:

// Define the routes in your app and any arguments.
data object Home
data class Product(val id: String)

// Create a back stack, specifying the route the app should start with.
val backStack = remember { mutableStateListOf<Any>(ProductList) }

// A NavDisplay displays your back stack. Whenever the back stack changes, the display updates.
NavDisplay(
backStack = backStack,

// Specify what should happen when the user goes back
onBack = { backStack.removeLastOrNull() },

// An entry provider converts a route into a NavEntry which contains the content for that route.
entryProvider = { route ->
when (route) {
is Home -> NavEntry(route) {
Column {
Text("Welcome to Nav3")
Button(onClick = {
// To navigate to a new route, just add that route to the back stack
backStack.add(Product("123"))
}) {
Text("Click to navigate")
}
}
}
is Product -> NavEntry(route) {
Text("Product ${route.id} ")
}
else -> NavEntry(Unit) { Text("Unknown route: $route") }
}
}
)
  • 🔥 7
  • 🤔 4
  • 💯 3
  • 😁 1
Post #2295 3.09K
Proto vs JSON. Когда и что использовать?

JSON:
👉 Делаете публичное API
👉 Для быстрых прототипов
👉 Когда хочется видеть человеко-читаемую конфигурацию

Proto:
👉 IoT и Realtime системы
👉 Внутренние приложения, зависящие от скорости интернета
👉 Межсерверное взаимодействие
  • 👍 7
  • 🤨 3
  • ❤ 2
Post #2293 2.9K
Post #2292 2.83K
Используем movableContentOf для shared transition анимации в Jetpack Compose

Все достаточно просто. Как и в любой анимации мы определяем ее scope с помощью LookaheadScope. Накидываем AnimatePlacementNodeElement и определяем список Composable элементов для перемещения через movableContentOf.

Примеры кода внутри статьи!
  • 👍 9
  • 🔥 3
  • ❤ 2
  • 😁 1
Post #2291 3.05K
Android Studio Meerkat Feature Drop теперь стабильна! Полгода от Canary до релиза по новому циклу.
Внутри подтянули обновление от IDEA, k2 mode и много AI улучшений.
Из приятного улучшили терминал, дебаггер и App Quality Insights с интеграцией в Play Store и Firebase Crashlytics.
Android Developers Blog Android Studio Meerkat Feature Drop is stable Download the Android Studio Meerkat Feature Drop (2024.3.2) with key features like Gemini Prompt Library, improved KMP integration, and more.
  • 🔥 8
  • 👍 2
Post #2290 3.35K
Хорошая новость этой недели! Compose Multiplatform вышел в релиз!
Из главного:
👉 Стабильность и перформанс, стабильность и перформанс!
👉 iOS полностью стабилен. Завезли немного нативного функционала (жесты, drag-n-drop, RTL поддержка ...)
👉 Множество апи вышло из стадии экспериментальных в стабильные!
👉 Улучшили холодный старт, перформанс приложения при скролле, а так же оптимизировали размер собираемого приложения
👉 Еще раз напомнили про hot-reload. Успели попробовать?

Очевидно, релиз под грядущий Kotlin Conf. Возможно, на самой конференеции будут еще анонсы, но уже сегодня я затаскиваю версию 1.8.0 в наше приложение
  • 🔥 15
  • 🫡 4
  • 👍 2
Post #2287 2.92K
Разбираем context параметры в Kotlin 2.2.0

Анонс был, а прикладных примеров еще не было. Внутри примеры с тем как делать логирование и DI.
Из приятных плюсов:
- Убирает шаблонный код
- Повышение читабельности и поддерживаемости
- Типобезопасность

Пример комбинации с Extension функцией:
// Extension function with context parameter
context(txManager: TransactionManager)
fun List<Transaction>.processAllInTransaction() {
txManager.beginTransaction()
try {
forEach { it.process() }
txManager.commitTransaction()
} catch (e: Exception) {
txManager.rollbackTransaction()
throw e
}
}

// Usage
with(transactionManager) {
transactions.processAllInTransaction()
}
  • 👍 11
  • 🔥 3
  • 👎 2
  • 👌 2
Post #2280 3.25K
Разница между job.cancel() и scope.cancel()

👉 job.cancel() тормозит конкретную корутину
👉 scope.cancel() тормозит весь скоуп и все корутины в нем
👉 Можно остановить все корутины в скоупе, но не прибивать сам скоуп с помощью scope.coroutineContext.cancelChildren()
👉 viewModelScope и lifecycleScope останавливаются сами, не нужно этого делать вручную

Внутри статьи больше примеров и аналогий, если вы теряетесь в понимании что есть что
Medium Kotlin Coroutines: The real difference between Job.cancel() and Scope.cancel() Stop the confusion around coroutine cancellation in Kotlin with this simple breakdown.
  • 👍 9
Post #2278 3.45K
Разбираем порядок вызова DisposableEffect, LaunchedEffect и Composable

Если кратко - сначала вызывается композиция всех Composable и регистрируются блоки Effect, а затем вызываются сами эффекты. DisposableEffect, SideEffect, SnapshotFlow ... вызываются раньше чем LaunchedEffect, так как первые это синхронный вызов, запускающиеся сразу после композиции, а последний стартует корутину с помощью Recomposer.

Немного интереснее становится при навигации. Сначала будут вызваны эффекты на новом экране и только потом onDispose с экрана с которого ушли. Все это призвано убрать глитчи при переходе между экранами.
Medium Understanding Execution Order in Jetpack Compose: DisposableEffect, LaunchedEffect, and Composables. Who runs first in Jetpack Compose? 🤔 Dive into the execution order of Composables, LaunchedEffect & DisposableEffect.
  • 👍 17
  • 🔥 5
  • ❤ 3
  • 🤔 1
Post #2276 2.69K
Как K2 mode помогает работать IDE быстрее

Режим K2 вводит новый анализатор кода, общий для компилятора Kotlin и IDE. Он заменяет implicit laziness поэтапным подходом к анализу кода, где каждый этап анализирует определённые части кода и добавляет семантическую информацию в абстрактное синтаксическое дерево (AST). Хотя ядро компилятора остаётся однопоточным, логика разрешения теперь устойчива к параллелизму, что позволяет одновременно анализировать несколько инициализаций
  • 👍 8
  • ❤ 2
  • 🌚 1
Post #2274 3.17K
Очень тихо зарелизилось мощное улучшение для App Distribution - AI testing agent. Как по мне, это самое полезное для Android разработки из последних релизов в области AI. Кратко:
The App Testing agent is a test case generation, management, and execution agent powered by Gemini in Firebase. You define test goals in natural language, and the agent uses AI to understand and navigate your app, simulate user interactions, and provide detailed test results.

Прошли времена описания тестов на естественном языке (Gherkin + Cucumber). Выглядит все оч просто - вы задаете название, цель, подсказки и критерии приемки. Тесты запускаются в облаке на девайсах.
  • 🔥 17
  • 👍 3
  • ❤ 2
Post #2273 3.07K
Дебажим корутины прямо в Android Studio

Дебажить асинхронщину это всегда проблема. Предлагается 3 способа:
👉 Классическое логирование println( “${msg} | currentThread: ${Thread.currentThread().name}”)
👉 VM option в конфигурации при запуске сборки: -Dkotlinx.coroutines.debug
👉 При помощи DebugProbes можно получить состояние корутины в ходе тестов. Более подробно внутри статьи (Option 4)
  • 👍 7
  • 🔥 3
Post #2272 3.64K
Ищем ненужные зависимости в Dagger/Hilt графе

В большом проекте - большой граф зависимостей компонентов, с лишними инжектами. Проблема решается с помощью Dagger SPI.
Автор предлагает с помощью SPI строить полное дерево зависимостей, а затем вытаскивать наружу неиспользуемые инжекты.

На малом проекте, проще это все проверять руками, но если у вас гигантский многомодульный проект, то прогнать разок весь проект с легаси модулями по инструкции из статьи будет полезно для приложения.
  • 👍 6
  • ❤ 2
  • 🔥 2
Post #2270 2.71K
Анализируем время сборки и рисуем графики

👉 Базовый Build Analyzer из Android studio покажет куда тратиться основная масса времени в сборке.
👉 Аналогичный репорт можно получить через ./gradlew --profile assemble[Flavor]Debug.
👉 Так же скан можно выгрузить в web и пошарить с коллегами через ./gradlew --scan. Там вы увидите более подробную разбивку по затраченному времени на тот или иной шаг сборки
👉 Gradle Profiler и благодаря его удобной функции - сценарии, можно получить наглядную статистику. Больше примеров тут
  • 👍 12
  • ❤ 3
Post #2269 2.49K
Никогда не знаешь какой следующий фреймворк выстрелит, поэтому сегодня следим за Metro.

Легковесный compile-time DI без излишеств. Все фичи с примерами тут. Из приятного - поддержка KMP из коробки.

Основная репа: https://github.com/zacsweers/metro (260 ⭐️)
Документация: https://zacsweers.github.io/metro/?ref=zacsweers.dev
Zac Sweers Introducing Metro I'm excited to share something new I've been working on the past few months!
  • 👍 8
  • 🔥 2
  • 👎 1
  • 🤔 1
Post #2268 3.32K
Пишем тесты для compose навигации

Все благодаря type-safe навигации, представленной недавно. Внутри статьи вариант для старого подхода и способ миграции его на новый подход. Для тестов используется TestNavHostController, позволяющий верифицировать экран на котором находимся. Пример:

@Test
fun whenUserIsInBookSearch_andClickOnABook_verifyDestinationIsBookDetail() {
// User is in BookSearch
composeTestRule.runOnUiThread {
navController.setCurrentDestination(NavigationRoutes.BOOK_SEARCH)
}

// User clicks on the first book
composeTestRule.onAllNodesWithTag(bookCardTestTag)[0].performClick()
assertTrue { navController.currentDestination?.route == NavigationRoutes.BOOK_DETAIL }
}


Выглядит очень просто, в связи с чем вопрос: Тестирование навигации это тесты ради тестов или валидный способ проверки бизнес-логики?
  • ❤ 2
  • 💯 2
  • 👍 1
Post #2267 3.79K
Ныне популярный vibe-coding теперь и в Android Studio благодаря Firebender!

По своей сути, то же самое, что и Cursor, Trae и windsurf, но встроено внутрь Android Studio. Демо для тех кто слышит об этом впервые можно глянуть тут: https://firebender.com/

Это кратно удобнее, чем задавать вопросы в чат. Доступны как популярные модели claude-3.7, так и локально запущенные llm. Пробовали ли на своих проектах работу с AI агентами в паре?
  • 🔥 11
  • 🗿 9
  • 👍 2
  • 🤣 2
  • ❤ 1
  • 👎 1
  • 👨‍💻 1
Post #2266 4.68K
Android Good Reads JetBrains исследует возможность добавить Hot Reload в Compose https://github.com/JetBrains/compose-hot-reload (404 ⭐️) Мультиплатформа тоже поддерживается, судя по всему. Для сборки используеть отдельная версия официальных плагинов (2.1.0-firework.31) и сам…
HotReload теперь доступен тем, кто работает с Compose

Если вы скучаете по заброшенному и сломанному instant run, или немного завидовали друзьям с Flutter и React Native, которые обновляют UI во время разработки моментально - то теперь и вы так же можете делать с Compose!

Кстати! Недавний опрос показал, что большинство уже успело поработать с Compose, а значит эта фича приятно дополнит ваш рабочий процесс.

HotReload живет в отдельном репозитории: https://github.com/JetBrains/compose-hot-reload
  • 🔥 16
  • 👍 3
Older posts →
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →