База знаний android
1 subscriber
2.48K photos
284 videos
2 files
3.77K links
Download Telegram
Forwarded from Android Good Reads
Android CLI зацикливает на себе весь цикл разработки для андроид c агентами. Вам не нужно прыгать и искать какие скилы подтянуть в проект, какой контекст по андроид разработке предоставить. All-in-one от гугла (sdk, эмуляторы, запуск билдов ... )

Ни для чего другого, кроме как мобильной разработке, это не подходит, так что поставить точно рекомендую!
This media is not supported in your browser
VIEW IN TELEGRAM
Все идет по пути к тому что у каждого тула будет CLI версия. Обсидиан запустил пару месяцев назад, а вот и Google (Пере)представляет Android CLI

По ощущениям оч кастрированный и является надстройкой над adb

(c) Антоха Разраб про AI
Forwarded from Android Good Reads
Если вы используете Metro, в качестве DI, то знайте что оно стало стабильным. Свеженаписанный легковесный DI для android

Релиз ноутс: https://github.com/ZacSweers/metro/releases/tag/1.0.0
Forwarded from Android Good Reads
Что нового в Compose в Апреле

compose-bom:2026.04.01 или Compose 1.11.0
👉 v2 API тестирования стал дефолтным, StandardTestDispatcher вместо UnconfinedTestDispatcher. Коррутины в тестах больше не выполняются сразу — очередь, пока виртуальные часы не продвинутся
👉 Shared Elements: новый composable LookaheadAnimationVisualDebugging показывает границы анимаций, траектории и несовпадения
👉 Поддержка трекпадов: теперь трекпады распознаются как PointerType.Mouse, а не Touch. Исправляет скролл вместо выделения, добавляет поддержку жестов и десктопных контекстных меню
👉 Compose runtime: новый HostDefaultProvider позволяет библиотекам (особенно KMP) получать сервисы без зависимости от compose-ui
👉 Аннотация @PreviewWrapper для переиспользуемых обёрток превью:
class ThemeWrapper: PreviewWrapper {
@Composable
override fun Wrap(content: @Composable (() -> Unit)) {
JetsnackTheme {
content()
}
}
}

@PreviewWrapperProvider(ThemeWrapper::class)
@Preview
@Composable
private fun ButtonPreview() {
// JetsnackTheme in effect
}

👉 Готовимся что в 1.12.0 compileSdk обновится до 37. Будет много боли потому что 37 Sdk тянет за собой AGP 9

Android Good Reads
Forwarded from Android Good Reads
Что нового в Compose в Апреле Часть 2

Экспериментальные API:

👉 Styles API: декларативные стили компонентов с автоматическими анимациями. Судя по бенчмаркам, быстрее модификаторов
👉 MediaQuery: адаптация под окружение (размер окна, тип клавиатуры, режим стола и т.д.)
👉 Grid: 2D-раскладка с треками, фракциями (fr) и авто-размерами
👉 FlexBox: мощный контейнер с гибким распределением пространства, wrap'ом и выравниванием. Замена Row/Column/Flow
👉 Новый SlotTable: ускорение случайных правок в дереве композиции (пока опционально через флаг)

Android Good Reads
Forwarded from Compose Broadcast
⚙️ Compose 1.11: Composition host defaults — мелочь, важная для KMP

В апрельском релизе Jetpack Compose под номером 1.11 в compose-runtime завезли четыре новых API: HostDefaultProvider, LocalHostDefaultProvider, HostDefaultKey и ViewTreeHostDefaultKey. Плюс билдер compositionLocalWithHostDefaultOf для авторов библиотек.

Он позволяют объявить CompositionLocal, у которого дефолтное значение резолвится из окружения хоста — например, через Android View tag'и (как это делает ViewTreeLifecycleOwner или ViewTreeOnBackPressedDispatcherOwner). Раньше для такого паттерна была обязательна зависимость на compose-ui. Теперь только compose-runtime.

Раньше чтобы из библиотеки достать значение из View tree, приходилось тянуть compose-ui ради LocalView и платформенные функции поиска по дереву View. Код жил в Android-сорсах, в commonMain такое не положишь:
    // androidMain — compose-ui + Android-only API
val LocalMyOwner = compositionLocalOf<MyOwner?> { null }

@Composable
fun ProvideMyOwner(content: @Composable () -> Unit) {
val view = LocalView.current
val owner = remember(view) {
view.findViewTreeMyOwner()
}
CompositionLocalProvider(LocalMyOwner provides owner) {
content()
}
}


С новым API описание CompositionLocal живёт в commonMain и тянет только compose-runtime. Связку с View tree описывает ViewTreeHostDefaultKey, и хост сам отдаёт значение через своего провайдера:

    // commonMain — только compose-runtime
val MyOwnerKey = ViewTreeHostDefaultKey<MyOwner>(
viewTagId = R.id.view_tree_my_owner
)

val LocalMyOwner = compositionLocalWithHostDefaultOf(MyOwnerKey)

// Использование — без изменений
@Composable
fun MyComponent() {
val owner = LocalMyOwner.current
// ...
}


Теперь авторы Compose библиотек могут держать определение CompositionLocal в общем модуле без зависимости на compose-ui. Профит - меньше транзитивных зависимостей в KMP-библиотеках и более чистое разделение слоёв runtime и UI.

#Compose #CMP
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Compose Broadcast
⚙️ Compose Multiplatform 1.11.0 вышел

Главные фичи:
1️⃣ Нативный text input на iOS через UIView, UITextInput и UIKeyInput (экспериментально)
2️⃣ v2 API для Compose UI-тестов на не-Android таргетах
3️⃣ Переписанный с нуля скроллинг на Web

Breaking изменения, которые заденут почти всех:
👉 Минималка Kotlin поднята до 2.3.10
👉 Минимальная iOS теперь 14 (поддержка 13 ушла)
👉 iosX64 и macosX64 удалены полностью
👉 Shader на не-Android стал wrapper-классом

Я ждал нативный input на iOS с того момента, как Compose туда заехал. Текущая реализация на Skia всегда чувствовалась чужой на ощупь, особенно при сложном выделении и системных меню. Надо пробовать!

#compose #cmp #kotlin
Please open Telegram to view this post
VIEW IN TELEGRAM
👨‍💻 Опенсорсим yx_navigation — декларативную навигацию для Flutter

Навигация во Flutter сначала кажется автору простой: push и pop. Но по мере роста проекта появляются табы, вложенные модули, диплинки — и каждый экран начинает открываться по-своему, а pop() ведёт себя непредсказуемо.

Navigator 1.0 прост, но не масштабируется. Navigator 2.0 даёт контроль, но требует тонны бойлерплейта. Пакеты вроде go_router (режим поддержки) и auto_route (кодогенерация) решают часть проблем, но не все.

Автор и его команда прошли через все эти варианты в Яндекс Про — приложении с сотнями фич, несколькими командами и вложенной навигацией. Так появился yx_navigation — новый пакет в экосистеме архитектурных решений для Flutter, следующий после yx_scope (DI) и yx_state (управление состоянием).

В статье автор расскажет, с какими трудностями столкнулась команда, какие требования сформулировала, как устроен yx_navigation сегодня и как именно он решает проблемы крупных приложений.

👉 Читать статью

📌 Лучшие вакансии для мобильных разработчиков

🐸 Библиотека мобильного разработчика

#свежак #Flutter
Please open Telegram to view this post
VIEW IN TELEGRAM
🏝 JetBrains обновили дефолтную структуру KMP проектов. Теперь общий код живёт в shared модуле, а под каждую целевую платформу свой отдельный application модуль.

Раньше всё было в одном composeApp, который одновременно был и KMP библиотекой, и приложением. Это создавало путаницу в build конфигах и платформенных настройках. iOS при этом уже жил в отдельной папке, и асимметрия торчала наружу.

Главным триггером изменений стал Android Gradle Plugin 9, который больше не позволяет применять Android application plugin к multiplatform модулю. Entry point Android приложения теперь обязательно вынесен в отдельный модуль.

Если в проекте есть нативный UI (например, SwiftUI для iOS), shared разбивается на два модуля: sharedLogic без Compose зависимостей и sharedUI только для платформ с Compose Multiplatform. Для проектов с серверной частью добавляется server модуль и core с общими моделями и валидацией для шаринга между клиентом и сервером.

Я ещё до этого держал каждый application в отдельном модуле, так что для меня новая дефолтная структура лишь оформляет то что уже стало здравым смыслом. Раньше с одним shared было неприятно из-за того что Kotlin stdlib и зависимости тащились в каждый iOS framework. Несколько атомарных shared модулей решают эту проблему и позволяют точечнее управлять тем что попадает на каждую платформу. Очень рад что JetBrains двигаются в сторону более атомарных модулей, но пока есть вопросы не будет ли дублирования базовых Kotlin библиотека в каждый Xcode фреймворк.

Новая структура уже доступна в KMP wizard на kmp.new и в IDE плагине.

🔗 Анонс
📹 Видео разбор от JetBrains

#Kotlin #KMP #Gradle
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Android Broadcast
‼️ Android View всё! Да здравствует Compose!

Google официально объявила о переходе к стратегии «Compose-first» и прекращении развития Android View, переводя его в режим поддержки.

Что это значит:
👉 Классы android.widget.* в Android SDK будут находиться в режиме поддержки.
👉 Библиотеки Android Jetpack про кастомные View (включая RecyclerView) также переходят в режим поддержки.
👉 Все инструменты в Android Studio будут создаваться только для Compose.
👉 Документация будет писаться только для Compose, однако некоторые разделы про View останутся.

🔗 Источник - оф сайт Android Developers

#Android #AndroidDev #Compose
Forwarded from Android Broadcast
⚰️ Полный список Jetpack библиотек которые перешил в Maintain режим:
👉 CardView
👉 ConstraintLayout
👉 CoordinatorLayout
👉 CustomView
👉 Databinding
👉 DragAndDrop
👉 DrawerLayout
👉 DynamicAnimation
👉 Emoji
👉 Fragment
👉 GridLayout
👉 Interpolator
👉 Loader
👉 Navigation
👉 PercentLayout
👉 Preference
👉 RecyclerView
👉 SlidingPaneLayout
👉 SwipeRefreshLayout
👉 Transition
👉 VectorDrawable
👉 ViewPager
👉 ViewPager2
👉 Material Design Components (Views)

Считаю что делать так с RecyclerView поступили опрометчиво, ведь не все возможности может сделать Lazy*** Composable, а вот на Fragment и подавно куча приложений строится. Но нам дадут волшебные скиллы для миграции по одному экрану за раз

#Android #AndroidDev #Compose #
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Android Broadcast
🤖 Material Components for Android 1.14.0 (Views) вышел финальным релизом. И заодно последним крупным: библиотеку официально перевели в maintenance mode.

1.14.0 это одновременно и большой апдейт, и проводы. Новых фич для View-версии Material больше не будет, останутся только критические исправления. В документации Google прямым текстом советует всем, кто сидит на Views, начинать или продолжать миграцию на Compose.

Что приехало в релизе:
👉 Material 3 Expressive темы и стили получили статус stable;
👉 Новые компоненты для списков в стиле M3: ListItemLayout, ListItemRevealLayout, ListItemCardView и другие. Готовые список-айтемы со свайпами вместо самописных решений на RecyclerView;
👉 OverflowLinearLayout, который прячет дочерние элементы в overflow menu при нехватке места, по аналогии с action items в Toolbar;
👉 Focus rings, декоративная обводка элемента при получении фокуса, удобно для клавиатурной навигации;
👉 Мелкая кастомизация: secondary icons для кнопок, overflow modes для button groups, delays для loading indicators.

Что ещё важно:
⚠️ minSdk подняли с 21 до 23 (Android 6.0). Для проектов с поддержкой Android 5.x это блокер апдейта;
🛠 Библиотека больше не дёргает deprecated API на новых версиях Android, и Play Console перестанет на это ругаться;

Лично для меня новость ожидаемая. Google толкает Compose уже несколько лет, View рано или поздно должен был умереть. Паниковать не стоит, библиотека не ломается, просто не будет новых релизов. Но если вы стартуете новый проект на Views в 2025-м, это прямой повод пересмотреть решение. А для больших легаси-приложений 1.14.0 хороший момент заложить миграцию на Compose в план на горизонте года-двух. Ну и меньше сил будет уходить на реализацию дизайн системы

🔗 Полный Changelog

#android #materialdesign #material3 #compose
Please open Telegram to view this post
VIEW IN TELEGRAM
Android Skills — модульные AI-инструкции для разработки

Google выложила Android Skills — набор готовых markdown-инструкций для любой LLM (Claude, Gemini, GPT), которые проводят агента через рутинные архитектурные задачи в Android-проекте.

В наборе:
— View → Compose миграция с сохранением ViewModel-логики.
— Реализация adaptive-лейаутов под Android 17 (sw > 600 dp).
— Navigation 2 → Navigation 3 transformation.
— Миграция со старых camera-библиотек на CameraX.

Технически Skills — структурированные `.md` файлы с шагами, проверками и code patterns. LLM подключает их как контекст и идёт по чеклисту, не «вспоминая» Compose из памяти. Запуск — через новый Android CLI 1.0. Репо открытый, форкается под свой стек.

@mobi_dev (теперь и в Max)
🧳 Переезд с XML на Jetpack Compose на проде

Автор статьи рассказывает о переходе крупного многомодульного проекта с сотнями экранов на Jetpack Compose. Классический стек (XML, Cicerone, Dagger 2, MVVM) работал, но когда экранов стало несколько сотен, команда начала тратить больше времени на борьбу с неконсистентным состоянием UI. Потребовалось менять подход.

За полтора года миграции разработка ускорилась, а баги, связанные с состоянием экрана, практически исчезли.

В статье автор делится, как процесс был разделён на три этапа, что делали на каждом и к чему пришли. Материал будет полезен тем, кто уже знаком с Compose, хочет внедрить его в проект, но сомневается. Без разбора плюсов и минусов технологии — только практика.

👉 Читать статью

📌 Лучшие вакансии для мобильных разработчиков

🐸 Библиотека мобильного разработчика

#свежак #Kotlin
Please open Telegram to view this post
VIEW IN TELEGRAM
🔖 5 фич Jetpack Compose, которые изменят ваш подход к разработке Android-приложений

1️⃣ Анимации — профессионально выглядящие переходы с AnimatedContent

Раньше переключения видимости между состояниями UI могли выглядеть немного топорно. AnimatedContent позволяет задавать, как контент появляется и исчезает — затухание, сдвиг, масштабирование, что угодно!

AnimatedContent(
targetState = isLoggedIn,
transitionSpec = {
// Slide in from right, slide out to left
slideInHorizontally { it } togetherWith slideOutHorizontally { -it }
}
) { loggedIn ->
if (loggedIn) HomeScreen() else LoginScreen()
}


Да, переходы имеют значение — пользователи это замечают. Такой уровень проработки вызывает доверие.

2️⃣ Не пересоздавайте то, что не изменилось: LazyColumn и key

Большинство разработчиков используют LazyColumn без key. Это нормально — пока вы не измените порядок элементов списка, и тогда каждый элемент начнет мигать и перерисовываться.

Стабильные ключи позволяют Compose более явно понимать, какой элемент есть какой.

LazyColumn {
items(messages, key = { it.id }) { message ->
MessageRow(message)
}
}


3️⃣ derivedStateOf — избавьтесь от лишних рекомпозиций

Эту возможность используют редко и часто понимают неправильно. Если у вас есть состояние, зависящее от другого состояния, используйте derivedStateOf — тогда Compose будет выполнять рекомпозицию только при изменении результата, а не каждый раз при изменении исходного состояния.

val showScrollToTop by remember {
derivedStateOf { listState.firstVisibleItemIndex > 3 }
}


Научитесь правильно это использовать: это критически важно для UI-логики, завязанной на прокрутке./

4️⃣ Modifier.drawBehind — кастомные фоны без Box

Забудьте о вложенных layout-контейнерах только ради того, чтобы нарисовать собственную форму или градиент. drawBehind даёт вам прямой доступ к Canvas прямо внутри модификатора.

Text(
text = "Hello",
modifier = Modifier.drawBehind {
drawRoundRect(
color = Color(0xFF00D4AA),
cornerRadius = CornerRadius(12f)
)
}
)


5️⃣ SubcomposeLayout — измерение размеров дочерних элементов относительно других дочерних элементов.

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

Знание о его существовании обычно является большей частью необходимого — и большинству разработчиков никогда не приходится это писать — но это объясняет, как работают сложные компоновки.

📌 Лучшие вакансии для мобильных разработчиков

🐸 Библиотека мобильного разработчика

#свежак #MiddlePath #Kotlin
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Android Broadcast
🔨 Android Performance Analyzer запускается как отдельное десктоп-приложение и не требует ни проекта в Android Studio, ни Gradle-сборки.

Google показала новый профайлер на I/O 2026. APA пришёл на смену Android GPU Inspector и сразу доступен в открытой бете. Поставляется в двух вариантах: лёгкое standalone-приложение под Windows, macOS и Linux, и встроенный System Trace viewer в Android Studio в канареечных сборках Panda 4 и новее.

В этом релизе доступен System Profiler. Он показывает CPU, GPU, память и энергопотребление приложения в одном окне.

Под капотом Perfetto для системного трейсинга, можно открывать и существующие Perfetto-трейсы. GPU-счётчики читаются с железа Qualcomm, Arm, Imagination и Samsung (про Tensor ничего), есть события SurfaceFlinger по конвейеру рендера, треки FPS и времени кадра. Из рабочих мелочей появились вкладки и сплит окна для сравнения трейсов, проектная модель для A/B-тестов и скриншоты для навигации по таймлайну.

🧠 APA анализирует трейсы через SQL-запросы и идёт с Perfetto SQL skill для ИИ-агентов, так что запрос строится без знания схемы Perfetto. Perfetto Analysis отвечает на высокоуровневые вопросы вроде «почему медленно стартует приложение».

По заявлениям разработчиков рендеринг трейса в APA в 6–26 раз быстрее, чем в Android GPU Inspector, и стабильнее на больших данных. Лучший опыт по системным метрикам и GPU-счётчикам — на устройствах с Android 12 и выше.

Меня радует здесь формат, а не сам профайлер. Standalone-инструмент, который ставится за минуту и не тянет за собой тяжёлую IDE, это правильное направление. Android GPU Inspector тоже был отдельным приложением, так что путь не новый, но APA впервые собрал в standalone не только графику, а ещё CPU, память и энергопотребление. Очень жду когда начнется распил инструментов из Android Studio.

#Android #AndroidDev #Производительность #Performance #AndroidStudio
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Android Broadcast
😁 Android CLI получил stable 1.0, и его главная команда тянется обратно в Android Studio.

Android CLI это тонкая прослойка между ИИ-агентом и Android-тулчейном. Работает с любым агентом: Claude Code, Codex, Gemini, Antigravity. Обновляется командой android update.

Стоит понять, что CLI делает сам, а что нет. Сам он умеет то, чему не нужно понимание кода: создать проект, поставить зависимости, собрать, поднять эмулятор, задеплоить. Это обёртка над gradle, adb и SDK-тулзами, работает откуда угодно.

«Умные» операции CLI проксирует в запущенную Android Studio через новую команду android studio. Студия тут работает как бэкенд: analyze-file гоняет инспекции IDE, find-declaration и find-usages ищут символы через семантический индекс проекта, render-compose-preview отдаёт картинку Compose-превью из рендер-движка студии, version-lookup подтягивает актуальные версии зависимостей. Команда android studio check показывает pid живого процесса студии и статус проекта READY: CLI разговаривает с уже открытым инстансом по локальному каналу. Студия не запущена, у агента остаются только сборка и деплой, всё умное отваливается.

Ещё в релизе появились Journeys, сценарии на естественном языке для прогона по приложению, а библиотеку скиллов пополнили миграцией на CameraX, Perfetto SQL и Compose Style API.

Также появилась интеграция с Android разработкой в Antigravity на основе Android CLI

🤔 Меня в таких мостах к IDE смущает привязка к одной открытой папке проекта. MCP-сервер для Android Studio я по этой причине так и не стал использовать: работаю через git worktree, держу несколько папок-проектов одновременно, а мост видит только главную.

🔗 Источник Android Dev Blog

#Android #AndroidDev #AI #ИИ #AndroidStudio