Этой ночью выходит Atomic Heart — игра от русских разработчиков студии Mundfish с претензией на высокобюджетный ААА-проект. Первые превью появились, кажется, лет 6 назад, и тогда многих привлёк оригинальный визуальный стиль: Atomic Heart это шутер в эстетике Советского Союза из недалёкого будущего. С одной стороны, есть роботы, ИИ, и люди со сверхспособностями. С другой стороны привычные геометрически минималистичные формы из крашеного железа и глянцевого пластика, которые легко увидеть на каком-нибудь старом складе, заполненном советским оборудованием.
Развитие проекта переживало несколько кризисов. Вообще, любой проект таких масштабов обречён не успевать в сроки: это не умеют делать даже супер опытные крупнейшие западные студии с миллиардными бюджетами. Неудивительно, что Atomic Heart от новичков из России не только побывала в производственном аду с переработками и скандальными увольнениями, но в какой-то период про неё всерьёз ходили слухи, будто бы никакой игры нет и не было никогда, а все материалы это обман.
Стоит ли говорить, что год релиза тоже оказался наиболее неудачным. Успей студия доделать всё в 2021, может, Россия побывала бы в топ-листах ААА-игр. Сейчас же разработчикам пришлось воспользоваться фактом своей регистрации на Кипре и разделить потоки продажи в России и на Западе, сталкиваясь с хейтом с той и другой стороны.
Со стороны Запада начались попытки канселинга за то, что у Mundfish русские корни, и за то, что они не высказали открытой антироссийской позиции. Я уже неоднократно писал, что, например, компания JetBrains, имея русских основателей и больше половины русского штата, заняла публично антироссийскую позицию сразу же, максимально сохраняя свои продажи на Западе. Хотя некоторое количество хейта от украинцев в сторону JetBrains всё равно есть: дескать, полностью ушли из России слишком поздно, закрывали процессы и перевозили людей, а нужно было сразу.
Mundfish не делали политических заявлений вообще. Написали общие вещи, что они против войны, но не стали писать, что они против России и отказываются продавать здесь свою игру. Из-за этого, например, не так сложно встретить англоязычные статьи с призывом саботировать проект полностью.
Впрочем, в России авторы тоже огребли: дело в том, что цифровым издателем выступила VK со своей малоизвестной площадкой для игр VKPlay. Продажи через любимый геймерами Steam были заблокированы не только в России, но и в Казахстане, Армении и других смежных регионах. И, если россиянин, нелегально использующий Steam из-под казахского аккаунта, вряд ли имеет право предъявлять претензии, то вот вполне настоящие жители того же Казахстана по непонятной причине столкнулись с блокировкой, хотя на их страну никто никаких санкций не накладывал. Плюс — чего уж говорить — публичная репутация у VK, мягко говоря, не слишком высокая: десятки комментариев о том, что игру не станут покупать просто чтобы не связываться с каким-либо продуктом от VK.
Не знаю, будет ли Atomic Heart хорошей игрой. На общемировом уровне, мне кажется, будет средненькой. По видеороликам кажется, что импакта от выстрелов нет, а в шутере это почти что самое главное. Способности персонажа тоже выглядят довольно бесполезными. Тем не менее, я купил максимальную версию, чтобы поддержать авторов, которые прошли через и без того сложный процесс разработки, а в конце ещё и столкнулись с неадекватной агрессией, и при этом проявили себя сдержано и достойно. Но на игру, конечно же, тоже посмотрим.
#games
🤖Credential Manager теперь умеет отдавать верифицированный email без OTP
Google начала выпускать криптографически верифицированные email credentials прямо на Android-устройства. Получить их можно через Credential Manager API, который реализует стандарт W3C Digital Credentials API.
Механика простая: пользователь тапает "Sign up" или фокусируется на поле ввода email, появляется нативный bottom sheet с описанием запрашиваемых данных, один тап на "Agree and continue" - и приложение получает верифицированный адрес мгновенно. Никакого перехода в почту, никаких кодов.
Три сценария, где это применимо:
👉 Регистрация - вместе с получением email сразу инициировать создание passkey
👉 Восстановление аккаунта - больше не нужно искать письмо с recovery кодом в спаме
👉 Step-up аутентификация - для подтверждения чувствительных действий без OTP
‼️ВАЖНО: верифицируется только email. Имя, фамилия, фото профиля доступны, но не верифицированы. Поддерживаются только личные аккаунты.
#Android#AndroidDev
🤖Google выпустила Android CLI — новую командную строку для Android-разработки, которая умеет работать не только с человеком, но и с AI-агентами: Gemini CLI, Claude Code, Codex, Antigravity и любыми другими.
По замерам Google, в агентных сценариях CLI тратит на 70% меньше токенов на setup проекта и окружения и выполняет типовые задачи в 3 раза быстрее, чем когда агент разбирается через стандартные инструменты. Цифры от вендора, но механика понятная: один вызов android create вместо длинной цепочки команд.
Основные команды:
👉android sdk install — ставит только нужные компоненты SDK
👉android create — создание проекта из официальных шаблонов с актуальной архитектурой
👉android emulator и android run — работа с виртуальными девайсами и запуск приложения
👉android skills — подключение SKILL.md инструкций для агента: Navigation 3, edge-to-edge, миграция AGP 9, XML в Compose, анализ R8
👉android docs — доступ к актуальной документации Android, Firebase и Kotlin в обход устаревшего training cutoff модели
👉android update — обновление самого CLI
Установка
curl -fsSL https://dl.google.com/android/cli/latest/darwin_arm64/install.sh | bash
CLI пригодится не только с агентами: Google прямо позиционирует его для CI и скриптовой автоматизации.
Похоже, Google серьёзно перестраивает базовый тулинг под реальность, где рядом с разработчиком всегда есть агент. Пошёл пробовать в своих проектах.
🔗Анонс Android Developers Blog
#Android#AndroidDev
🤖 Google объявила о полноценной поддержке внешних дисплеев в Android (также нужна поддержка со стороны устройства)
Я попробовал подключить Pixel 9 Pro к внешнему 4K монитору по Type-C. Итог - зернистость такая, что пользоваться невозможно. В настройках выбрать выше FullHD не дает (возможно, ограничение моего устройства). Приложения можно растягивать как угодно, что порой приводит к проблемам их отображения и они не перестраиваются полностью. Начало хорошее, но очень много работы с разработчиками по адаптации под больши экраны и ресайз на лету.
Google дала множества библиотек и руководств по адаптации под большие экраны, а также как работать с несколькими дисплеями.
🔗 Источник - Android Developers Blog
#Android#AndroidDev
🤖Почему разработчик не контролирует, как выглядят уведомления в системной панели
Когда разработчик использует NotificationCompat.Builder для создания уведомлений из Android приложения, может показаться, что прямого контроля на внешний вид нету 🤯 На самом деле формируется не визуальный компонент, а объект данных, который описывает что есть в уведомление.
Этот объект — это просто структура, сериализуемая через Parcelable. Он передаётся в системный процесс через Binder — механизм межпроцессного взаимодействия в Android. А вот принимать и интерпретировать этот объект будет специальное системное приложение — SystemUI.
Уведомления отображаются не Android сам по себе, а конкретное приложение, которое называется com.android.systemui. И это приложение полностью отвечает за то, как будет выглядеть уведомление. Оно решает, какие поля отобразить, где их разместить, какой стиль применить, как будет выглядеть кнопка, будут ли видны иконки — и многое другое. Часть из данных может игнорироваться.
Вот почему одно и то же уведомление может выглядеть совершенно по-разному на разных устройствах и версиях ОС. Один и тот же вызов setContentTitle("Новость") может дать совершенно разный результат на Pixel с чистым Android и на Xiaomi с MIUI. Более того, даже RemoteViews, которые позволяют задавать кастомные layout’ы для уведомлений, могут игнорироваться или ограничиваться прошивками производителей.
Именно по этой причине я не люблю когда в уведомления вставляют Custom View, который выбивается из стиля и часто портит визуал системы и поведение. Мечтаю чтобы его поскорее запретили в Android. Пожалуйста, хотя бы в Android 17 🙏
Запомните ‼️ Уведомление в Android — это не UI объект, это контракт между приложением и SystemUI, который интерпретируется, а не исполняется дословно. Поэтому пишите уведомления так, чтобы они были понятны системе, а красоту UI вы можете контролировать только внутри вашего приложения.
#android#androiddev
Пример App Widget из Tier 1
👉 Персонализированы (работают с Material You)
👉 Используют всё доступное место
👉 Следуют лучшим практикам размещения компонентов
👉 Полезные для пользователя
#android#androiddev
📱В Android Emulator добавили нативную коммуникацию между эмуляторами
Раньше чтобы два эмулятора увидели друг друга по сети, надо было руками прописывать port forwarding. Каждый эмулятор жил в своей изолированной виртуальной песоцнице. Теперь новый сетевой стек поднимает общий виртуальную сеть для всех запущенных инстансов на одной машине — до 4 эмуляторов одновременно. Wi-Fi Direct и Network Service Discovery (NSD) работают из коробки, ничего настраивать не нужно.
Это вписывается в то, что Google активно делает последние пару лет: передача звонков между устройствами, кросс-девайсные сессии, Wear OS, Android Auto, XR-очки. Весь этот функционал раньше можно было нормально проверить только на реальных девайсах. Теперь это можно делать прямо в эмуляторе.
Для использования надо Andorid Emulator версии 36.5 или новее
🔗 Источник - android-developers.googleblog.com
#AndroidDev#AndroidStudio
🚀 Вышел Jetpack Paging 3.5.0 где добавили возможность получения данных как StateFlow
// В ViewModel
val pager = Pager(pagingConfig, pagingSourceFactory)
val pagerFlow: Flow<ItemSnapshotList> = pager.flow.asState()
// Пример в Compose
val snapshotFlow = viewModel.pagerFlow.collectAsStateWithLifecycle(initialList)
val snapshot = itemsFlow.value
LazyColumn {
items(items = snapshot.items) { ... }
}
Также появилась возможность явно вызвать загрузку новых страниц через методы append() и prepend(), а также refresh() и retry()
LazyColumn {
item {
LaunchedEffect(viewModel) { viewModel.prepend() }
}
items(snapshot.items) { item -> Text("Item: $item") }
item {
LaunchedEffect(viewModel) { viewModel.append() }
}
}
Кажется, что сделали жизнь проще, но мой опыт с Paging всегда упирался в проблемы кэширования и удобной работы в Data слое. Всегда считал эту библиотеку архитектурно неудачной и ждал когда же ее переделают полностью.
#Android#Jetpack#AndroidDev
🚀Jetpack Ink 1.0 стабильна! Библиотека для работы с рукописным вводом и графикой
Google выпустил стабильную версию Jetpack Ink 1.0 — библиотеку для создания продвинутых функций рукописного ввода (inking) и рисования в Android-приложениях.
Это многомодульная библиотека, которая обрабатывает цифровые штрихи (strokes) от ввода (стилус или палец) до их показа. Она предоставляет все необходимые инструменты для создания реалистичного и отзывчивого опыта письма или рисования.
👨💻 Кому будет полезна?
👉 Разработчикам приложений для заметок, скетчей, цифровых подписей.
👉 Образовательным приложениям, требующим аннотирования документов или изображений.
👉 Любому продукту, где нужен реалистичный, выразительный пользовательский ввод поверх контента.
Библиотека берет на себя сложности обработки графики, физики мазков и обработки жестов, позволяя легко добавить профессиональные функции рисования.
#Jetpack#AndroidDev#Android
🤖 Отлаживайте фоновые задачи в Android Studio как профи: Background Task Inspector для WokrManager
Работаете с WorkManager? Тогда вам точно пригодится встроенный в Android Studio инструмент — Background Task Inspector. Это ваш главный помощник для визуального мониторинга и отладки фоновых задач.
Что вы видите в инспекторе:
- Все WorkManager задачи в одном месте
- Текущие статусы: Running, Enqueued, Failed, Succeeded
- Детальную информацию о каждом воркере
Особенно мощно инструмент работает с цепочками задач:
// Например, у вас есть такая цепочка:
val workA = OneTimeWorkRequestBuilder<CleanupWorker>().build()
val workB = OneTimeWorkRequestBuilder<WaterColorFilterWorker>().build()
val workC = OneTimeWorkRequestBuilder<BlurEffectFilterColor>().build()
workManager
.beginWith(workA)
.then(workB)
.then(workC)
.enqueue()
Визуализация графа выполнения покажет:
- Какая задача завершилась успешно (Succeeded)
- Какая упала (Failed) и почему
- Как это повлияло на последующие задачи
Типичный сценарий отладки:
Видите статус «Enqueued»? Значит задача в очереди, но не запускается. Возможные причины:
- Ограничения не выполняются (нет сети, не заряжается устройство)
- Предыдущая задача в цепочке не завершилась
- Достигнут лимит параллельных задач
Преимущества использования:
- Экономия времени на логирование и отладку
- Наглядное представление сложных цепочек задач
- Быстрая диагностика проблем с выполнением фоновых операций
Инструмент уже ждет вас в Android Studio → View → Tool Windows → App Inspection → Background Task Inspector.
#AndroidStudio#Android#AndroidDev
🤖Android 16 QPR2 вышел — первый минорный релиз SDK с новыми API!
Google выпустил Android 16 QPR2 — первое минорное обновление платформы, которое приносит новые функции без ломающих изменений.
🔧Новый подход к версиям SDK
Теперь можно проверять минорные обновления через новые поля в Build:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.BAKLAVA &&
Build.VERSION.SDK_INT_FULL >= Build.VERSION_CODES_FULL.BAKLAVA_1) {
// API из QPR2
}
Ключевые изменения:
👉Расширенная темная тема — система автоматически инвертирует интерфейс для доступности
👉Пользовательские формы иконок — пользователи могут менять форму всех иконок
👉Интерактивный шеринг — обновление контента в реальном времени в превью шаринга
👉Новый сборщик мусора — снижает нагрузку на CPU
Каждую фичу разберем подробнее в следующих постах! Подписывайте на @android_broadcast, чтобы не пропустить
#Android16#AndroidDev#Android
🤖 Пример работы расширенной темной темы с Compose приложением. Тут придется темную делать сам, так как настройка не повлияла
#android16#android#androiddev