TGINSIGHT CHAT
Android Broadcast
@android_broadcast
TechnologiesПодборка новостей и статей для Android разработчиков. Реклама и связь с автором @ab_manager РКН https://abdev.by/rkn_tg_ab#MQRZR
Posts récents
Tag : #androiddev · 66 posts
Publié 11 mars
🤖Как уменьшить задержку воспроизведения видео? Решение есть в AndroidX Media3 Одна из задач при скролле контента в ленте - убрать задержку показа/воспроизведения контента, чтобы у пользователя не было ожидания или оно было минимальным (при условии стабильного интернет соединения). Для более быстрого старта воспроизведения видео стоит использовать Preload API в ExoPlayer из Jetpack Media 3. В посте приложил демонстрацию как это реально уменьшает задержку старта воспроизведения. 🔗 Опытом адаптации PreloadManager в приложение поделились в статье 🔗 Руководство по интеграции PreloadManager в документации * Instagram признан экстремистcкой организацией на территории Российской Федерации #Android#AndroidDev#ExoPlayer
Hashtags
Publié 10 mars
🤖AndroidX Tracing 2.0 — поддержка Desktop JVM и Kotlin Coroutines AndroidX Tracing — это библиотека для добавления данных в код, которая позволяет видеть что происходит внутри приложения в профилировщиках вроде Perfetto и Android Studio. До версии 2.0 она была завязана исключительно на android.os.Trace — то есть работала только на Android. Теперь всё изменилось. Версия 2.0 полностью пересматривает подход: 👉Поддержка Desktop JVM — трейсинг теперь работает не только на Android, но и на обычной JVM. Это открывает возможность профилировать host-инструменты, Gradle-таски и shared-код в KMP-проектах. 👉Propagation для корутин — классическая проблема: suspend-функции разрывали трейс на несвязанные куски и было непонятно что к чему относится. Теперь traceCoroutine() прокидывает контекст трейса через корутины автоматически. 👉Метаданные в слайсах — к каждому трейс-событию можно прикрепить аргументы. Видишь слайс в Perfetto и сразу понимаешь с какими параметрами он вызван. 👉Новый формат — Perfetto trace — трейсы совместимы с Android Studio и Perfetto UI из коробки. Новый API выглядит так: val driver = TraceDriver(sink = TraceSink( sequenceId = 1, directory = File("/tmp/perfetto") ), isEnabled = true) driver.use { driver.tracer.trace(category = CATEGORY_MAIN, name = "my_operation") { // твой код } } ⚠️ Пока это только alpha и многих привычных возможностей нету, но будут к релизу Stable версии. #Android#AndroidDev#KMP#AndroidX#Производительность
Publié 9 mars
🤖Snapdragon Wear Elite — новый чип для носимых устройств На MWC 2026 Qualcomm анонсировала Snapdragon Wear Elite — первый чип серии Elite для носимых устройств. И это реально большое обновление на бумаге. Чип сделан по 3нм техпроцессу. По сравнению с предыдущим Snapdragon W5+ Gen 2: 🚀 5x быстрее по CPU 🚀 7x быстрее по GPU 🔋 +30% к времени работы от батареи ⚡️зарядка до 50% всего за 10 минут Главная фишка — впервые в носимых появился выделенный Hexagon NPU с поддержкой моделей до 2B параметров прямо на устройстве🤯 Это значит, что голосовые помощники, перевод, транскрибация и фитнес-аналитика смогут работать без облака. Первые устройства ждём уже через несколько месяцев. Интересно, будет ли это заметно в реальном использовании или снова всё утонет в маркетинге AI-фич, а их работа приведет к быстрому сгоранию заряда батарейки на устройстве. #Android#AndroidDev#WearOS
Hashtags
Publié 6 mars
🤯 Неожиданно по всем бенчмаркам побеждает Gemini модель. В тесте надо разбираться и понимать какая настройка давалась моделям, но почему-то сразу ощущается подкручивание результатов в пользу своих моделей. 💬 Как вы оцениваете результаты? #Android#AndroidDev#Benchmark#AI#ИИ
Publié 6 mars
🚀Появился Android бенчмарк LLM от Google Давно пора было, чтобы кто-то взялся за оценку LLM системно. Вопрос "какая модель лучше пишет Android-код" висел в воздухе, и каждый отвечал на него субъективно или на основе личных впечатлений и умений. Общие тесты, публикуемые при выходе модели, не говорят ничего про то, умеет ли модель разобраться в реальных задачах Android разработки. Android Bench закрывает именно этот пробел. Задачи взяты из реальных публичных Android-репозиториев на GitHub — никакой синтетики, разного уровня сложности. Модель должна самостоятельно починить проблему, а результат проверяется через unit или instrumentation-тесты. Никакой субъективщины — только прогон тестов. Модели справились только с 16–72% задач. Разброс огромный и показывает, где пропасть между разными моделями. 🔗 Подробности про Android Bench 🐱 GitHub репо Android Bench 🔗 Источник - блог Android Developers #Android#AndroidDev#Benchmark#AI#ИИ
Publié 4 mars
🤯Конец Android View ближе чем кажется - в будущей версии Android Studio убирают поддержку превью для Custom View. Источник - сайт Android Developers #Android#AndroidDev#Compose#AndroidStudio
Publié 2 mars
🤖Google анонсировали Automated Prompt Optimization (далее APO) для Vertex AI. Это будет полезно всем тем кто работает с on-device AI на Android Если вы ещё не слышали про ML Kit Prompt API — это способ запускать Gemini Nano прямо на Android устройстве без обращения к серверу. Модель живёт в Android AICore как системный сервис, приложение просто отправляет промпт и получает ответ. APO появился с целью настройки общей модели под конкретную задачу. Это облачный инструмент, который автоматически ищет оптимальный системный промпт для вашей задачи. Вы даёте примеры входных данных и ожидаемых ответов, Gemini Pro/Flash анализирует ошибки, генерирует десятки вариантов промптов параллельно и выбирает лучший. На выходе — просто текст промпта, который вы зашиваете в своё приложение. Google утверждают, что это даёт📈 +5–8% к точности на реальных задачах: классификация, перевод, определения намерения. Пока ML Kit Prompt API доступен только на ограниченном числе устройств, но направление очевидно — Google всерьёз строят экосистему on-device AI для Android-разработчиков 🔗 Источник - официальный блог Android Developers #Android#AndroidDev#MLKit#GeminiNano#OnDeviceAI
Publié 25 févr.
🤖 Вышел Coil 3.4.0 Coil - это библиотека для загрузки изображений на Android (и теперь Compose Multiplatform). Название расшифровывается как Coroutine Image Loader — библиотека написана на Kotlin с первого дня и отлично вписывается в современный стек: корутины, Compose, KMP. В новой версии несколько интересных вещей: 🔁 ConcurrentRequestStrategy — теперь можно объединять параллельные сетевые запросы на один и тот же ресурс. По умолчанию отключено и помечено как экспериментальное, но идея хорошая — вместо N одинаковых запросов летит один, остальные ждут результата. 🧵 Асинхронный декодинг JS/WASM — изображения больше не блокируют главный поток браузера. Важно для KMP-проектов с вебом. 🐧 Linux targets — добавили поддержку linuxX64 и linuxArm64 для non-Compose артефактов. 🎞 Улучшенные переходы в Compose — новый useExistingImageAsPlaceholder позволяет плавно переходить от предыдущего изображения, когда нет placeholder. Мелочь, но визуально приятно. 🎬 Embedded video thumbnails — поддержка встроенных превью для видео. 🔧 coil-lint — добавили Android Lint-правило, которое ловит случайные вызовы kotlin.error() внутри блоков ImageRequest.Builder. Неожиданно полезно. Зависимости Kotlin 2.3.10, Compose 1.9.3, Okio 3.16.4. #Android#AndroidDev#KMP#kCMP#Compose
Publié 20 févr.
🤖Очередная порция ограничений для Activity в Android 17 Копался в behavior changes для Android 17 и наткнулся на очередное закручивание гаек вокруг запуска Activity из фона. На этот раз Google расширил BAL (Background Activity Launch) ограничения на IntentSender IntentSender - это обёртка над PendingIntent, позволяющая передать право запуска Intent другому приложению или системе. Именно через него работают уведомления, виджеты, shortcuts и межпроцессные вызовы. Так вот, константа MODE_BACKGROUND_ACTIVITY_START_ALLOWED теперь deprecated. Если где-то передаёте её через ActivityOptions при работе с PendingIntent — нужно мигрировать на MODE_BACKGROUND_ACTIVITY_START_ALLOW_IF_VISIBLE. Разница в том, что теперь Activity из фона запустится только если вызывающее приложение видимо пользователю. val options = ActivityOptions.makeBasic().apply { pendingIntentBackgroundActivityStartMode = ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOW_IF_VISIBLE } Найти проблемные места просто — Google обновил lint и StrictMode под новые требования. Запускаете lint, ищете использования MODE_BACKGROUND_ACTIVITY_START_ALLOWED и получаете полный список того, что нужно поправить. Формально это касается только targetSdk 17+, но лучше не тянуть — сами знаете, как работают дедлайны в Play Console. 🔗Источник developer.android.com #Android17#androiddev#security#activity
Publié 2 févr.
🤖 Android Gradle Plugin 9 упрощает запуск unit-тестов По умолчанию Android Gradle Plugin создаёт Gradle-задачи для запуска unit-тестов во всех доступных build types, что на практике почти никогда не нужно. Обычно тесты запускаются только для debug-сборки. В реальных проектах (особенно с product flavors и большим количеством модулей) это приводит к сотням лишних задач, увеличению времени конфигурации и дополнительной нагрузке на IDE и CI. Чтобы оптимизировать работу Gradle, начиная с AGP 9.0, можно в gradle.properties добавить: android.onlyEnableUnitTestForTheTestedBuildType=true После этого unit-тесты будут генерироваться только для основного тестируемого build type (как правило, debug). Это: 👉 убирает лишние Gradle-задачи; 👉 сокращает время конфигурации проекта; 👉 снижает потребление памяти; 👉 ускоряет локальную разработку и CI-пайплайны. Если вы не запускаете unit-тесты для release-сборок (а так делают почти все), то включение этого флага — бесплатная оптимизация сборочной инфраструктуры. Это хороший пример того, как дефолтные настройки инструментов ориентированы на универсальность, а не на эффективность, и почему их стоит регулярно пересматривать в контексте реальной архитектуры проекта. #Android#AndroidDev#Gradle
Hashtags
Publié 1 févr.
🤖Разница между Permission и Ability в Android ОС Чтобы получить доступ к пользовательским данным или сенсорам, разработчику приходится работать с механизмом разрешений (permissions): пользователь должен выдать приложению право на использование соответствующего ресурса. Однако наличие Permission не гарантирует, что приложение действительно сможет получить эти данные. Например, приложению выдали доступ к геолокации, и формально оно имеет право узнать, где находится пользователь. Но при запросе локации приложение получает null. Почему? Здесь и появляется понятие Ability — фактическая возможность получить данные в текущий момент времени. И она может отсутствовать даже при наличии разрешения. Причин может быть множество: 👉 пользователь отключил геолокацию через быстрые настройки; 👉 система временно приостановила доступ (например, в режиме энергосбережения); 👉 прошивка вендора ограничила работу сенсора; 👉 администратор устройства запретил доступ к геолокации; 👉 отсутствует физический сигнал (GPS недоступен, нет сети и т.д.). Итог: Permission — это юридическое право, Ability — это реальная техническая возможность. С точки зрения архитектуры, наличие permission не должно рассматриваться как гарантия наличия данных. Бизнес-логика и use case’ы должны быть спроектированы так, чтобы корректно работать в ситуации отсутствия ability. Другими словами: приложение должно быть готово к тому, что внешний мир в любой момент может стать недоступным — даже если формально все разрешения выданы. Это означает: 1️⃣ отсутствие жёстких предположений о доступности данных; 2️⃣ обработку null, ошибок и таймаутов как нормального сценария; 3️⃣ явное моделирование состояний «данные недоступны» в доменной модели. Permission — это контракт с пользователем. Ability — это контракт с реальностью. И именно второй чаще всего нарушается. #AndroidDev#AndroidOS#Архитектура
Publié 19 janv.
🚀Google взялась за упрощение Picture‑in‑Picture PiP на Android долго был зоопарком: разный API на версиях, разный UI‑стейт, много if (SDK_INT…) и бойлерплейта. Новая Jetpack‑библиотека androidx.core:core-pip как раз и создана, чтобы это спрятать: она выравнивает вызовы PiP между версиями Android, даёт единый способ задавать параметры (особенно для видео/плееров), объединяет разрозненные колбэки состояния PiP и уменьшает количество кода за счёт готовых пресетов действий для типовых сценариев. Требования: обновляем Activity Чтобы всё это заработало, мало просто подключить core-pip — нужно обновиться до свежей Activity 1.13.0 (пока в альфе). В этой версии есть новые API для отслеживания состояния PiP (PictureInPictureUiStateCompat и слушатели), на которых удобно строить логику поведения UI, когда окно уходит в PiP или, например, «прячется» в угол. // Пример кода: реагируем на состояние PiP class PlayerActivity : ComponentActivity() { private val pipUiStateListener = Consumer<PictureInPictureUiStateCompat> { state -> if (state.isStashed) { /* спрятать контролы плеера */ } else { /* показать контролы плеера */ } } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // ... инициализация UI / плеера ... addOnPictureInPictureUiStateChangedListener(pipUiStateListener) } override fun onDestroy() { removeOnPictureInPictureUiStateChangedListener(pipUiStateListener) super.onDestroy() } } 🔗 Подробности про библиотека в документации #Android#AndroidDev#AndroidJetpack#PIP