Mobile Developer
СтатистикаYouTube — https://youtube.com/c/MobileDeveloper ВК — https://vk.com/mdeveloper Чат канала — https://telegram.me/mobiledeveloperchat Boosty — https://boosty.to/mobiledev Сайт — https://mobiledeveloper.tech/ По всем вопросам — @mobiledeveloper_bot
- Последний пост
- 08:32
- Последнее чтение
- 15:46
- Постов за неделю
- 23
- Всего постов
- 60
- Тип
- открытый
- Язык
- русский
- Категория
- Видео
- В каталоге с
- 12 авг.
- 1/24сутки в ленте
- 1 648
- 1/48двое суток
- 1 888
- 1/72трое суток
- 2 036
Оценка по просмотрам недавних постов: пост набирает почти всё за первые сутки.
Посты
🎯 Матрица снапшот-тестов: parameterized JUnit vs TestBalloon https://freedium-mirror.cfd/https://emartynov.medium.com/the-snapshot-test-matrix-two-ways-parameterized-junit-vs-testballoon-d4015c495efc 27 состояний экрана × 5 конфигураций (baseline, тёмная тема, самая длинная локаль, планшет, увеличенный шрифт) = 135 golden-картинок. Автор показывает два способа сгенерировать эту матрицу тестов на одном и том же стеке - Roborazzi на Robolectric. 🛤🛣Первый - устоявшийся путь через ParameterizedRobolectricTestRunner. Второй - DSL на TestBalloon, где сьют это просто Kotlin-выражение, а не аннотации, и матрица собирается обычным циклом. В статье - рабочий код обоих подходов, чем композиция в TestBalloon отличается от «переговоров с фреймворком» в JUnit, и честная ложка дёгтя в конце - баг в текущем публичном релизе TestBalloon, из-за которого автор сидит на экспериментальной ветке. —————— 💭 Хороший практический разбор двух моделей тестирования на реальной задаче. Полезно тем, кто пишет snapshot-тесты на Compose. Telegram | Селеба | YouTube
видео или голосовое, без подписи
видео или голосовое, без подписи
видео или голосовое, без подписи
видео или голосовое, без подписи
видео или голосовое, без подписи
OpenMattermost (Аврора) в RuStore Итак, это пятая и заключительная часть моего приключения по переносу приложеньки из Реакт Натива (смешанного со всяким) в Аврора Flutter приложение. Приключение получилось забавным и не сказать, что очень сложным, поэтому теперь, я надеюсь, что это попробуют и остальные инженеры, но прежде, чем перейти к выводам, я хотел бы рассказать про релиз В общем и целом, релиз в RuStore оказался реально простым для Авроры и тут ребята постарались. Вам нужно будет 1. Залогиниться (это легко) 2. Получить специальный сертификат разработчика под Аврору (им будут подписаны приложения) 3. Залить два вида файлов под 32х-битную и под 64х-битную архитектуру 4. Заполнить описания, скриншоты и тд (обязательно предоставьте тестовые данные, если у вас есть логин, меня первый раз завернули именно за это) 5. Пройти модерацию и хопа, вы уже в релизе! Собственно, я все это проделал и теперь вы можете видеть мое приложение вот на картинках, ну или скачать по ссылкам ниже. Для именно Аврора пути у Рустора мне кажется не хватает еще немного тестирования, видимо крайне редко этим путем пользуются, но в целом все отработало на 95%. Я думаю, что чем больше вы будете засылать свои приложения, пользуясь путем, который я описал, тем лучше этот путь будет работать У меня еще уточняли данные по ИНН, прежде чем выдать мне сертификат. Ну и я уже получил некоторый фидбэк по приложению от первых скачавших. Если вкратце, то мелкие косячки есть, но, в целом, ничего критичного, так что я думаю, что эксперимент можно признать состоявшимся В этом мире очень много сервисов с открытым API, поэтому вы можете уже сегодня дать экосистеме Авроры много отличных приложений без особых вложений с вашей стороны (сегодня нейронка есть уже у всех вообще, а токены часто жгутся на какую-то фигню). Тут вы можете сделать вклад в развитие нашей экосистемы Безусловно есть над чем еще работать, но первый шаг сделан, думаю, что нейронки сильно изменят подход к новым ОС, но об этом вы уже увидите в моем видео! P.S. К сожалению, у RuStore нет веб-админки для приложений на Авроре, поэтому вы можете это увидеть только если у вас есть телефон на ОС Аврора (ну либо наслаждаться картинками) P.P.S. Все полезные ссылки (дублирую github и mos.hub) Агент для Авроры - mos.hub | github Исходники приложения + релизы - mos.hub | github Автоматизация тестирования на мобилке - mos.hub | github #aurora
🧑💻 Claude Code для мобильной разработки - сетап одной команды https://freedium-mirror.cfd/https://levelup.gitconnected.com/claude-code-for-mobile-developers-d464d87fbf15 Автор разбирает, как в своей команде настроили Claude Code под iOS/Android-кодовые базы - от выбора между подпиской и API до конкретных плагинов и конфигов, которые реально дают эффект на мобильном проекте. ☝️В статье — практическое правило по выбору модели под задачу (архитектура vs рутина), как собрать CLAUDE.md так, чтобы он не жрал контекст впустую, разница между skills/plugins/MCP и конкретные рекомендации под мобильную разработку. 🔒 Отдельный и самый ценный блок — про безопасность плагинов: разбор популярного Superpowers и предупреждающая история с другим фреймворком, где вскрылись реальные проблемы с доверием. Плюс задокументированные атаки на экосистему плагинов Claude Code и практическая гигиена, как от них защититься. —————— 💭 Интересный разбор сетапа Claude Code под мобильную разработку, с реальными деталями про безопасность. Думаю, всем будет полезно и что-то можно взять для себя. Пишите в комментарии свои советы) Telegram | Селеба | YouTube
🐤 Android 18 Canary — три API, которые можно попробовать уже сейчас https://freedium-mirror.cfd/https://medium.com/@androidlab/android-18-canary-preview-the-new-apis-every-android-developer-should-try-now-7a889aa14a8a Автор обращает внимание на то, что Google, по его словам, отказался от прежней модели Developer Preview в пользу непрерывных ежемесячных Canary-сборок - пропустил билд, пропустил API. 3️⃣ Три вещи из свежих канареек, которые он выделяет: 1. AppFunctions (Android MCP) - приложение само становится on-device MCP-сервером. Gemini или любой другой агент вызывает функции приложения через чёткий интерфейс вместо скрейпинга UI: @AppFunction(description = "Add an item to the user's grocery list") suspend fun addGroceryItem( itemName: String, quantity: Int = 1 ): AppFunctionResult { val entry = GroceryEntry(name = itemName, qty = quantity) groceryRepository.insert(entry) return AppFunctionResult.success("Added $itemName x$quantity") } 2. Hybrid Inference в Firebase AI Logic - динамическая маршрутизация между on-device и облаком вместо выбора на этапе сборки: PREFER_ON_DEVICE, PREFER_CLOUD, ONLY_ON_DEVICE. val config = InferenceConfig.Builder() .setOrchestrationMode(OrchestrationMode.PREFER_ON_DEVICE) .build() 3. Zero-config peer-to-peer сеть эмуляторов для мультидевайс-тестирования без ручного проброса портов, и ADB Wi-Fi 2.0, который не рвётся при смене сети или сне машины. —————— 💭 Эти API уже в SDK Manager - может быть что-то полезно). Telegram | Селеба | YouTube
Пока просто порадуюсь, что мой первый личный релиз приложения состоялся на Авроре и в RuStore А завтра еще и пост вам накатаю как это было
видео или голосовое, без подписи
видео или голосовое, без подписи
видео или голосовое, без подписи
🚀 Jetpack Compose 1.12.0 [update] https://android-developers.googleblog.com/2026/08/jetpack-compose-august-2026-release.html Google выпустил стабильный Jetpack Compose 1.12.0 - релиз с крупным набором новых возможностей: mesh-градиенты, HDR/Wide Color Gamut, ускоренные `SideEffect, продакшен-готовые deferred-анимации, программное форматирование текста и интеграция с Credential Manager. 🟢 Mesh Gradients Новый MeshGradientPainter позволяет строить многоточечные органические цветовые градиенты. Вершины сетки задаются через setVertex() с координатами строки/столбца и смещением позиции. 🟢 Wide Color Gamut и HDR Полный пайплайн рендеринга теперь поддерживает Display P3 и HDR без клэмпинга цветов вне sRGB-пространства. На устройствах без поддержки (и на API ниже 28) цвета автоматически и безопасно откатываются к sRGB. 🟢 LayerOutsets Новый параметр LayerOutsets в GraphicsLayer и Modifier.graphicsLayer расширяет визуальные границы слоя за пределы измеренного размера - полезно для теней, свечения и других эффектов, которые раньше обрезались неявным clipToBounds. 🟢 SideEffect с ключами SideEffect теперь поддерживает key-аргументы для одноразовых эффектов, срабатывающих только при изменении конкретных ключей. По бенчмаркам команды Compose - до 90% быстрее LaunchedEffect и примерно на 20% быстрее DisposableEffect. SideEffect(key = userId) { analytics.logUserChanged(userId) } 🟢 Deferred-анимации перешли в стабильный статус DeferredTargetAnimation вышел из experimental. Добавлены DeferredAnimatedContent и DeferredAnimatedVisibility - composable для gesture-driven анимаций с плавной передачей в автоматический переход, ручным управлением свойствами на deferred-фазе и передачей velocity. Для shared element transitions добавлен флаг permitTransformDuringDeferredTransition. 🟢 Rich-text редактирование и Selection API BasicTextField научился программному rich-text форматированию через SpanStyle`/`ParagraphStyle и addStyle() в TextFieldBuffer, с методами getSpanStyles() и getParagraphStyles() - форматирование сохраняется при смене конфигурации. Новый SelectionState даёт программный контроль над выделением: selectAll(), clear(), select(TextRange), extendSelectionByWord(), а также реактивный selectedTexts в виде AnnotatedStrings. 🟢 Credential Manager в семантике Нативная интеграция с Android Credential Manager (API 34+) через credentialRequest semantics property и CredentialRequestData - passkey и сохранённые учётные данные можно запрашивать прямо из Compose-дерева без ручного моста к View-based API. 🟢 Именованные области в Grid @Experimental Grid-компонент получил семантическое определение регионов через area() в GridConfigurationScope. Элементы позиционируются через gridItem(areaId = "name") вместо числовых индексов — читаемее для сложных адаптивных раскладок. 🟢 Дополнительные улучшения: • Font variation settings для downloadable fonts • Автопрокрутка при выделении текста за пределами видимой области • `SoundEffectOnInteraction` composable для звуков взаимодействия • Новые `KeyboardType`: `Date`, `Time`, `DateTime`, `SignedDecimal` • `BasicSecureTextField` теперь по умолчанию использует `TextObfuscationMode.System` • Новые тестовые API: `hasPendingWork()` (проверка pending work без продвижения часов) и `runWithoutImplicitWait()` (ручное управление кадрами clock) • `captureToImage()` теперь захватывает popups/dialogs с якорями (anchors) • `onRootWithViewInteraction` скоупит поиск на конкретные Android View • `@PreviewWrapper` - переиспользуемые обёртки для `@MultiPreview`-классов • Time to Initial Display приближается к показателям View-based реализаций ❗️Главное, на что стоит обратить внимание при апгрейде - требование compileSdk 37 и AGP 9.2.0. Более подробно и с примерами - тут —————— 💭 Сразу несколько направлений получили заметный апгрейд. Особенно выделяются два изменения с прямым влиянием уже сейчас: keyed `SideEffect` (реальный performance-выигрыш почти без переписывания логики) и HDR/Wide Color Gamut пайплайн (актуально для медиа- и фото-приложений). Telegram | Селеба | YouTube
видео или голосовое, без подписи
видео или голосовое, без подписи
видео или голосовое, без подписи
видео или голосовое, без подписи
▶️ Media3 (ExoPlayer) 1.11.0 [update] https://android-developers.googleblog.com/2026/08/media3-1-11-whats-new.html Библиотека получила крупный набор Compose-компонентов для плеера, интеграцию с Cast/SystemUI Output Switcher, Kotlin-first HTTP-стек на Ktor и новые мьюксеры для Ogg и WAV. ▶️ Customizable Player Layout в Compose Новая система слотов - top, center, bottom controls плюс error overlay - позволяет собирать плеер под конкретный UI без переписывания стандартных контролов с нуля. Player( player = player, topControls = { PlayerDefaults.TopControls(player) }, centerControls = { PlayerDefaults.CenterControls(player) }, bottomControls = { PlayerDefaults.BottomControls(player) }, ) ▶️ PlayerPool Механизм для эффективного управления несколькими экземплярами ExoPlayer одновременно - прицельно решает проблему лент коротких видео (short-form feeds), где раньше приходилось вручную управлять пулом плееров. ▶️ MiniController composable Компактные контролы воспроизведения с поддержкой Material3 Dynamic Color - готовый компонент для мини-плеера внизу экрана. ▶️ KtorDataSource Новое расширение источника данных на базе Ktor - Kotlin-first, coroutine-friendly сетевой стек как альтернатива стандартному HTTP data source. ▶️ Дополнительные улучшения: • Асинхронное подключение MediaSession через onConnectAsync() - с проверкой авторизации без блокировки основного потока override fun onConnectAsync( session: MediaSession, controller: MediaSession.ControllerInfo ): ListenableFuture<MediaSession.ConnectionResult> { return authenticateControllerAsync(controller) } • CastParams + реактивный MediaRouteButton в Compose - автоматически отслеживает состояние диалога Cast val castParams = CastParams.Builder() .setShowSystemOutputSwitcherOnCastButtonClick(true) .build() Cast.getSingletonInstance(context).initialize(castParams) • Усиленные security-дефолты - ограничение доступа к данным сессии со стороны недоверенных контроллеров • Поддержка Eclipsa Video (HAGC dynamic HDR metadata) на API 37+ • OggMuxer для OPUS/VORBIS и WavMuxer для PCM-аудио • Поддержка MP4 track reference и извлечение chapters из нескольких форматов 🟢 Можно обновляться сразу - breaking changes не заявлены, а новые Compose-компоненты и PlayerPool стоит взять на вооружение, если в проекте есть лента видео. —————— 💭 Главный акцент релиза - Compose. PlayerPool и MiniController закрывают частую боль при реализации лент коротких видео в духе TikTok/Reels на Compose, где раньше приходилось городить собственное управление жизненным циклом плееров. KtorDataSource тоже приятное дополнение для тех, кто уже держит Ktor как основной сетевой стек в KMP-проектах - не придётся тащить OkHttp только ради Media3. Telegram | Селеба | YouTube
🤔 Strong Skipping Mode не отменяет стабильность https://blog.shreyaspatil.dev/stop-ignoring-compose-stability-yes-even-with-strong-skipping-mode/ Автор разбирает популярный миф про SSM: раз все композаблы теперь skippable, ImmutableList и @Stable больше не нужны. На деле способ сравнения параметров разный - unstable сравниваются через === (по ссылке), stable — через .equals() (по содержимому). И это меняет всё. 👨💻 В статье показывается живое видео-демо с двумя одинаковыми экранами и счётчиками рекомпозиций - один принимает обычный List<Item>, другой PersistentList<Item>. При пересоздании списка с абсолютно тем же содержимым unstable-карточка рекомпозится на каждый клик, а stable вообще не шевелится. Разница видна глазами, а не в теории. ➕ Бонусом: ловушка data class (одно unstable-поле внутри заражает весь класс) и неожиданный контр-пример: скипание само по себе не бесплатно, для крошечных композаблов с гигантским объектом на входе иногда дешевле вообще выключить проверку через @NonSkippableComposable. —————— 💭 Хороший разбор про SSM - живым видео-демо и счётчиками вместо теории. Скинь тому, кто оптимизирует Compose. Telegram | Селеба | YouTube