Я дал coding agent глаза для Android UI
Coding agent уверенно правил Android XML: находил layout, понимал constraints, выдавал diff. Но после правки оставалась ручная точка: я открывал экран и решал, правда ли кнопка или карточка встали на своё место.
Эту точку я решил убрать. Рендер вынес в локальный MCP на Kotlin/JVM с Robolectric: агент передаёт layout, в ответ получает результат рендера. Сначала это был обычный screenshot, и проект казался почти готовым.
Потом выяснилось, что картинка настоящая, а «View tree» рядом возвращает искусственный корневой узел. У такого дерева нельзя спросить о реальной дочерней View, поэтому inspect_view почти ничем не помогал. А вопросы, от которых зависит UI-правка, — какое расстояние между двумя View, вышел ли элемент за границу экрана, где нужный id — по PNG на глаз не решаются.
Поворот был простым: PNG и данные должны рождаться из одного и того же разложенного layout. Теперь renderer сохраняет и картинку, и настоящее дерево: id, тип, текст, состояние, padding, margins и абсолютные bounds. Цикл получился такой: change → render → inspect → evidence → fix
Coding agent реализовывал renderer и заметил риск: нельзя один раз поднять Robolectric runtime и пользоваться им после правок XML или Kotlin, иначе он будет смотреть на устаревшие ресурсы. Границы задачи и то, что PNG не считается достаточным доказательством, определял я.
Проверил на реальном layout карточки товара в рабочем Android-проекте. Это не замена эмулятору: совпадения с железом до пикселя я не обещаю, Compose не поддерживается, а действия агента по сохранённым данным пока нельзя воспроизвести полностью.
Один screenshot делает интерфейс видимым. PNG вместе с View tree делает его проверяемым.
Как дошёл до этого цикла и где первая версия оказалась неполной, разобрал в статье: https://hram.github.io/articles/android-ui-renderer-mcp/