Fazendo agentes de IA entenderem a tela: Guia prático de design de Semantics no Jetpack Compose
Introdução
Para fazer agentes de IA e ferramentas de automação de testes no Jetpack Compose entenderem com precisão "o que este botão faz", o design adequado de Semantics é fundamental.
O Compose tem internamente uma "Semantics Tree" que funciona como estrutura semântica referenciada por acessibilidade, testes de UI e IA de operação automática (como Appium/UIAutomator/MCP). É o equivalente ao ARIA e DOM na web.
Atributos principais do Semantics
contentDescription
O atributo mais básico para dar significado a botões que têm apenas ícones.
IconButton(
onClick = onDelete,
modifier = Modifier.semantics {
contentDescription = "Excluir"
}
) {
Icon(Icons.Default.Delete, contentDescription = null)
}
A IA e a acessibilidade o reconhecem como "botão Excluir · clicável · papel Button".
role
Especifica o tipo de UI para componentes personalizados. Um simples Box(clickable) seria "algo clicável", mas adicionando role o significado fica claro: Button, Switch, Checkbox, Tab, etc.
Modifier.semantics {
role = Role.Button
}
stateDescription
Informa à IA o estado atual da UI.
Modifier.semantics {
stateDescription =
if (subscribed) "Inscrito"
else "Não inscrito"
}
testTag
O identificador mais importante para MCP, Appium e agentes automáticos de UI. Permite identificação estável que não depende de coordenadas, OCR ou mudanças de texto.
Modifier.testTag("login_button")
Configuração para integração com UIAutomator
O Compose não cria diretamente uma hierarquia de Views, então o UIAutomator pode não ver o testTag. Isso é resolvido adicionando o seguinte à raiz:
Scaffold(
modifier = Modifier.semantics {
testTagsAsResourceId = true
}
)
O testTag será reconhecido como resource-id e poderá ser obtido diretamente pelo UIAutomator.
O padrão de implementação mais compreensível para IA
A melhor prática é combinar múltiplos atributos.
Button(
onClick = login,
modifier = Modifier
.testTag("login_button")
.semantics {
contentDescription = "Entrar"
role = Role.Button
}
) {
Text("Entrar")
}
| Atributo | Compreensão da IA |
|---|---|
| testTag | Identificação única |
| contentDescription | Compreensão do significado |
| role | Compreensão do tipo de UI |
| clickable | Compreensão de executabilidade |
Unificar uma UI complexa em um único significado
Para apresentar à IA uma composição complexa de ícones, texto e Badge como um único botão, usa-se clearAndSetSemantics.
Modifier.clearAndSetSemantics {
contentDescription = "Adicionar produto ao carrinho"
role = Role.Button
}
A estrutura aninhada interna e os grupos de ícones podem ser ignorados, passando apenas o significado para a IA.
O que se pode alcançar com o design de Semantics
Estabilização da automação
Com testTag, é possível operar de forma estável sem coordenadas ou OCR. Mesmo após redesenhar a UI, a automação não quebra enquanto o testTag for o mesmo. O suporte a múltiplos idiomas também se torna mais robusto.
Redução da quantidade de tokens
Quando se depende apenas de screenshots, a análise de imagens requer muitos tokens, mas com Semantics Tree pode ser tratado como dados estruturados leves.
[
{"type": "Button", "label": "Entrar"},
{"type": "TextField", "label": "E-mail"},
{"type": "TextField", "label": "Senha"}
]
Especialmente eficaz em operações automáticas prolongadas e análise de telas em grande escala, contribuindo também para prevenir context overflow.
Compreensão do estado pela IA
Graças ao stateDescription, a IA pode estimar o estado atual da tela e tomar decisões como "agora está pausado, então vou pressionar o botão de reproduzir". Permite entender a tela como uma máquina de estados.
Análise estruturada na integração MCP
Obtendo o Semantics Tree através do MCP Server e passando-o ao LLM Agent, é possível a compreensão do significado de toda a tela, estimativa de candidatos para a próxima operação e análise de transições de estado.
Compose UI → Semantics Tree → MCP Server → LLM Agent
Resumo do uso de atributos Semantics
| Atributo | Uso |
|---|---|
| testTag | Identificação única |
| contentDescription | Significado |
| role | Tipo de UI |
| stateDescription | Estado |
| collectionInfo | Estrutura de lista |
| traversalIndex | Ordem de navegação |
| customActions | Operações personalizadas para IA |
Conclusão
O Compose permite separar "aparência" de "significado". A essência do design de Semantics está na capacidade de projetar de forma independente a UI para humanos e a estrutura semântica para IA.
Se você vai utilizar agentes de IA, MCP, UIAutomator e testes automáticos E2E, a seguinte padronização para cada componente oferece alto retorno sobre investimento:
Modifier
.testTag(...)
.semantics {
contentDescription = ...
role = ...
}
Transmitir "o que é este botão · o que acontece ao pressioná-lo · qual é seu estado agora" através do Semantics em vez de cor, posição e tamanho — esta é a essência do design de UI preparado para IA.