Создаём игру для Android через Unity за 45 минут!
Это видео — пошаговая инструкция по созданию игры, смотрите и повторяйте! Вместе с автором видео вы начнёте с пустого проекта, а закончите полноценным приложением (apk-файлом), которое сможете опубликовать в Google Play.
Перейти к просмотру
#unity#apk#android
🤖Улучшения R8 - минификатора кода в Android
В AGP 9.0 R8 получил несколько изменений, в основном направленных на оптимизацию Kotlin-кода, упрощение desugaring-пайплайна и улучшение диагностики.
Основные изменения:
👉 Новая опция -processkotlinnullchecks для обработки null-проверок, сгенерированных компилятором Kotlin. Можно задать одно из значений:
- keep - оставить проверки;
- remove_message - убрать сообщения об ошибках;
- remove - полностью удалить проверки.
Опция используется для уменьшения байткода и снижения runtime-накладных расходов в production. Я еще в 2019 писал статью про это и удалял код с помощью -assumenosideeffects
👉 Keep rules больше не применяются к companion methods
R8 перестал переносить keep-информацию на синтетические companion-методы, сгенерированные при desugaring интерфейсов.
Это ломает редкий кейс с minSdk < 24, но делает поведение более консистентным с остальными синтетическими элементами.
👉 Минимизированные имена синтетических классов в L8
L8 теперь генерирует более короткие имена для synthetic-классов ($1, $2 вместо длинных $$ExternalSynthetic...), что уменьшает размер DEX.
L8 — это утилита, стоящая за library desugaring в Android. Позволяет использовать новые API на старых версиях Android и править баги в них, делая использование API прозрачным.
AGP 9.0 прокачало R8 и L8, чтобы делать меньше лишнего байткода, более агрессивно оптимизировать Kotlin. Большинство изменений работают прозрачно, но в сумме дают более компактные сборки и более предсказуемый build-процесс.
🔗 Источник - документация по AGP 9.0
#Android#AndroiDev#Gradle#R8
✅ Через неделю
✅ Pytup
📅 28 марта / 18:30–20:30 (время Екатеринбургское, МСК+2) / Екатеринбург, ул. Хохрякова д.10, БЦ «Палладиум», 4 этаж
💵 Бесплатно
📝 Регистрация тут: https://goo.gl/mYKbxc
Приглашаем Python-разработчиков послушать доклады экспертов, задать им вопросы и поговорить на профессиональные темы в кругу единомышленников.
На встрече мы обсудим расширение на Rust, непредсказуемость кода и приложение, которое помогает вывести продукт на рынок.
🔗 Программа: https://goo.gl/TisbTD
#frontend#python#Екатеринбург
✅ BIG DATA 2018
📅 28 марта / 09:30–18:00 (время МСК) / Москва, 1-й Зачатьевский пер., д. 4
💵 Платно
📝 Регистрация и условия участия тут: https://goo.gl/Rajgce
BIG DATA 2018 — это исчерпывающая картина текущего состояния и перспектив индустрии больших данных.
Участие в форуме поможет Вам выбрать правильное направление и найти надежных попутчиков на сложном пути перехода к цифровой экономике — экономике, основанной на данных.
🔗 Программа: https://goo.gl/RYpiwQ
#BigData#Москва
✅ Android Paranoid
📅 28 марта / 18:00–21:30 (время МСК) / Санкт-Петербург, Пискарёвский проспект, д.2к2, лит.Щ, БЦ «Бенуа», 5 этаж
💵 Бесплатно
📝 Регистрация тут: https://goo.gl/5D5TCE
В этом году Андроиду исполняется десять лет. Отличный повод встретиться и поговорить про легендарную мобильную ОС! 😉
🔗 Программа: https://goo.gl/xHz2Hg
#android#java#mobile#mobileapps#СанктПетербург
🛒Приложения с Google Play Services смогут проверять была ли установка их продукта на устройстве, даже если происходил его сброс 🤯 Фича называется Device Recall
Приложения смогут сохранить и получить данные, связанные с конкретным устройством. Информация сохраняется на серверах Google, что позволит получить данные после переустановки и даже сброса устройства до заводских настроек.
#googleplay#gms#android#безопасность#googleio
🤖Google создаёт бенчмарк для оценки ИИ-моделей в Android-разработке
С каждым месяцем всё больше кода для Android пишется с помощью ИИ, но текущие модели далеко не всегда способны качественно решать реальные задачи Android-проектов.
Теперь Google готовит новый набор задач для обучения и оценки LLM-моделей, специально под Android.
🎯 Цель — создать эталон (“north star”) качественной Android-разработки и помочь создателям ИИ-моделей адаптировать их под реальные сценарии мобильной разработки.
📂 Бенчмарк основан на реальных pull-request’ах из публичных Android-репозиториев GitHub.
Методика простая:
1️⃣ Каждая модель должна сделать PR с решением задачи.
2️⃣ Результат проверяется автотестами, написанными людьми.
Так бенчмарк сможет объективно измерить, насколько ИИ умеет ориентироваться в больших кодовых базах и решать практические задачи Android-разработки.
🗓 Сейчас команда финализирует набор задач, а результаты планируют опубликовать в конце 2025 — начале 2026 года.
Остаётся дождаться, чтобы увидеть, какие модели действительно умеют писать Android-код — и насколько они приближаются к уровню живых разработчиков. Главное, чтобы тесты не подгоняли под Gemini, а сообществу дали возможность контрибьютить в бенчмарк 😉
#ии#ai#android#benchmark#google
📹Finding The Perfect Gemini fit on Android (13 мин)
Рассказ про GenAI модели из Google ML Kit и как можно их использовать на устройствах без подключения к сети (список моделей - флагманы 2024-2025 года)
#android#mlkit#ai#gemini#googleio
🤖Как обработать слишком быстрый ввод пользователя с помощью Coroutines Flow
Если внимательно посмотреть на поведение людей в поисковых полях, становится понятно:
пальцы работают быстрее, чем приложение успевает реагировать.
Пользователь печатает «a», тут же «an», следом «and» — а приложение в панике пытается перестроить результаты после каждого шага. Поток начинает «стрелять» событиями, система перегружается, а интерфейс выглядит так, будто его кто-то перематывает на ускоренной перемотке.
Главная проблема здесь не скорость человека — а то, что приложение воспринимает каждую мелочь как повод что-то пересчитать.
Чтобы интерфейс работал предсказуемо, нужно научить поток реагировать не на каждое изменение, а на осмысленное завершение ввода.
⏳Зачем нужен debounce()
Оператор debounce() работает как фильтр слишком быстрых изменений:
- быстрые изменения подряд — игнорируются
- устойчивое значение после паузы — двигаются по потоку дальше
Поток перестаёт реагировать на каждую букву и начинает слушать устойчивые состояния строки.
val results = queryFlow
.debounce(300) // значение задержки можно менять
.distinctUntilChanged()
.map { term -> searchData(term) }
.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5000), emptyList())
------------
Помимо полезных символов, пользователь может случайно добавить пробел в конце или другой невидный символ. Фактически это тот же запрос — но без обработки поиск запустится повторно.
В таких случаях можно определиться как оператор distinctUntilChanged() будет сранивать значения:
queryFlow
.debounce(300)
.distinctUntilChanged { old, new ->
old.trim() == new.trim()
}
Теперь оба состояния считаются одинаковыми, и поиск не перезапускается зря.
#kotlin#coroutines#flow#android
🐱Deepr - это open source нативное Android приложение для организации и тестирования deeplink
Стек: Kotlin, Compose, Navigation3, Arch Components, MVVM, SQLDelight, Koin, Coroutines, Fastlane
#opensource#android#deeplink#пример
🚀Вышел AndroidX WebKit 1.16.0. Забирай в работу интеграции
👉 minSdk поднят до 24 (Android 7.0) — учитывайте при апгрейде.
👉 Async-старт WebView вышел из experimental. startUpWebView вместе с ProcessGlobalConfig позволяют прогреть WebView в фоне до того как он понадобится UI. Эту штуку давно ждали в стабильной версии — для меня самое ценное обновление этого релиза.
👉 Navigation API тоже стабильный. Больше не надо @OptIn — addNavigationListener даёт колбэки на разных стадиях навигации, ошибку загрузки через Navigation.webResourceError, URL текущей страницы через Page. Главное — теперь FCP и LCP метрики прилетают напрямую из WebView без инъекции JS:
// Перед использованием проверь
// WebViewFeature.isFeatureSupported(WebViewFeature.NAVIGATION_LISTENER)
WebViewCompat.addNavigationListener(webView, object : NavigationListener {
override fun onFirstContentfulPaintMillis(page: Page, millisFromNavStart: Long) {
analytics.report("FCP", millisFromNavStart, page.url)
}
override fun onLargestContentfulPaintMillis(page: Page, millisFromNavStart: Long) {
analytics.report("LCP", millisFromNavStart, page.url)
}
override fun onNavigationCompleted(navigation: Navigation) {
navigation.webResourceError?.let { err ->
Log.w("WV", "load failed: ${err.errorCode}")
}
}
})
На один WebView можно вешать несколько листенеров и прокидывать свой Executor если нужны колбэки в фоновом потоке.
👉WebViewCompat.saveState теперь умеет ограничивать размер state. Если ловили TransactionTooLarge при сохранении состояния — это для вас.
👉 Подвезли addJavaScriptOnEvent для инъекции JS на загрузку документа и инъекцию скриптов в isolated worlds без конфликтов со страницей. Гибридным приложениям пригодится.
👉 [EXPERIMENTAL] BackForwardCacheSettings полностью переписали. Если использовали старый Builder через WebSettingsCompat.setBackForwardCacheSettings — ловите ошибку компиляции при апгрейде. Теперь так:
val settings = WebSettingsCompat.getBackForwardCacheSettings(webView.settings)
settings.setMaxPagesInCache(5)
👉Profile.setSpeculativeLoadingConfig депрекейтнут, замена через Profile.setMaxPrerenders плюс PrefetchCache.setMaxPrefetches и setPrefetchTtlSeconds (тоже experimental).
#Android#Webview#Web#AndroidDev