Разбираемся в разнице между try-catch и runCatching
👉
👉
👉 Легко заменить
👉 Проще отлавливать вложенные
Зеркало с примерами. С
👉
runCatching
возвращает Result, что позволяет использовать экстеншены с Result и поддерживать функциональный стиль кода👉
runCatching
это скоуп функция, поэтому все возможности скоуп функций доступны👉 Легко заменить
try-catch
с пустым catch
блоком на runCatching
👉 Проще отлавливать вложенные
exception
Зеркало с примерами. С
runCatching
код выглядит чище и в одном стиле.Medium
Kotlin Tips and Tricks You May Not Know: #7 — Goodbye try-catch, Hello runCatching!
A cleaner way to handle exceptions in Kotlin with runCatching.
Android Good Reads
Compose 👨💻 👉 Релиз androidx.media3:media3-ui-compose, UI для ExoPlayer через Compose будет рисовать проще 👉 Проблемы с изменением размера ModalBottomSheet ? 👉 Норм ли ранний дроп в @Composable? @Composable fun Label(val label: String?) { if(label ==…
Compose 😎
👉 Обновления: BOM ->
Минорные библиотеки:
👉 Зачем нужно прокидывать Initial State?
👉 Можно ли сделать горизонтально-прокручиваемый
В связи с этим, небольшой опрос о состоянии Compose в вашем проекте
👉 Обновления: BOM ->
2025.03.00
, Material3 теперь 1.4.0-alpha10
с кучей обновлений API, а Compose получил первый RC для версии 1.8.0. Ждем?Минорные библиотеки:
androidx.activity:activity-compose:1.11.0-alpha01
androidx.lifecycle:lifecycle-runtime-compose:2.9.0-alpha12
androidx.lifecycle:lifecycle-runtime-compose-android:2.9.0-alpha12
androidx.lifecycle:lifecycle-runtime-compose-jvmstubs:2.9.0-alpha12
androidx.lifecycle:lifecycle-runtime-compose-linuxx64stubs:2.9.0-alpha12
androidx.lifecycle:lifecycle-viewmodel-compose:2.9.0-alpha12
androidx.lifecycle:lifecycle-viewmodel-compose-android:2.9.0-alpha12
androidx.lifecycle:lifecycle-viewmodel-compose-desktop:2.9.0-alpha12
androidx.media3:media3-ui-compose:1.6.0-rc01
androidx.navigation:navigation-compose:2.8.9
androidx.navigation:navigation-compose:2.9.0-alpha08
androidx.navigation:navigation-compose-android:2.9.0-alpha08
androidx.navigation:navigation-compose-jvmstubs:2.9.0-alpha08
androidx.navigation:navigation-compose-linuxx64stubs:2.9.0-alpha08
androidx.navigation:navigation-fragment-compose:2.8.9
androidx.navigation:navigation-fragment-compose:2.9.0-alpha08
androidx.savedstate:savedstate-compose:1.3.0-alpha10
androidx.savedstate:savedstate-compose-android:1.3.0-alpha10
androidx.savedstate:savedstate-compose-jvmstubs:1.3.0-alpha10
androidx.savedstate:savedstate-compose-linuxx64stubs:1.3.0-alpha10
👉 Зачем нужно прокидывать Initial State?
👉 Можно ли сделать горизонтально-прокручиваемый
FlowRow
?В связи с этим, небольшой опрос о состоянии Compose в вашем проекте
Please open Telegram to view this post
VIEW IN TELEGRAM
Compose за прошедший год
Final Results
14%
Недавно начали миграцию на Compose
29%
Давно начали миграцию на Compose, еще в процессе
35%
Уже все на compose
22%
Мы остаемся верны XML
Защищаемся от MITM атак
Немного про безопасноть можно почитать тут OWASP Mobile 2024, а что можно предпринять, во избежании проблем:
👉 Использования
👉 Certificate Pinning, для предотвращения подмены сертификата. Тут, возможно, надо чуть больше подумать над реализацией, чтобы приложение не сломалось при изменениях сертификата.
👉 Использование Strong Network Security Configuration, которое, в целом, дает все преимущества первых двух пунктов, но работает начиная с Android 7.0
👉 Корректная валидация SSL/TLS сертификатов и отключение поддержки устаревших протоколов.
Есть ли у вас в проекте
Немного про безопасноть можно почитать тут OWASP Mobile 2024, а что можно предпринять, во избежании проблем:
👉 Использования
HTTPS
с TLS 1.2
, 1.3
. Валидные SSL/TLS
сертификаты. Использовать HSTS
(HTTP Strict Transport Security), который не позволяет свалиться обратно к HTTP
<network-security-config>
<domain-config cleartextTrafficPermitted="false">
<domain includeSubdomains="true">yourdomain.com</domain>
</domain-config>
</network-security-config>
👉 Certificate Pinning, для предотвращения подмены сертификата. Тут, возможно, надо чуть больше подумать над реализацией, чтобы приложение не сломалось при изменениях сертификата.
val client = OkHttpClient.Builder()
.certificatePinner(
CertificatePinner.Builder()
.add("yourdomain.com", "sha256/your-certificate-hash")
.build()
)
.build()
👉 Использование Strong Network Security Configuration, которое, в целом, дает все преимущества первых двух пунктов, но работает начиная с Android 7.0
<network-security-config>
<domain-config cleartextTrafficPermitted="false">
<domain includeSubdomains="true">yourdomain.com</domain>
<pin-set>
<pin digest="SHA-256">your-certificate-hash</pin>
</pin-set>
</domain-config>
</network-security-config>
👉 Корректная валидация SSL/TLS сертификатов и отключение поддержки устаревших протоколов.
val sslSocketFactory = SSLContext.getInstance("TLSv1.3").apply { init(null, null, null) }.socketFactory
val client = OkHttpClient.Builder()
.sslSocketFactory(sslSocketFactory, TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()).trustManagers[0] as X509TrustManager)
.build()
Есть ли у вас в проекте
TrustManager
с доверием к любым сертифкатам без лишних вопросов?Используем UseCase как функцию из DI
Идея в том чтобы описать функцию, использующую DI для обработки входных данных. В итоге получим тестируемую функцию, которую можно переиспользовать
Пример:
Ну а внутри
Удобно и понятно на что писать тесты! Используем?
Идея в том чтобы описать функцию, использующую DI для обработки входных данных. В итоге получим тестируемую функцию, которую можно переиспользовать
Пример:
public class GoodReadsUseCase @Inject public constructor(
private val repository: Repository,
private val manager: Manager,
private val clock: Clock
) {
public suspend operator fun invoke(params: Params): Boolean {
return someServerLogic
}
}
Ну а внутри
ViewModel
это будет выглядеть как то так:
public class ViewModel @Inject constructor(
private val useCase: GoodReadsUseCase
) {
public suspend fun read(params: Params) {
val isBool = useCase(params)
}
}
Удобно и понятно на что писать тесты! Используем?
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
Если вы скучаете по заброшенному и сломанному instant run, или немного завидовали друзьям с Flutter и React Native, которые обновляют UI во время разработки моментально - то теперь и вы так же можете делать с Compose!
Кстати! Недавний опрос показал, что большинство уже успело поработать с Compose, а значит эта фича приятно дополнит ваш рабочий процесс.
HotReload живет в отдельном репозитории: https://github.com/JetBrains/compose-hot-reload
Ныне популярный vibe-coding теперь и в Android Studio благодаря Firebender!
По своей сути, то же самое, что и Cursor, Trae и windsurf, но встроено внутрь Android Studio. Демо для тех кто слышит об этом впервые можно глянуть тут: https://firebender.com/
Это кратно удобнее, чем задавать вопросы в чат. Доступны как популярные модели
По своей сути, то же самое, что и Cursor, Trae и windsurf, но встроено внутрь Android Studio. Демо для тех кто слышит об этом впервые можно глянуть тут: https://firebender.com/
Это кратно удобнее, чем задавать вопросы в чат. Доступны как популярные модели
claude-3.7
, так и локально запущенные llm
. Пробовали ли на своих проектах работу с AI агентами в паре?Пишем тесты для 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 }
}
Выглядит очень просто, в связи с чем вопрос: Тестирование навигации это тесты ради тестов или валидный способ проверки бизнес-логики?
Никогда не знаешь какой следующий фреймворк выстрелит, поэтому сегодня следим за Metro.
Легковесный compile-time DI без излишеств. Все фичи с примерами тут. Из приятного - поддержка KMP из коробки.
Основная репа: https://github.com/zacsweers/metro (260⭐️ )
Документация: https://zacsweers.github.io/metro/?ref=zacsweers.dev
Легковесный compile-time DI без излишеств. Все фичи с примерами тут. Из приятного - поддержка KMP из коробки.
Основная репа: https://github.com/zacsweers/metro (260
Документация: https://zacsweers.github.io/metro/?ref=zacsweers.dev
Please open Telegram to view this post
VIEW IN TELEGRAM
Zac Sweers
Introducing Metro
I'm excited to share something new I've been working on the past few months!
Анализируем время сборки и рисуем графики
👉 Базовый Build Analyzer из Android studio покажет куда тратиться основная масса времени в сборке.
👉 Аналогичный репорт можно получить через
👉 Так же скан можно выгрузить в web и пошарить с коллегами через
👉 Gradle Profiler и благодаря его удобной функции - сценарии, можно получить наглядную статистику. Больше примеров тут
👉 Базовый Build Analyzer из Android studio покажет куда тратиться основная масса времени в сборке.
👉 Аналогичный репорт можно получить через
./gradlew --profile assemble[Flavor]Debug
. 👉 Так же скан можно выгрузить в web и пошарить с коллегами через
./gradlew --scan
. Там вы увидите более подробную разбивку по затраченному времени на тот или иной шаг сборки 👉 Gradle Profiler и благодаря его удобной функции - сценарии, можно получить наглядную статистику. Больше примеров тут
RuStore — российский стор для Android, в котором можно публиковать приложения на более чем 50-миллионную аудиторию, подключать платежное SDK и монетизировать свои продукты.
Сейчас команда работает над следующими обновлениями и проводит исследование о магазинах приложений, чтобы сделать RuStore еще удобнее для пользователей и разработчиков.
👉 Примите участие в опросе (ссылка) — это займет всего 5 минут, зато даст команде объективную обратную связь.
Исследование анонимно и конфиденциально, а все данные будут использованы для анализа только в обобщенном виде.
Сейчас команда работает над следующими обновлениями и проводит исследование о магазинах приложений, чтобы сделать RuStore еще удобнее для пользователей и разработчиков.
👉 Примите участие в опросе (ссылка) — это займет всего 5 минут, зато даст команде объективную обратную связь.
Исследование анонимно и конфиденциально, а все данные будут использованы для анализа только в обобщенном виде.
Ищем ненужные зависимости в Dagger/Hilt графе
В большом проекте - большой граф зависимостей компонентов, с лишними инжектами. Проблема решается с помощью Dagger SPI.
Автор предлагает с помощью SPI строить полное дерево зависимостей, а затем вытаскивать наружу неиспользуемые инжекты.
На малом проекте, проще это все проверять руками, но если у вас гигантский многомодульный проект, то прогнать разок весь проект с легаси модулями по инструкции из статьи будет полезно для приложения.
В большом проекте - большой граф зависимостей компонентов, с лишними инжектами. Проблема решается с помощью Dagger SPI.
Автор предлагает с помощью SPI строить полное дерево зависимостей, а затем вытаскивать наружу неиспользуемые инжекты.
На малом проекте, проще это все проверять руками, но если у вас гигантский многомодульный проект, то прогнать разок весь проект с легаси модулями по инструкции из статьи будет полезно для приложения.
Дебажим корутины прямо в Android Studio
Дебажить асинхронщину это всегда проблема. Предлагается 3 способа:
👉 Классическое логирование
👉 VM option в конфигурации при запуске сборки:
👉 При помощи DebugProbes можно получить состояние корутины в ходе тестов. Более подробно внутри статьи (Option 4)
Дебажить асинхронщину это всегда проблема. Предлагается 3 способа:
👉 Классическое логирование
println( “${msg} | currentThread: ${Thread.currentThread().name}”)
👉 VM option в конфигурации при запуске сборки:
-Dkotlinx.coroutines.debug
👉 При помощи DebugProbes можно получить состояние корутины в ходе тестов. Более подробно внутри статьи (Option 4)
Обмениваемся опытом, общаемся и тусим: Яндекс Вертикали зовут мобильных разработчиков на Vertis Mobile Meetup
17 мая в 14:00 Яндекс Вертикали проведут бесплатный мобильный митап для разработчиков на iOS и Android в Москве. Если не сможете присутствовать офлайн — подключайтесь к трансляции!
В программе митапа — выступления спикеров, дискуссии с экспертами, активности с призами и, конечно же, нетворкинг с афтепати.
Ребята из Авто.ру и Яндекс Путешествий расскажут:
• Как эффективно работать со сложными дизайн-макетами с помощью SwiftUI Layout Protocol
• Почему скриншот-тесты в Compose — это удобно
• С какими сложностями при разработке App Clip вы можете столкнуться
• Возможности KSP для автоматизации рутинных задач
Регистрируйтесь и смотрите расписание здесь.
17 мая в 14:00 Яндекс Вертикали проведут бесплатный мобильный митап для разработчиков на iOS и Android в Москве. Если не сможете присутствовать офлайн — подключайтесь к трансляции!
В программе митапа — выступления спикеров, дискуссии с экспертами, активности с призами и, конечно же, нетворкинг с афтепати.
Ребята из Авто.ру и Яндекс Путешествий расскажут:
• Как эффективно работать со сложными дизайн-макетами с помощью SwiftUI Layout Protocol
• Почему скриншот-тесты в Compose — это удобно
• С какими сложностями при разработке App Clip вы можете столкнуться
• Возможности KSP для автоматизации рутинных задач
Регистрируйтесь и смотрите расписание здесь.
Как K2 mode помогает работать IDE быстрее
Режим K2 вводит новый анализатор кода, общий для компилятора Kotlin и IDE. Он заменяет implicit laziness поэтапным подходом к анализу кода, где каждый этап анализирует определённые части кода и добавляет семантическую информацию в абстрактное синтаксическое дерево (AST). Хотя ядро компилятора остаётся однопоточным, логика разрешения теперь устойчива к параллелизму, что позволяет одновременно анализировать несколько инициализаций
Режим K2 вводит новый анализатор кода, общий для компилятора Kotlin и IDE. Он заменяет implicit laziness поэтапным подходом к анализу кода, где каждый этап анализирует определённые части кода и добавляет семантическую информацию в абстрактное синтаксическое дерево (AST). Хотя ядро компилятора остаётся однопоточным, логика разрешения теперь устойчива к параллелизму, что позволяет одновременно анализировать несколько инициализаций
Тут Контур.Толк запустил резюме встреч
Это сервис коммуникаций, который объединяет встречи, чаты, доски и вебинары. Теперь Толк сам генерирует саммари созвона, нужно только включить запись.
Работает это так: после встречи ИИ обрабатывает запись, создает расшифровку и анализирует содержание беседы. Затем создается краткий пересказ разговора.
Пользователи, которые уже используют резюме, отметили — на подведение итогов созвона нужно в 3 раза меньше времени: в среднем 8 минут вместо получаса.
Фича уже доступна всем пользователям. Чтобы протестовать, переходите и регистрируйтесь в Толке. Подробнее о релизе в статье.
А новость еще раз доказывает, что ИИ забирает не работу, а рутинную часть. Хоть нейронка и написала, о чем договорились на встрече, задачи все равно делать самим.
Инструмент уже доступен. Регистрируйтесь в Толке и тестируйте обновление — это бесплатно.
Это сервис коммуникаций, который объединяет встречи, чаты, доски и вебинары. Теперь Толк сам генерирует саммари созвона, нужно только включить запись.
Работает это так: после встречи ИИ обрабатывает запись, создает расшифровку и анализирует содержание беседы. Затем создается краткий пересказ разговора.
Пользователи, которые уже используют резюме, отметили — на подведение итогов созвона нужно в 3 раза меньше времени: в среднем 8 минут вместо получаса.
Фича уже доступна всем пользователям. Чтобы протестовать, переходите и регистрируйтесь в Толке. Подробнее о релизе в статье.
А новость еще раз доказывает, что ИИ забирает не работу, а рутинную часть. Хоть нейронка и написала, о чем договорились на встрече, задачи все равно делать самим.
Инструмент уже доступен. Регистрируйтесь в Толке и тестируйте обновление — это бесплатно.
Разбираем порядок вызова
Если кратко - сначала вызывается композиция всех
Немного интереснее становится при навигации. Сначала будут вызваны эффекты на новом экране и только потом
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.
Android-разработчик в команду MAX в VK, Москва или Санкт-Петербург (офис/гибрид/удалённо)
MAX — платформа с амбициями стать цифровой экосистемой. Сейчас это бета-версия, однако уже включает в себя и мессенджер, и денежный сервис, и звонки, и искусственный интеллект, и мини-приложения.
Задачи разработчику предстоят разные — от улучшения кода, профилирования и ускорения приложения до проектирования и внедрения фич.
Нужны уверенные знания в Kotlin и работе с многопоточностью, глубокое понимание Android SDK, умение оптимизировать для плавной работы на слабых и бюджетных устройствах и также понимание сетевых технологий. А ещё желание делать удобный и незаменимый продукт, которым будут пользоваться буквально все.
👉 Откликайтесь!
MAX — платформа с амбициями стать цифровой экосистемой. Сейчас это бета-версия, однако уже включает в себя и мессенджер, и денежный сервис, и звонки, и искусственный интеллект, и мини-приложения.
Задачи разработчику предстоят разные — от улучшения кода, профилирования и ускорения приложения до проектирования и внедрения фич.
Нужны уверенные знания в Kotlin и работе с многопоточностью, глубокое понимание Android SDK, умение оптимизировать для плавной работы на слабых и бюджетных устройствах и также понимание сетевых технологий. А ещё желание делать удобный и незаменимый продукт, которым будут пользоваться буквально все.
👉 Откликайтесь!
Разница между
👉
👉
👉 Можно остановить все корутины в скоупе, но не прибивать сам скоуп с помощью
👉
Внутри статьи больше примеров и аналогий, если вы теряетесь в понимании что есть что
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.