A2UI - прокотол для AI агентов, чтобы описать текстом, что надо показать пользователю (ага, очень похоже на BDUI)
Текстовый ответ AI агента ломается, когда нужна визуализация. Остается полагаться только на то как модель умеет строить UI. Обычно нечитаемая markdown каша, еще нормальным может быть HTML/JS, но для нативной мобилки не очень.
Стнадарт A2UI предлагает делать иначе. AI агент не рисует UI и ничего не исполняет. Шлёт JSON (дерево + данные), клиент рисует своими виджетами. Очень похоже на BDUI, где JSON отправляет сервер.
Протокол открытый под Apache 2.0 за которым стоит Google. Уже совсем скоро будет релиз первой финальной версии.
Клиент заранее объявляет каталоги компонентов, поэтому агент строит UI только из них. Обновления идут сообщениями
#AI #Agents #A2UI
Текстовый ответ AI агента ломается, когда нужна визуализация. Остается полагаться только на то как модель умеет строить UI. Обычно нечитаемая markdown каша, еще нормальным может быть HTML/JS, но для нативной мобилки не очень.
Стнадарт A2UI предлагает делать иначе. AI агент не рисует UI и ничего не исполняет. Шлёт JSON (дерево + данные), клиент рисует своими виджетами. Очень похоже на BDUI, где JSON отправляет сервер.
Протокол открытый под Apache 2.0 за которым стоит Google. Уже совсем скоро будет релиз первой финальной версии.
Клиент заранее объявляет каталоги компонентов, поэтому агент строит UI только из них. Обновления идут сообщениями
createSurface / updateComponents / updateDataModel. Клики и поля уходят обратно, агент патчит дерево.#AI #Agents #A2UI
❤14👍3
Media is too big
VIEW IN TELEGRAM
Лучшая демонстрация A2UI - чат с ИИ агентом в мобильном приложении, где агент дает ответы, а они нативно показываются в UI
#AI
#AI
🔥51
Решение от Google уже включает всё для интеграции с агентом, встроенным в ваше приложение.
Есть поддержка собственных каталогов компонентов и уже готовый на основе Material 3
Надеюсь, что это перенесут на Compose Multiplatform и получится удобно писать UI с агентами на Kotlin + Compose под все платформы!
🔗 Документация A2UI Compose
#Android #Compose #A2UI #AI
Please open Telegram to view this post
VIEW IN TELEGRAM
❤26👍7🔥1
Что нового
👉 Поддержка Java 27
👉 Улучшили отображение ошибок в логах
👉 Прокачали скорость работы на отдельных Windows компах
🛠 Исправление багов
#Gradle
Please open Telegram to view this post
VIEW IN TELEGRAM
👍29🔥2❤1
// Пример теста на JUnit 5
@ExtendWith(BackupRestoreExtension::class)
@BackupRestoreConfig(applicationId = "com.example.app")
class BackupRestoreTest {
@Test
fun prefsSurviveCloudRestore(
controller: BackupRestoreController,
@TempDir outputDir: Path,
) = runBlocking {
controller.runBackupRestoreFlow(
storage = StorageDomain.Preference("user_prefs"),
outputDir = outputDir,
mode = BackupTransportMode.CLOUD_ENCRYPTED,
)
}
}
#Android #AndroidDev #AndroidJetpack #Backup #Тестирование
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥23
Три вещи, ради которых имеет смысл обновиться:
👉 Передача результатов между экранами. Больше не надо городить SharedViewModel или колбэки через хост. Обмен происходит через шину
ResultEventBus. Для сценариев «выбрал и вернулся» это как раз то, чего не хватало.NavDisplay(
backStack = backStack,
onBack = { backStack.removeLastOrNull() },
entryDecorators = listOf(
rememberSaveableStateHolderNavEntryDecorator(),
rememberResultEventBusNavEntryDecorator(),
),
entryProvider = entryProvider {
entry<Home> {
val viewModel = viewModel<HomeViewModel>()
ResultEffect<Address> { address ->
viewModel.onAddressSelected(address)
}
HomeScreen(
address = viewModel.address,
onPickAddress = { backStack.add(AddressPicker) },
)
}
entry<AddressPicker> {
val resultBus = LocalResultEventBus.current
AddressPickerScreen(
onSelected = { address ->
resultBus.sendResult(address)
backStack.removeLastOrNull()
},
)
}
},
)
👉 Поддержка KMP Deep Link API в androidx.navigation3.runtime.deeplink
👉 Упростили работы с Predictive back gesture в Android. Теперь не придется высчитывать дельту самостоятельно
#Compose #JetpackCompose #Navigation3
Please open Telegram to view this post
VIEW IN TELEGRAM
👍38🔥13❤4
👉 Новое экспериментальное Work Metrics API для изучения истории выполнения задач.
@OptIn(ExperimentalWorkMetricsApi::class)
suspend fun dumpSyncMetrics(repo: WorkMetricsInfoRepository) {
val query = WorkMetricsQuery.Builder()
.addWorkerClassNames(SyncWorker::class.java.name)
.addTags("sync")
.setBeginTimeMillis(...)
.build()
repo.getWorkMetricsInfos(query).forEach { info ->
Log.d(
"WM",
"${info.workerClassName} " +
"state=${info.state} " +
"attempts=${info.runAttemptCount} " +
"retries=${info.explicitRetryCount} " +
"worker=${info.workerDurationMillis}ms " +
"total=${info.totalRuntimeMillis}ms " +
"stops=${info.stopReasonCounts}"
)
}
}
👉 Новое экспериментальное API для слежения за событиями разных Work
// ExecutionEventListener — все 4 метода abstract
// cheduleEventListener — default, можно повесить только нужные.
@OptIn(ExperimentalEventsApi::class)
class WorkTelemetry : ExecutionEventListener, ScheduleEventListener {
override fun onStarted(workInfo: WorkInfo) {
Log.d("WM", "start ${workInfo.id} ${workInfo.workerClassName}")
}
override fun onFinished(result: ListenableWorker.Result, workInfo: WorkInfo) {
Log.d("WM", "finish ${workInfo.id} $result attempts=${workInfo.runAttemptCount}")
}
override fun onStopped(stopReason: Int, workInfo: WorkInfo) {
Log.d("WM", "stop ${workInfo.id} reason=$stopReason")
}
override fun onException(throwable: Throwable, workInfo: WorkInfo) {
Log.e("WM", "crash ${workInfo.id}", throwable)
}
override fun onEnqueued(workInfo: WorkInfo) { }
override fun onUnblocked(workInfo: WorkInfo) { }
override fun onUpdated(oldWorkInfo: WorkInfo, updatedWorkInfo: WorkInfo) { }
override fun onCancelled(workInfo: WorkInfo) { }
override fun onPrerequisiteFailed(workInfo: WorkInfo) { }
}
Что еще поменялось
👉 minSdk 23 -> 24 (Android 7.0 теперь минимум)
👉 дефолтный executor теперь
Dispatchers.Default вместо собственного. Все также можно переопределить🛠 Исправление багов и улучшение производительности
#Android #AndroidDev #WorkManager #AndroidJetpack
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤1
#Android #AndroidDev #AndroidDevSummit
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16
Google выкатил ADB Wi-Fi 2.0 в Android 17: новый mDNS-стек вместо Bonjour и старого mDNS, плюс
adbd сам гасит wireless debugging на недоверенной сети и поднимает обратно, когда ты снова дома.Что стало лучше (цифры от Google)
👉 скорость автоконнекта +32%
👉 скорость коннекта увеличилась на 66% на 90% сессий
На практике важнее другое. В Device Manager устройство появляется само, если на телефоне включён Wireless debugging. QR или код, без ручного IP.
Чтобы это работало надо использовать:
👉 Девайс на Android 17 или новее
👉 Android Platform-Tools 37.0.0 или новее
👉 Android Studio Quail 3 или новее
Я пользуюсь отладкой по беспроводу и это удобно, но ВАЖНО иметь хорошую точку доступа (точно 5 или 6 GHz) с высокой скоростью, иначе все ускорения коту под хвост.
🔗 Документация
#Android #AndroidDev #Tooling #AndroidStudio
Please open Telegram to view this post
VIEW IN TELEGRAM
👍31🔥6❤2
Показано как искать проблемы на версиях Android с 12 и выше, а также на Android 11, Android 10 и ниже. Разница вызвана тем, что внутри ОС защиты разные инструменты для анализа.
#Android #AndroidDev #Оптимизация #UI
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥13