Android Broadcast
14.6K subscribers
3.87K photos
399 videos
11 files
6.37K links
Подборка новостей и статей для Android разработчиков.

Реклама и связь с автором @ab_manager

РКН https://abdev.by/rkn_tg_ab #MQRZR
Download Telegram
This media is not supported in your browser
VIEW IN TELEGRAM
🐘 Gradle закрывается... Открывается Develocity. Компания официально сделала ребрендинг и сайт gradle.com теперь будет переадресовывать на develocity.ai — коммерческий продукт, который давно существовал, становится лицом.

#Gradle
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
🤖 Google отбирает у приложений WRITE_CONTACTS: контакты теперь сохраняются через системный редактор

Чтобы сохранить хотя бы один контакт, приложения до сих пор просили WRITE_CONTACTS, а оно позволяет менять всю адресную книгу в фоне. Интенты были альтернативой, но на разных устройствах вели себя по-разному. Google меняет правила: приложения с targetSdk следующей версии Android не смогут писать в контакты напрямую, такие записи упадут с SecurityException.

Вместо этого — ACTION_INSERT, ACTION_EDIT и ACTION_INSERT_OR_EDIT: они откроют стандартный системный редактор и не потребуют разрешений. Для чтения выбранных контактов есть Contact Picker, для «Позвонить через…» в мессенджерах — новый People Directory. Приложениям с фоновой синхронизацией (CRM, облака) дадут спецдоступ MANAGE_CONTACTS в Android 17 QPR2.

⚠️ Свои MIME-типы в Insert.DATA системный редактор молча проигнорирует, а SHOW_OR_CREATE_CONTACT он не обрабатывает.


🔗 Android Developers Blog

#Android #AndroidDev #Privacy #Android17
Please open Telegram to view this post
VIEW IN TELEGRAM
👍37🔥12❤3
Android Broadcast
🤖 Google отбирает у приложений WRITE_CONTACTS: контакты теперь сохраняются через системный редактор Чтобы сохранить хотя бы один контакт, приложения до сих пор просили WRITE_CONTACTS, а оно позволяет менять всю адресную книгу в фоне. Интенты были альтернативой…
Полностью ожидаемо когда появился Contact Picker в Android 17 и полностью правильно. Я не хочу никому давать все контакты: банкам, мессенджерам, соц. сетям и другим прилам. Жду теперь Scoped Contact чтобы самому выбирать, что пошарить в приложением
👍42❤6
🤖 MediaPipe LLM Inference больше не развивают: Google советует переходить на LiteRT-LM

Google сменила курс по on-device LLM одной плашкой в документации Google AI Edge: LLM Inference API из MediaPipe для Android, iOS и веба теперь только поддерживают, а новые возможности и оптимизации делают в LiteRT-LM. Когда это произошло, Google не пишет, но затишье видно и по релизам — последняя версия tasks-genai вышла на Google Maven ещё в конце апреля. Если вы через MediaPipe встроили в приложение языковую модель, которая работает прямо на телефоне, она продолжит работать, но всё новое теперь появляется только в LiteRT-LM, так что переезд стоит спланировать заранее.

LiteRT-LM — рантайм Google для языковых моделей поверх LiteRT. У него свой Kotlin API для Android и JVM с ускорением на GPU и NPU, мультимодальностью и вызовом инструментов. Модели нужны в формате .litertlm, готовые лежат в LiteRT Community на Hugging Face. Актуальная версия — litertlm-android:0.18.0, ещё до 1.0. Базовый сценарий из документации:

val engine = Engine(EngineConfig(modelPath = modelPath, backend = Backend.GPU()))
engine.initialize() // до ~10 секунд, не на главном потоке
engine.createConversation().use { conversation ->
conversation.sendMessageAsync("Привет!").collect { print(it) }
}


Для GPU в манифест нужно добавить uses-native-library для libOpenCL.so и libvndksupport.so с required="false".

⚠️ В AAR LiteRT-LM 0.18.0 нативные библиотеки есть только для arm64-v8a и x86_64. На 32-битных ARM-устройствах загрузка упадёт с UnsatisfiedLinkError, поэтому проверяйте Build.SUPPORTED_ABIS заранее — на это наткнулся Charles Hartmann.


🔗 MediaPipe LLM Inference · LiteRT-LM для Android · dev.to

#Android #AndroidDev #AI #LiteRT
❤2👍2
🚀 DataStore научился шифровать данные из коробки: замена EncryptedSharedPreferences дошла до RC

В 2025 году Google объявил deprecated всю библиотеку security-crypto вместе с EncryptedSharedPreferences и предложил работать с Android Keystore напрямую. Готовой замены «подключил и забыл» не было. Теперь она есть: в DataStore 1.3 появился артефакт datastore-tink, а 12 октября вышел 1.3.0-rc01, то есть API уже стабилен.

Шифрование подключается обёрткой над вашим сериализатором: AeadSerializer шифрует данные через Tink (AES-256-GCM), а ключ защищён Android Keystore.

// keysetHandle создаётся через AndroidKeysetManager
val aeadSerializer = AeadSerializer(
aead = keysetHandle.getPrimitive(
RegistryConfiguration.get(), Aead::class.java
),
wrappedSerializer = SettingsSerializer,
// уникальное имя защищает от подмены шифротекста
associatedData = "settings.json".encodeToByteArray(),
)
val dataStore = dataStore(
fileName = "settings.json",
serializer = aeadSerializer,
scope = scope,
)


Работает на Android и JVM. Ошибки расшифровки приходят как CorruptionException, так что их ловит обычный CorruptionHandler. Заодно в 1.3 появился DataStore.Builder, и Google советует переходить на него с DataStoreFactory.

🔗 Release notes DataStore · Разбор на ProAndroidDev

#Android #AndroidDev #DataStore #Security
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥60
🚀 Grab включил R8 на 10 млн строк кода и избавился от всплесков ANR после релизов

«Каждый еженедельный релиз — всплеск ANR», — так описывают жизнь команды Grab, суперприложения из Юго-Восточной Азии с 10-летней кодовой базой. Холодный старт тормозило чтение множества DEX-файлов, а Cloud Profiles из Google Play не покрывали их критичные пути вроде сборки графа Dagger.

Сначала команда перешла на proguard-android-optimize.txt и добавила Baseline и Startup Profiles, через девять месяцев — на R8 full mode. Вместо широких исключений нашли конкретные классы, к которым обращаются через рефлексию и динамические прокси, и написали для них точечные keep-правила. Оценки оптимизации R8 теперь отслеживают в CI, а новые keep-правила планируют пропускать только с обоснованием.

Итог: ANR меньше на 32%, холодный старт быстрее на 35%. Недавно писал, что Google взялся за R8 всерьёз, — вот как это выглядит на большом проекте.

🔗 Кейс Grab

#Android #AndroidDev #R8 #Performance
🔥23👍9
👨‍💻 Ты оптимизировал весь код, кроме собственного рабочего места?

Монитор — 4K.
Клавиатура — механическая.
Компьютер — зверь.
Кресло — работает на устаревшей прошивке с 2018 года. 💀

Кажется, пора выпускать обновление!

У «Эргостол» стартовала акция «Октябрь — месяц эргономики»: с 23 октября по 1 ноября скидки до -15% на товары акции.

🔥 Скидки суммируются с промокодом -10% ANDROID10 действует на сайте Эргостол и на Ozon!

Как насчёт апгрейда кресла? 🪑
🎥Смотрите обзор кресла Экзо Флекс: https://abdev.by/EiMt

👉 Выбрать себе обновления можно: тут

#реклама
👍5❤1
🤖 Mac.apk открыл исходники: Android-приложения на Mac без эмулятора и виртуальной машины

Чтобы запустить Android-приложение на Mac, обычно поднимают эмулятор — целый Android в виртуальной машине. Автор Mac.apk пошёл путём Wine: его программа сама изображает Android поверх macOS. 19 октября код открыли под AGPL-3.0.

При первом запуске DEX переводится в Java-байткод и работает на встроенной OpenJDK, 64-битный ARM-код выполняется на чипе Apple как есть, а графика идёт через ANGLE и MoltenVK в Metal. Каждое приложение — отдельное окно с иконкой в Dock.

Разработчикам важно: на Mac.apk ваше приложение запускается без настоящих Google Play Services: Play Billing и Play Integrity недоступны, а рекламный SDK Google получает пустой ответ. Если не хотите видеть там своё приложение, автор по запросу внесёт его в список блокировки.

⚠️ Это альфа-версия: нужны Apple Silicon и macOS 26.4+, часть приложений пока не запускается.


🔗 GitHub · Как это устроено · Для разработчиков

#Android #AndroidDev #macOS #OpenSource
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥27👍6
🤖 Google объяснил Android-разработчикам, как устроены ИИ-агенты и что писать в AGENTS.md

Агент обновляет библиотеку с ломающими изменениями, а нового API нет в его обучающих данных, и по сотням файлов сыплются ошибки компиляции. С разбора таких ситуаций начинается новый раздел AI tools на developer.android.com: агент — это LLM плюс обвязка с инструкциями, инструментами, навыками и циклом выполнения.

Главный практический совет: пишите в AGENTS.md конкретные команды и пути, а не пожелания. Не «убедись, что проект собирается», а ./gradlew assembleDebug; не «бери свежие версии», а «версии из gradle/libs.versions.toml, новые зависимости — только после вопроса». Навыки устаревают, поэтому свежие факты агенту лучше давать через поиск по документации в Android CLI.

В квикстарте инструменты подобраны под опыт: новичкам — Google AI Studio, своему агенту вроде Claude Code — Android CLI и skills, для продакшена — Android Studio.

🔗 Как работают агенты · Квикстарт

#Android #AndroidDev #AI #AIAgents
Please open Telegram to view this post
VIEW IN TELEGRAM
👍24❤5
🤖 Виджеты на Android 17: слишком тяжёлые картинки теперь роняют приложение

Приложение обновляет виджет с парой крупных фото и падает с IllegalArgumentException: RemoteViews for widget update exceeds maximum bitmap memory usage. Так Android 17 ведёт себя с приложениями на targetSdk 37: если картинки в RemoteViews не влезают в лимит, система отклоняет обновление и бросает исключение. На targetSdk 36 и ниже это пока только предупреждение в логе. Google переписал описание этого изменения и добавил, как считается лимит и как в него уложиться.

Лимит — 6 * width * height байт, то есть полтора полноэкранных буфера ARGB_8888. Считаются картинки для всех ориентаций и размеров виджета сразу, поэтому responsive-виджет легко съедает бюджет копиями одного и того же Bitmap.

👉 Размер экрана берите из WindowManager.currentWindowMetrics, а не из displayMetrics: на складных устройствах тот может вернуть размер неактивного дисплея.

👉 Уменьшайте картинки до размеров виджета, а для непрозрачных используйте RGB_565 — это вдвое меньше памяти.

👉 В Glance декодируйте Bitmap один раз в provideGlance до provideContent, иначе для каждого размера создаётся своя копия.

URI-картинки в лимит не входят, но лаунчер декодирует их в полном разрешении, так что класть в cacheDir тоже стоит уменьшенную версию.

🔗 Изменения поведения Android 17 · Виджеты на Glance

#Android #AndroidDev #Android17 #AppWidgets
👍17❤4
🚀 Предусловия UI-тестов через API — не всегда быстрее: замеры на 400+ Android-тестах

Почти каждый UI-тест в Android-приложении финансового сервиса начинался одинаково: шесть экранов логина и около 26 секунд, хотя логин эти тесты не проверяли. Команда проверила на Хабре известный совет «готовьте предусловия через API, а не через UI» на трёх кейсах в сьюте на Kaspresso.

Для логина совет сработал: вход через auth-слой приложения занял ~7 секунд вместо ~26, а общее время 418 тестов сократилось на 27%. А переключение тумблера через PATCH оказалось на 29% медленнее трёх тапов. Тест сам грузил большой список продуктов, который приложение потом загружало ещё раз.

Вывод авторов: выигрыш даёт не API сам по себе, а то, что из теста уходит длинная UI-цепочка, которая не лежит на пути к проверяемому экрану.

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

#Android #AndroidDev #Testing #Kaspresso
❤7👍3
🏝 DateParser Kotlin: «купить молоко завтра в 19:00» превращается в дату без сети и API-ключей

Пользователь пишет напоминание обычным текстом, а приложению нужно вытащить из него дату, время и сам текст задачи. Обычно для этого зовут облачный NLP-сервис или пишут свои регулярки. DateParser Kotlin делает это офлайн: из Buy milk tomorrow at 7pm получается Buy milk и завтрашние 19:00 в выбранной таймзоне.

Библиотека для Kotlin Multiplatform понимает английский и русский: Android, JVM и iOS. Она разбирает даты, время, диапазоны вроде «завтра с 17:30 до 20:00» и повторения вроде «каждые 2 дня». Context и инициализация не нужны.

val parser = DateParser()
val matches = parser.parse(
text = "buy in 5 hours",
reference = Instant.parse("2024-02-28T10:15:00Z"),
timeZone = TimeZone.UTC
)
val instant = matches.single().instant // 2024-02-28T15:15:00Z


Неоднозначные даты не угадываются: 03/04/2026 без явного DateOrder.MDY или DMY вернёт пустой результат. Кроме момента времени, DateMatch отдаёт конец диапазона, период повторения и оставшийся текст напоминания.

⚠️ Парсер построен на правилах: произвольный текст за пределами поддерживаемых форм может не распознаться. Android — от API 26, Swift/XCFramework-дистрибутива нет. Версия 0.1.3, репозиторий создан в октябре.


🔗 GitHub · Документация · klibs.io

#Kotlin #KMP #Multiplatform #OpenSource
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7