На developer.android.com выложили навык «Android ANR audit and fix». С ним агент может пройтись по коду и найти места, где главный поток рискует зависнуть: для каждого кандидата он доказывает, на каком потоке тот выполняется и что вызов действительно блокирует. Второй режим — разбор трассы ANR по готовому шаблону отчёта. Исправления агент предлагает, только если виновато само приложение, а не внешняя система.
Пригодится, если вы уже даёте ИИ-агентам работать с Android-проектом или разбираете пачки ANR из Play Console и Crashlytics.
Пока навык есть только в документации: в репозитории android/skills на GitHub его нет, установить через Android CLI тоже пока нельзя.
🔗 ANR audit and fix
#Android #ANR #AndroidDev #AI
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥32
В среду из Play убрали поддельный Chrome от Hizbartech со 100 000+ скачиваний, а сегодня Android Authority нашла копию WhatsApp. Карточка от разработчика Agment Assets sallu висит в сторе с сентября, скриншоты и описание скопированы с оригинала один в один, а у части пользователей она всплывает в рекламном блоке поиска над настоящим мессенджером.
По версии Android Authority, фейк, похоже, пользуется программой Early Access: по данным Bitdefender, там нет публичных отзывов, и предупредить остальных негде. Правда, в шапке карточки пометки Early Access сейчас не видно.
Проверка простая: в карточке WhatsApp разработчиком должен быть WhatsApp LLC. Если там кто-то другой, удаляйте и проверьте выданные разрешения.
⚠️ Что фейк делает внутри, пока неизвестно. Вечером 16.10 карточка приложения всё ещё была в сторе.
🔗 Android Authority · Bitdefender про Early Access · Фейковый Chrome · Карточка в Play
#Android #GooglePlay #Security
Please open Telegram to view this post
VIEW IN TELEGRAM
👍22🔥6❤3
Forwarded from AI Dev Broadcast
🔐 Взлом OpenCode Console: у части пользователей утекли ключи OpenAI, Anthropic и Google
В ночь на 17 октября злоумышленники проникли в старую систему OpenCode, которую компания как раз выводила из эксплуатации. Пострадали 1,4% пользователей OpenCode Console — те, кто подключил в рабочем пространстве собственные ключи внешних провайдеров: Console хранит их на своих серверах. Сама компания связывает взлом с «масштабной атакой дистилляции».
Многие узнали о взломе по счетам: в X пострадавшие пишут о списаниях от сотен долларов до $1700 за ночь. OpenCode разослала письма с темой «Action Required: Potential provider key breach»; кто письма не получил, тех, по словам компании, не задело. Если вы подключали свои ключи в Console, отзовите их и проверьте расходы у провайдеров за выходные. Сегодня утром Тибо из команды Codex написал, что OpenAI вместе с OpenCode вернула своим API-клиентам деньги, списанные в ходе атаки.
🔗 OpenCode · The Latent · Тибо (OpenAI)
#AI #OpenCode #Security
В ночь на 17 октября злоумышленники проникли в старую систему OpenCode, которую компания как раз выводила из эксплуатации. Пострадали 1,4% пользователей OpenCode Console — те, кто подключил в рабочем пространстве собственные ключи внешних провайдеров: Console хранит их на своих серверах. Сама компания связывает взлом с «масштабной атакой дистилляции».
Многие узнали о взломе по счетам: в X пострадавшие пишут о списаниях от сотен долларов до $1700 за ночь. OpenCode разослала письма с темой «Action Required: Potential provider key breach»; кто письма не получил, тех, по словам компании, не задело. Если вы подключали свои ключи в Console, отзовите их и проверьте расходы у провайдеров за выходные. Сегодня утром Тибо из команды Codex написал, что OpenAI вместе с OpenCode вернула своим API-клиентам деньги, списанные в ходе атаки.
⚠️ Расследование ещё идёт: OpenCode не раскрыла подробностей и не сообщила, как с компенсациями у Anthropic и Google. Суммы списаний — со слов пользователей, The Latent проверить их не смогла.
🔗 OpenCode · The Latent · Тибо (OpenAI)
#AI #OpenCode #Security
❤8🔥6👍3
🔐 GitHub Security Lab нашла ИИ-агентом 24 уязвимости в Android-приложениях
Kevin Stubbings из GitHub Security Lab рассказал, как настроил открытый Taskflow Agent на поиск уязвимостей именно в Android. Агент сначала выделяет мобильные точки входа (экспортированные активити, интенты, диплинки), а потом проверяет каждую по списку типичных для Android классов уязвимостей. Итог — 24 уязвимости, о которых сообщили разработчикам, среди них несколько критических.
Самая показательная нашлась в приложении Wikipedia. Диплинк
Под условие подходит и
Проверить свой проект можно в Codespace из репозитория seclab-taskflows:
🔗 GitHub Blog · seclab-taskflows · Taskflow Agent
#Android #AndroidDev #Security #AI
Kevin Stubbings из GitHub Security Lab рассказал, как настроил открытый Taskflow Agent на поиск уязвимостей именно в Android. Агент сначала выделяет мобильные точки входа (экспортированные активити, интенты, диплинки), а потом проверяет каждую по списку типичных для Android классов уязвимостей. Итог — 24 уязвимости, о которых сообщили разработчикам, среди них несколько критических.
Самая показательная нашлась в приложении Wikipedia. Диплинк
wikipedia:// проверял хост так:if (it.authority.orEmpty().endsWith(WikiSite.BASE_DOMAIN)) {
// открыть страницу во встроенном WebView
}Под условие подходит и
evil-wikipedia.org. Приложение открывает такую страницу в своём WebView и выполняет её JavaScript, а такая же проверка в менеджере cookie отдаёт ей долгоживущие токены сессии — это захват аккаунта. В навигаторе OsmAnd (10M+ скачиваний) любое приложение без разрешений могло через экспортированную MapActivity тихо подменить настройки и получать маршруты пользователя на свой сервер.Проверить свой проект можно в Codespace из репозитория seclab-taskflows:
./scripts/audit/run_mobile.sh myorg/myrepo, на среднем репозитории это час-два.⚠️ Нужна лицензия GitHub Copilot, и запуск тратит много премиум-запросов. Модель часто завышает серьёзность и находит малозначимое, так что каждую находку должен проверить человек.
🔗 GitHub Blog · seclab-taskflows · Taskflow Agent
#Android #AndroidDev #Security #AI
🔥12
Знакомая картина:
baseline-prof.txt лежит в репозитории, задача генерации проходит в каждом релизе, профиль честно попадает в APK, а первый запуск быстрее не стал. Yadnyesh Rana на dev.to разбирает, как профиль может присутствовать и при этом ничего не делать, причём сборка об этом промолчит.Первая причина: профиль сняли не с той сборки.
BaselineProfileRule из Macrobenchmark должен работать с вариантом, устроенным как релиз: с R8-минификацией (сжатием и переименованием кода) или с отдельным benchmarkRelease, который повторяет релиз. Если генератор гоняли на обычном debug, профиль, по словам автора, ссылается на исходные имена классов, которые R8 в релизе уже переименовал. ART загружает такой профиль, не находит совпадений и молча считает его пустым. Касается это всех, кто включил R8, так что первым делом проверьте, что testBuildType в модуле бенчмарков указывает на релизный вариант.Вторая причина: профиль устарел. Он вшивается в APK при сборке из
src/main/baselineProfiles/ и сам не обновляется, когда появляется новый Compose-экран или пункт навигации. Код такого экрана остаётся без AOT-компиляции (заранее, при установке): сначала он интерпретируется, потом постепенно разогревается JIT, и пользователь видит те же подтормаживания, что и без профиля. Сборка при этом не падает, ведь старый профиль формально валиден. Сильнее всего это бьёт по командам, которые часто выпускают новые экраны, поэтому автор советует перегенерировать профиль перед релизом, если менялся критический путь пользователя, и вписать это в релизный чек-лист.Третья причина: установку никто не проверял. По словам автора, именно она съедает больше всего времени. Изнутри приложения проблему не видно, а файл в APK ещё не значит, что ART скомпилировал по нему код. В документации Android состояние компиляции предлагают смотреть так:
adb shell dumpsys package dexopt | grep -A 1 com.example.app
В выводе должен быть
status=speed-profile. Момент записи профиля при первом запуске видно в adb logcat -s ProfileInstaller:*, а самый наглядный сигнал даёт Macrobenchmark: сравните StartupTimingMetric с профилем и без него на одном устройстве и в одном сценарии. Если разница в пределах погрешности, профиль где-то молча отвалился.⚠️ В статье для проверки предлагаютdumpsys package compiler-statsс поискомreason=speed-profile, а в документации Android статус компиляции смотрят черезdumpsys package dexopt.
🔗 dev.to · Документация Android
#Android #AndroidDev #BaselineProfiles #Performance
Please open Telegram to view this post
VIEW IN TELEGRAM
5🔥13❤7
🛒 Google Play: Ask Play сравнивает приложения, Engage SDK на 9 категорий
Google обновила инструменты discovery и engagement для разработчиков. Часть уже в Play Console, часть раскатывается.
👉 Ask Play. Динамические сравнения приложений бок о бок прямо в поиске — по подпискам, офлайн и другим пунктам листинга
👉 Play в Gemini. Уже >6 млн установок за 2 месяца с запуска; рекомендации приложений теперь и через Gemini Live голосом
👉 Deep links. Встроенный эмулятор deep links в Play Console — проверять ссылки без физического устройства
👉 Engage SDK. Персональный контент в Apps Home / You tab — теперь 9 категорий, включая Education и Health & Fitness
👉 Игры. Play Games Rewards в GA; Sprints — 48-часовые матчи 2–5 игроков. Apps Experience / Level Up доступны в EEA, UK, US, AU, JP
🔗 Android Developers Blog
#Android #AndroidDev #GooglePlay
Google обновила инструменты discovery и engagement для разработчиков. Часть уже в Play Console, часть раскатывается.
👉 Ask Play. Динамические сравнения приложений бок о бок прямо в поиске — по подпискам, офлайн и другим пунктам листинга
👉 Play в Gemini. Уже >6 млн установок за 2 месяца с запуска; рекомендации приложений теперь и через Gemini Live голосом
👉 Deep links. Встроенный эмулятор deep links в Play Console — проверять ссылки без физического устройства
👉 Engage SDK. Персональный контент в Apps Home / You tab — теперь 9 категорий, включая Education и Health & Fitness
👉 Игры. Play Games Rewards в GA; Sprints — 48-часовые матчи 2–5 игроков. Apps Experience / Level Up доступны в EEA, UK, US, AU, JP
🔗 Android Developers Blog
#Android #AndroidDev #GooglePlay
❤6
Android Broadcast
#Gradle #AI
Please open Telegram to view this post
VIEW IN TELEGRAM
❤7
This media is not supported in your browser
VIEW IN TELEGRAM
#Gradle
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
Чтобы сохранить хотя бы один контакт, приложения до сих пор просили
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
Полностью ожидаемо когда появился Contact Picker в Android 17 и полностью правильно. Я не хочу никому давать все контакты: банкам, мессенджерам, соц. сетям и другим прилам. Жду теперь Scoped Contact чтобы самому выбирать, что пошарить в приложением
👍43❤6
🤖 MediaPipe LLM Inference больше не развивают: Google советует переходить на LiteRT-LM
Google сменила курс по on-device LLM одной плашкой в документации Google AI Edge: LLM Inference API из MediaPipe для Android, iOS и веба теперь только поддерживают, а новые возможности и оптимизации делают в LiteRT-LM. Когда это произошло, Google не пишет, но затишье видно и по релизам — последняя версия
LiteRT-LM — рантайм Google для языковых моделей поверх LiteRT. У него свой Kotlin API для Android и JVM с ускорением на GPU и NPU, мультимодальностью и вызовом инструментов. Модели нужны в формате
Для GPU в манифест нужно добавить
🔗 MediaPipe LLM Inference · LiteRT-LM для Android · dev.to
#Android #AndroidDev #AI #LiteRT
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
В 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.
Сначала команда перешла на
Итог: ANR меньше на 32%, холодный старт быстрее на 35%. Недавно писал, что Google взялся за R8 всерьёз, — вот как это выглядит на большом проекте.
🔗 Кейс Grab
#Android #AndroidDev #R8 #Performance
«Каждый еженедельный релиз — всплеск 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%
Как насчёт апгрейда кресла? 🪑
🎥Смотрите обзор кресла Экзо Флекс: https://abdev.by/EiMt
👉 Выбрать себе обновления можно: тут
#реклама
Монитор — 4K.
Клавиатура — механическая.
Компьютер — зверь.
Кресло — работает на устаревшей прошивке с 2018 года. 💀
Кажется, пора выпускать обновление!
У «Эргостол» стартовала акция «Октябрь — месяц эргономики»: с 23 октября по 1 ноября скидки до -15% на товары акции.
🔥 Скидки суммируются с промокодом -10%
ANDROID10 действует на сайте Эргостол и на Ozon!Как насчёт апгрейда кресла? 🪑
🎥Смотрите обзор кресла Экзо Флекс: https://abdev.by/EiMt
👉 Выбрать себе обновления можно: тут
#реклама
👍5❤1
Чтобы запустить 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
🔥28👍6
Агент обновляет библиотеку с ломающими изменениями, а нового 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: слишком тяжёлые картинки теперь роняют приложение
Приложение обновляет виджет с парой крупных фото и падает с
Лимит —
👉 Размер экрана берите из
👉 Уменьшайте картинки до размеров виджета, а для непрозрачных используйте
👉 В Glance декодируйте Bitmap один раз в
URI-картинки в лимит не входят, но лаунчер декодирует их в полном разрешении, так что класть в
🔗 Изменения поведения Android 17 · Виджеты на Glance
#Android #AndroidDev #Android17 #AppWidgets
Приложение обновляет виджет с парой крупных фото и падает с
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
Почти каждый UI-тест в Android-приложении финансового сервиса начинался одинаково: шесть экранов логина и около 26 секунд, хотя логин эти тесты не проверяли. Команда проверила на Хабре известный совет «готовьте предусловия через API, а не через UI» на трёх кейсах в сьюте на Kaspresso.
Для логина совет сработал: вход через auth-слой приложения занял ~7 секунд вместо ~26, а общее время 418 тестов сократилось на 27%. А переключение тумблера через PATCH оказалось на 29% медленнее трёх тапов. Тест сам грузил большой список продуктов, который приложение потом загружало ещё раз.
Вывод авторов: выигрыш даёт не API сам по себе, а то, что из теста уходит длинная UI-цепочка, которая не лежит на пути к проверяемому экрану.
🔗 Статья на Хабре
#Android #AndroidDev #Testing #Kaspresso
❤7👍3
Forwarded from Kotlin Multiplatform Broadcast
Пользователь пишет напоминание обычным текстом, а приложению нужно вытащить из него дату, время и сам текст задачи. Обычно для этого зовут облачный 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
👍8🔥1