База знаний android
1 subscriber
2.48K photos
284 videos
2 files
3.77K links
Download Telegram
AdaEngine – новый игровой движок на Swift

AdaEngine – 2D игровой движок, построенный вокруг паттерна Entity Component System. Есть поддержка физики, кастомных шейдеров и описания интерфейса на SwiftUI.

Только-только вышел первый публичный релиз, если есть вопросы, пишите автору – @SpectralDragon.
Forwarded from Mobile Developer
🔧 Краши SavedStateHandle в Navigation 3 и как их лечит Hilt Assisted Injection
https://proandroiddev.com/resolving-savedstatehandle-crashes-with-hilt-assisted-injection-in-jetpack-navigation-3-63ebd50b88af

Боль при миграции на Nav3: код из Nav2, где ViewModel читал аргументы маршрута из SavedStateHandle через toRoute(), внезапно крашится. Причина - Nav3 больше не пропихивает Route в SavedStateHandle автоматически.

Решение в статье - Hilt Assisted Injection: аргументы получает не SavedStateHandle, а сам конструктор ViewModel через Assisted. ViewModel становится независимым от навигации, его можно конструировать прямо в тестах с конкретными значениями.

Внутри - полный пример с Serializable Route'ами, фабрикой, регистрацией в entryProvider DSL и тестовым кейсом.

——————
💭 Переезжаешь на Nav3 и ловишь null в SavedStateHandle - как вариант к решению.

Telegram | Селеба | Max | YouTube
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from StartAndroid
Вышел Kotlin 2.4.0 

Что нового:
- Language: Stable context parameters, explicit backing fields, and multiple features for annotation use-site targets.
- Standard library: Stabilized support for the UUID API and support for checking sorted order.
- Kotlin/JVM: Support for Java 26 and annotations in metadata enabled by default.
- Kotlin/Native: Support for Swift packages as dependencies, updates on Swift export, and the CMS GC enabled by default.
- Kotlin/Wasm: Incremental compilation enabled by default and support for WebAssembly Component Model.
- Kotlin/JS: Support for value class export and ES2015 features in JS code inlining.
- Gradle: Compatibility with Gradle 9.5.0.
- Maven: Automatic alignment between Java and JVM target versions.
- Kotlin compiler: More consistent inline function behavior during .klib compilation.

#kotlin

https://blog.jetbrains.com/kotlin/2026/06/kotlin-2-4-0-released/
Уже попробовали новый синтаксис создания коллекций?
Final Results
4%
Да
52%
Нет
34%
Нафиг нужно
10%
Не участвую
Forwarded from Compose Broadcast
This media is not supported in your browser
VIEW IN TELEGRAM
⚙️ Compose Navigation Graph: вся навигация приложения интерактивной картой прямо в Android Studio

🐱 Плагин от skydoves (Jaewoong Eum). Аннотируешь экраны @NavDestination, @NavEdge, @NavGraphRoot, KSP статически собирает граф, а IDE-плагин рисует карту: каждый экран отрендеренной @Preview-миниатюрой через Layoutlib, без эмулятора. Переходы стрелками, двойной клик прыгает в исходник, граф мёржится по всем модулям. Канвас редактируемый — тянешь связь от экрана к экрану, и плагин сам вписывает @NavEdge в код.

Работает с Navigation 3, Navigation 2 и даже голыми Activity. KMP из коробки: аннотации в commonMain, есть сэмпл на KotlinConf-приложении (26 экранов, 36 переходов).

Бонусом .nav baseline по аналогии с apiDump/apiCheck: navCheck валит сборку, когда граф разъезжается с закоммиченным базелайном.

#Compose #AndroidStudio
Please open Telegram to view this post
VIEW IN TELEGRAM
🏝 Swift Export vs SKIE: что реально готово для iOS-интеропа сегодня

Touchlab выкатил большой разбор с прямым сравнением двух путей экспорта KMP в iOS: новый Swift Export от JetBrains против связки Obj-C bridge + SKIE. Сравнивают не галочками фич, а скомпилированным выводом обоих подходов. Это сильная сторона текста, можно повторить и посмотреть сгенерированный код самому.

Swift Export в Kotlin 2.4 дошёл до alpha и подтянул concurrency. Идея простая - генерировать нативный Swift API напрямую, без прослойки Objective-C. Swift Export и Obj-C export взаимоисключающие, поэтому выбор бинарный, смиксовать нельзя.


Где Swift Export уже выигрывает:
👉 Nullable-примитивы маппятся напрямую в Int32?, без обёрток типа KotlinInt
👉 Сохраняет typealias и структуру пакетов
👉 Настоящие изолированные Swift-модули вместо одного umbrella-фреймворка Shared

Где пока проигрывает, и это важно для прода:
👉 Generics по сути не поддерживаются. Только Kotlin-типы как параметры, value-типы Swift отваливаются, бывает что просто не компилится
👉 Sealed-классы теряют исчерпываемость. Никакого onEnum, обязательный default, компилятор не поймает новый кейс
👉 Extension-функции деградируют в static-функции с явным receiver. Совсем не по-свифтовому
👉 Всё помечается final, кросс-языкового наследования нет

Вывод авторов - для нативного iOS UI сегодня по-прежнему SKIE, а Swift Export годится для пет-проектов и небольших MVP.

Cтатью писал Touchlab, авторы SKIE и драйверы KMP в сообществе. По фактам они правы, Swift Export пока alpha и дыры реальные. Но «SKIE definitive choice» это уже их акцент, читайте с этой поправкой. Направление от JetBrains очевидное - KMP-проекты без Objective-C под капотом. Вопрос только в сроках, слишком уж долго они топили за поддержку Obj-C интеропа и игнорировали Swift.

#Kotlin #KMP #Swift #IOS
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Android Broadcast
🐘 Room тихо ломает ваш build cache

Команда прогнала свой браузер (открытый проект на 160 модулей) через открытые Develocity Build Validation Scripts. Скрипты гоняют сборку в разных условиях и показывают, какие задачи зря выполняются заново вместо того, чтобы взяться из кеша.

Главная находка про Room. Пути экспорта схем были заданы абсолютными, значит на каждой машине (ноутбук разработчика, CI-агент) получался свой input и свой ключ кеша. Любая сборка на другой машине била мимо. Лечится переходом на Room Gradle Plugin, который держит относительные пути. После фикса в эксперименте с разными путями на диске выполняемых задач стало 27 вместо 440.

😁 Вторая находка про Dagger. Либа генерила классы с непредсказуемым порядком методов: один и тот же исходник на двух CI-ранах давал побайтно разный вывод и промах по кешу. Апгрейд до Dagger 2.53+ с детерминированным выводом вернул в кеш 1619 задач. Опять же важность обновления до свежих версий.

Цифрами по статье манипулируют знатно. Заголовочные 57% относятся к лучшему локальному сценарию: сборке в git worktree после CI. Сквозной выигрыш по реальному CI скромнее, 19% на полном пайплайне с тестами и 39% на сборке debug APK. Инструментальные и Firebase-тесты не кешируются в принципе, поэтому потолок там ниже. Но даже из этого уже есть простые оптимизации, которые стоит проверить.

🔗 Источник - статья на Gradle блоге

#android #gradle #room #buildcache #dagger
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Compose Broadcast
This media is not supported in your browser
VIEW IN TELEGRAM
⚙️ Compose Navigation Graph: вся навигация приложения интерактивной картой прямо в Android Studio

🐱 Плагин от skydoves (Jaewoong Eum). Аннотируешь экраны @NavDestination, @NavEdge, @NavGraphRoot, KSP статически собирает граф, а IDE-плагин рисует карту: каждый экран отрендеренной @Preview-миниатюрой через Layoutlib, без эмулятора. Переходы стрелками, двойной клик прыгает в исходник, граф мёржится по всем модулям. Канвас редактируемый — тянешь связь от экрана к экрану, и плагин сам вписывает @NavEdge в код.

Работает с Navigation 3, Navigation 2 и даже голыми Activity. KMP из коробки: аннотации в commonMain, есть сэмпл на KotlinConf-приложении (26 экранов, 36 переходов).

Бонусом .nav baseline по аналогии с apiDump/apiCheck: navCheck валит сборку, когда граф разъезжается с закоммиченным базелайном.

#Compose #AndroidStudio
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Android Broadcast
🤖 Android XR Developer Preview 4: можно потрогать без железа

Google выпустили Developer Preview 4 XR SDK. Главное, что снижает порог: XR Emulator встроен в Android Studio, итерировать можно без Samsung Galaxy XR в руках.

Для мобильных разработчиков добавили нормальный способ расширить существующее приложение на display glasses. Jetpack Projected получил Device Availability API — привязывается к стандартным Android Lifecycle-состояниям, апп адаптируется к очкам нативно. Ускорить переезд помогает Android CLI с display glasses skill — специализированные скиллы, которые делают UI на Compose Glimmer по паттернам Google. Сам Glimmer в этом превью обновили под прозрачные дисплеи: читаемость текста и touchpad-навигация.

Для game dev: Unreal Engine и Godot теперь официально поддерживаются наряду с Unity. Вместе с ними выпустили Android XR Engine Hub под Windows — real-time тест прямо во viewport движка.

Открылась Android XR Developer Catalyst Program: пре-релизное железо (display glasses + wired XR), поддержка и помощь с запуском на Google Play. Заявки принимают прямо сейчас.

🔗 Источники - android-developers.googleblog.com

#AndroidXR #Jetpack #Android
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Android Broadcast
🤖 Миграция навигации hh.ru: 400+ экранов, Modo и feature toggle на переключение реализации

В hh.ru рассказали, как переезжали с Fragment-навигации на Compose + Modo в двух приложениях: 400+ экранов, 70 диплинков, 14 команд. Миграция идёт с 2022 года — и в июне 2026 ещё не завершена.

Modo выбрали за UDF-подход (состояние всей иерархии экранов — обычные данные, переходы — функция от состояния) и потому что разработчик Игорь Кареньков работает внутри hh.ru — можно дорабатывать без ожидания апстрима. Это же стало и первой граблей.

Ключевое решение для глобальных контейнеров: абстракция NavScreen с двумя реализациями — Fragment и Modo Screen, роутер выбирает через feature toggle в рантайме. Это позволило раскатывать переезд через A/B и не стопорить продуктовую разработку. При первой раскатке словили краш в ComposeView, продуктовые метрики просели — остановили, починили, раскатили снова. Без feature toggle был бы хотфикс-релиз.

Три реальные грабли:
👉 Слишком ранний выбор незрелой библиотеки — вложили много времени в доработки самой Modo
👉 Три параллельные миграции одновременно (View→Compose, Fragment→Modo, редизайн) — создали жёсткие зависимости и замедлили продуктовую разработку
👉 Старт без стратегии и метрик — месяцы хаоса, пока не завели дашборд с прогрессом

Если планируешь похожий переезд — там есть что взять.

#Android #Compose #Навигация
Please open Telegram to view this post
VIEW IN TELEGRAM
👮‍♀️ Как VPN видит трафик всех приложений?

технически VPN на андроид — это сервис

внутри можно получить inputStream с байтами трафика всех приложения

class MyVpnService : VpnService() {

fun startService() {

val tunFd = Builder()
.setSession("MyVPN")
.addAddress("10.0.0.2", 24)
.addRoute("0.0.0.0", 0)
.establish()

Thread {
val input = FileInputStream(tunFd.fileDescriptor)
}.start()
}



VPN работает на уровне IP/TCP/UDP пакетов


Ему плевать, какой тип трафика в этих байтах — данные внутри могут быть упакованы по протоколу http/https или вообще gRPC/GraphQL/SIP/MQTT...

Он получает сырой набор байт, которые надо зашифровать/переупаковать любым алгоритмом и доставить на сервер


💡 А может ли приложение VPN расшифровать https трафик?

Может, но только если пользователь добавит SSL-сертификат, созданный самим VPN-клиентом, в список доверенных

Получится классическая man-in-the-middle, в которой VPN сможет расшифровывать трафик


Оказывается, существуют даже мобильные версии снифферов вроде Proxyman. Они как раз поднимают VPN-сервис и просят установить кастомный сертификат
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Compose Broadcast
🐱 Kamera 1.0: стабильная камера для Compose Multiplatform

Камера в CMP это всегда возня с expect/actual и тремя платформенными бэкендами. Kamera (бывшая CameraK) закрывает это одним Compose-first слоем: один @Composable-вход, под капотом CameraX на Android, AVFoundation на iOS и JavaCV на Desktop.

API реактивный, через состояние. Заводишь rememberCameraKState(), получаешь StateFlow<CameraKState> c ветками Initializing, Ready(controller, uiState) и Error, и рисуешь превью, когда камера готова:

val cameraState by rememberCameraKState(
config = CameraConfiguration(
cameraLens = CameraLens.BACK,
aspectRatio = AspectRatio.RATIO_16_9,
),
)

when (val state = cameraState) {
is CameraKState.Ready -> CameraPreviewView(state.controller)
is CameraKState.Initializing -> CircularProgressIndicator()
is CameraKState.Error -> Text(state.message)
}

Из коробки: зум, вспышка, фонарь, переключение линз (ultra-wide/telephoto на iOS), takePictureToFile() для прямого сохранения в файл. Сверху плагины, которые сами активируются на Ready: сохранение фото, QR/штрихкоды, OCR, запись видео с pause/resume и лимитом длительности, анализ кадров через analyzer.

Главное в 1.0: починили то, что мешало брать в прод. На iOS фронталка отдавала тёмные кадры из-за бага в MemoryManager, хотя превью выглядело нормально. На Android фото оказывалось кропом вместо настроенного аспекта, теперь что видишь, то и снимаешь. Плюс вычистили утечки корутин в плагинах при ре-ините камеры.

‼️ Это молодая 1.0 и по сути проект одного мейнтейнера под Apache-2.0. Блокеры выше жили буквально до вчера, так что 1.0 это точка, где их закрыли, а не годы шлифовки. Desktop тянет JavaCV с нативными либами, это тяжело. Но если нужна камера в CMP без трёх реализаций руками, смотреть стоит.

🐱 GitHub

#Compose #ComposeMultiplatform #KMP
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Compose Broadcast
This media is not supported in your browser
VIEW IN TELEGRAM
⚙️ skydoves выпустил Compose HotSwan v2 Beta для Android: заменить весь экран без рестарта приложения

v1 умел одно — применять изменения значений без rebuild: цвет, padding, текст, размеры — результат за секунду, приложение живёт. Добавить composable, переставить layout, поменять control flow — всё это шло в полный rebuild.

v2 убирает эту границу. Без рестарта приложения: добавляем и удаляем composable-функции, меняем структуру layout, переписываем conditional UI. И главное — заменяем целый экран на совершенно другой код. Навигационный стек и remember-состояние сохраняются.

Технически v2 запускает изменения через собственный интерпретатор, обходя ограничения ART на переопределение классов — тот же подход, что у Flutter. При слишком глубоких изменениях деградирует плавно: сбрасывает composition с сохранением rememberSaveable и ViewModel, в крайнем случае рестартит Activity. Полный rebuild нужен только при изменении сигнатур функций, иерархии классов и inline-функций.

В v2 также MCP-сервер: AI-агент триггерит reload, снимает скриншот с устройства, итерирует по вариантам. Claude Code и Cursor работают из коробки через file watcher.

Поставить: IDE-плагин вручную с бета-канала Marketplace + Gradle-плагин 2.0.0-beta01:

[plugins]
hotswan-compiler = { id = "com.github.skydoves.compose.hotswan.compiler", version = "2.0.0-beta01" }


Инструмент платный инструмент, лицензия и цены на hotswan.dev/pricing.

Такого охвата hot reload в нативном Compose ещё не было. Аргумент Flutter про быстрый feedback loop заметно слабеет.

#Compose #JetpackCompose #AndroidDev
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Android Broadcast
‼️ Maven Central вводит лимиты на публикацию

С 16 июня появятся предупреждения про превышение бесплатных лимитов на месяц, с 11 августа 2026 начнётся реальное ограничение бесплатных публикаций.

Пороги у 90 перцентиля: 1 167 файлов в месяц, 78 МБ суммарно, 7 релизов. Большинство open source разработчиков не заметят. Кто публикует много и часто — проверьте Usage Center уже сейчас.

Лично мне интересно, как это ляжет на KMP-проекты. Один multi-target релиз — это десятки файлов на каждую платформу: sources, javadoc, pom, подписи. Sonatype говорит, что работает с JetBrains над смягчением. Посмотрим.

💬 Не станет ли это движением в стороны децентрализации от Maven Central?

🔗 Официальная документация о лимитах

#Maven
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Android Broadcast
🤖 Что за хрень с androidx.biometric?

Решил обновить compileSdk до Android 37, а там, оказывается, удалили старый Fingerprint API, который был до BiometricPrompt. Чем он им помешал? Ведь теперь обеспечивать поддержку старых версий Android сложнее, но это отдельный разговор.

В ходе миграции я узнал, что обновления библиотеки androidx.biometric — сущий хаос:
👉 Самая свежая версия — 1.4.0, и она только в альфе.
👉 Версия 1.3.0 вообще не делалась.
👉 Версия 1.2.0 не получила стабильного релиза, остановившись на альфе.
👉 Самая свежая стабильная версия — 1.1.0, которая вышла в 2021 году!

💬 Такого я давно не встречал. Может, вы уже решали задачу миграции на свежий compileSdk?

#Android #AndroidDev #Security
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Android Broadcast
🤖 Android 17 вышел — API level 37 уже на Pixel

Google выпустила финальный Android 17. Исходники открылись в AOSP, обновление катится на поддерживаемые Pixel-устройства.

Главный сигнал релиза: Android официально Compose-first. Все новые API, библиотеки, инструменты и документация будут создаваться только для Jetpack Compose. View (android.widget), Fragments, RecyclerView, ViewPager переходят в maintenance mode: только критические баги, никаких новых фич. Вопрос «когда View умрёт» закрыт — она уже в maintenance.

Breaking changes при таргете SDK 37:

👉 resizeableActivity=false, screenOrientation, minAspectRatio / maxAspectRatio игнорируются системой на large screen (sw > 600 dp). Игры освобождены, остальные нет.

👉 static final поля нельзя менять через reflection: IllegalAccessException. Через JNI — краш.

👉 Native-библиотеки через System.load() должны быть read-only, иначе UnsatisfiedLinkError.

👉 Доступ к локальной сети заблокирован по умолчанию: нужен ACCESS_LOCAL_NETWORK.

👉 Lock-Free MessageQueue быстрее, но ломает код с reflection на приватных полях.

‼️ ВАЖНО CameraX: обновитесь до 1.5.2 или 1.6.0+ — краш на Android 17 из-за нового режима dynamic range.

Из остального: Generational GC в ART, жёсткие лимиты памяти с принудительным завершением процессов, Post-Quantum Cryptography (ML-DSA), AppFunctions как on-device MCP API для AI-агентов (alpha, Gemini в private preview).

#Android #Android17
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Android Broadcast
Media is too big
VIEW IN TELEGRAM
🤖 Android XR за пару дней стал реальнее: XREAL показал очки Aura, Google — что на них строить

XREAL официально представил Aura (бывший Project Aura): лёгкие проводные очки с прозрачным дисплеем, вычисления вынесены в карманный блок на новом Snapdragon Reality Elite, Gemini в системе. Финальной цены нет, но база «не дороже $1500», резерв открыли за $99.

Google показал что на этом строить. Демка XR Geospatial Tour: надеваешь очки, поверх города висят 3D-подсказки, голосовой гид рассказывает про здания перед тобой. Внутри Geospatial API (VPS от Google в ARCore for Jetpack XR, субметровая точность и направление взгляда, точнее GPS), Gemini с Google Maps Grounding для маршрутов, Gemini TTS для озвучки и Compose for XR для 3D.

Если смотреть на рынок: смартфоны выезжены вдоль и поперёк, складные остались нишей, а лёгкие очки это правда новое место, где игра ещё не сыграна. Aura важна именно этим: форм-фактор наконец похож на то, что хочется носить, а не на шлем на полдня.


#Android #AndroidXR #XR #Gemini
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Android Broadcast
📃 Сравнение скорости работы Metro DI vs Dagger/Hilt в Android проекте.

У меня по рабочей задаче встал вопрос какой DI выбрать для трансформации Android проекта в KMP с поддержка Android, iOS, Desktop и конечно нормальной работой с Compose. Решил понять чего будет стоить миграции на Metro DI и был приятно удивлен.

За день с помощью AI перевел Now In Android на Metro и запустил различные тесты сравнения влияния DI на сборку проекта. Подробности в 🪙 полной статье на Boosty

#Dagger #Metro #KMP #Performance
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Android Broadcast
🤖 Gradle-плагин, который сам защищает APK от рута, хукинга и клонирования

Hydra — это RASP-плагин для Android: подключаешь одной строкой в build.gradle.kts, и на выходе assembleRelease APK несёт обфусцированное нативное ядро с защитой.

plugins {
id("com.android.application")
id("com.github.iamjosephmj.hydra") version "1.9.0"
}


Что проверяет на старте процесса: рут-доступ, Frida/hooking-инструменты, клонирование через virtual spaces (Parallel Space и похожие), эмуляторы, целостность APK. Нашёл критичное — завершает процесс. Без advisory-режима, сразу kill.

secrets {} в конфиге шифрует строки при сборке, в classes.dex попадает только цифертекст, расшифровка только на чистом устройстве:

val url = withContext(Dispatchers.IO) { Hydra.secret("apiUrl") }


Всё on-device, без сети, без телеметрии. INTERNET permission не объявляется вообще.

⚠️ Ядро libdicore.so закрыто и обфусцировано — проверить что именно кладётся в APK нельзя. Для финтех-продакшна это принципиальный вопрос. Kill-by-default сломает эмуляторы в QA — тестировать только на реальных чистых устройствах. QUERY_ALL_PACKAGES потребует декларации в Play Console.

В продакшн только после того, как понял, что именно ты кладёшь в свой APK.

🐱 GitHub

#Android #AndroidDev #Безопасность
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Android Broadcast
‼️ Каждый год 31 августа наступает дедлайн по повышению targetSdk. В этом году дедлайн потребует минимум 36 (Android 16), и это не просто цифра в Gradle-скриптах!

Чуть больше двух месяцев до дедлайна Google Play. С 1 сентября новые публикации и обновления должны таргетировать Android 16 (API 36). Пропустить срок — приложение пропадёт из выдачи для новых пользователей на устройствах с Android новее вашего текущего таргета.

Главная ловушка: переход на targetSdk = 36 включает breaking changes, которые начинают работать сразу после сборки. Что поменяется после смены цифры:

👉 onBackPressed() больше не вызывается. На Android 16 его переопределение игнорируется. Нужен OnBackPressedDispatcher или OnBackInvokedCallback.

👉 Native .so и 16KB page size. Если в приложении или транзитивных зависимостях есть нативный код — нужна проверка совместимости. NDK 27+ и useLegacyPackaging = false. Без этого возможны краши на части устройств.

👉 USE_FULL_SCREEN_INTENT требует явного разрешения. Звонки, будильники, доставка — всё, что показывает уведомления поверх экрана блокировки, перестанет работать без декларации в манифесте.

👉 Health permissions. BODY_SENSORS и BODY_SENSORS_BACKGROUND заменяются на гранулярные android.permission.health.*READ_HEART_RATE, READ_OXYGEN_SATURATION и т.д.

Тестировать breaking changes можно уже сейчас, не повышая targetSdk, через compat framework:

adb shell am compat enable-all com.yourapp


Или точечно по конкретному флагу — удобнее разбирать изменения по одному. Подробнее читайте в документации.

#Android #AndroidDev #Android16
Forwarded from Android Broadcast
🐱 Coroutine Tracer: иерархия корутин прямо на устройстве без внешних профайлеров

Стандартный Android Profiler показывает потоки. Не корутины. Kotlinx-coroutines-debug работает в unit-тестах, но не на реальном девайсе с живым UI. Яндекс Go сделали для этого отдельный инструмент.

Coroutine Tracer — плагин в их открытой библиотеке Demeter. Gradle-плагин на этапе сборки находит все launch/async через ASM и вставляет хук без единой правки в исходниках. В рантайме хук перехватывает возвращённый Job, регистрирует invokeOnCompletion и всё отображается как интерактивное дерево прямо на девайсе.

Два технических момента, которые зацепили:

👉 Перехватывают launch$default, а не только launch. Это та версия, которую компилятор Kotlin генерирует для вызовов с default-параметрами. Именно она выполняется в большинстве реальных вызовов.

👉 Parent-child связи строятся через обратный индекс Job → traceId. Без него launch-в-цикле даёт квадратичный оверхед на горячем пути. Дерево собирается итеративно — страховка от StackOverflowError на глубоких иерархиях.

Zero overhead по умолчанию: без includedClasses в конфиге плагин ничего не инструментирует.

Отсутствие нормального рантайм-инструментария для корутин давно раздражало. Это первый инструмент из тех, что видел, который работает на живом девайсе без ручной расстановки меток.

🔗 Статья на Хабре

#Kotlin #Coroutines #AndroidDev
Please open Telegram to view this post
VIEW IN TELEGRAM