Я научил ИИ агента рендерить Android экран целиком
Мой coding agent уже умел рендерить отдельный XML-layout через Robolectric и получать PNG плюс View Tree с координатами элементов. Потом я принёс ему настоящий экран рабочего приложения — и одного layout перестало хватать.
Реальный экран — это Activity с тулбаром, контейнер Fragment, RecyclerView с данными и состояния вроде loading overlay. Если запустить production Fragment, за ним потянутся DI, навигация и сеть. Мне же нужен был экран, достаточно настоящий для визуальной проверки, но без запуска приложения.
Границу провели так: XML Activity, Fragment, строк списка и drawable — настоящие; код Fragment, DI, навигация и сеть — не запускаются; данные задаются явно в запросе. Renderer надувает Activity, вставляет фрагмент в контейнер, а строки RecyclerView строит из настоящего item-layout по переданным значениям. Анимированный спиннер перед отрисовкой замораживается, чтобы две картинки подряд не отличались.
Отдельный урок — воспроизводимость. PNG и View Tree сохранялись, а параметры вызова нет. Теперь рядом с каждым рендером лежат request.json и replay.json: какой инструмент, с какими аргументами, какой модуль и вариант.
Рабочий экран показать нельзя, поэтому для иллюстраций я сделал открытое демо-приложение. Оно нашло то, чего не нашёл рабочий проект: renderer молча рассчитывал, что JUnit уже есть в тестовых зависимостях, и на чистом проекте падал с «package org.junit does not exist». Теперь JUnit добавляется только если его нет.
Код писал агент. Какую часть реальности сохранить настоящей, а какую заменить детерминированной моделью, решал я.
Как устроен composed render и что ещё нашло демо, разобрал в статье: https://hram.github.io/articles/android-ui-renderer-composed-screens/