はじめに
Jetpack Compose には内部的に Semantics Tree という仕組みがあります。これはアクセシビリティ・UIテスト・自動操作AIなどが参照する「UIの意味構造」です。
Semantics をしっかり設計することで、AIエージェントは画面上の要素を「色・位置・サイズ」ではなく「何のボタンか・押すと何が起きるか・今どんな状態か」として理解できるようになります。
主要な Semantics 属性
contentDescription
アイコンだけのボタンなど、見た目だけでは意味がわからないUI要素に必須です。
IconButton(
onClick = onDelete,
modifier = Modifier.semantics {
contentDescription = "削除"
}
) {
Icon(Icons.Default.Delete, contentDescription = null)
}
AI・アクセシビリティ側には「削除ボタン(クリック可能)」として認識されます。
role
カスタムUIに role を付けると、AI が UI 種別を明確に理解できます。
Modifier.semantics {
role = Role.Button
}
Box(clickable) のみだと「クリック可能な何か」ですが、role を付与すれば Button / Switch / Checkbox / Tab など具体的な種別として伝わります。
stateDescription
現在の状態をAIに伝えるための属性です。
Modifier.semantics {
stateDescription =
if (subscribed) "購読中"
else "未購読"
}
TalkBack だけでなく、AIエージェントが「今は停止中だから再生ボタンを押そう」のような状態ベースの判断を行う際に活用されます。
testTag
AI自動操作・UI テストにおいて最も重要な属性のひとつです。
Modifier.testTag("login_button")
一意の識別子を付与することで、Compose UI Test・Appium・UIAutomator 連携・MCP ベースのエージェントから安定して要素を取得できます。
UIAutomator 連携に必要な設定
Compose は View 階層を直接生成しないため、デフォルトでは UIAutomator から testTag が参照できない場合があります。ルートに以下を設定することで解決します。
Scaffold(
modifier = Modifier.semantics {
testTagsAsResourceId = true
}
)
これにより testTag が resource-id として UIAutomator から参照可能になります。
実践:AIに最も理解されやすい設計
Button(
onClick = login,
modifier = Modifier
.testTag("login_button")
.semantics {
contentDescription = "ログイン"
role = Role.Button
}
) {
Text("ログイン")
}
| 属性 | AI への伝達内容 |
|---|---|
| testTag | 一意識別子 |
| contentDescription | 意味・用途 |
| role | UI 種別 |
| clickable | 実行可能であること |
複雑なUIをひとつの意味にまとめる
アイコン・テキスト・Badge など複数要素で構成されるUIは clearAndSetSemantics でひとつの意味として提示できます。
Modifier.clearAndSetSemantics {
contentDescription = "商品をカートに追加"
role = Role.Button
}
AIは見た目の複雑さやネスト構造を無視し、論理的な意味だけを受け取ることができます。
Semantics 設計で得られる効果
1. 自動操作が UI 変更に強くなる
testTag による識別は、座標・OCR・テキストの変更に依存しません。ボタンの位置や見た目が変わっても、タグが同じなら自動操作は壊れません。
2. MCP で画面意味解析が可能になる
Semantics Tree を取得することで、画面情報を以下のような軽量な構造化データとして扱えます。
[
{"role": "Button", "label": "ログイン", "enabled": true, "tag": "login_button"},
{"role": "TextField", "label": "メールアドレス"}
]
3. スクリーンショット依存を減らしトークンを削減
画像解析は大量のトークンを消費します。Semantics Tree を使えば同じ情報を超軽量なテキストデータとしてAIに渡せます。長時間の自動操作や全画面巡回など、コンテキスト消費を抑えたいシナリオで特に効果的です。
4. AIが状態機械として画面を理解できる
stateDescription の情報から、AIは現在の状態を把握し「今は停止中だから再生ボタンを押す」といった文脈ベースの判断ができます。
5. AIによるテストケース自動生成
Semantics から「ログインボタンが存在する → 押す → ホーム画面が表示される」のような遷移情報を取得し、テストケースの自動生成にも応用できます。
Web の ARIA に相当する役割
Web 開発における HTML / ARIA / DOM に相当するものが、Android における Compose Semantics Tree です。AIエージェントは「見た目のUI」ではなく「意味のDOM」を通じてアプリを理解します。
Compose は「見た目」と「意味」を分離して設計できる点が強みです。これが Semantics 設計の本質であり、AIとの連携基盤になります。
まとめ
| 属性 | 主な用途 |
|---|---|
| testTag | 一意識別・自動操作 |
| contentDescription | 意味の伝達 |
| role | UI 種別の明示 |
| stateDescription | 現在状態の伝達 |
| testTagsAsResourceId | UIAutomator 連携 |
| clearAndSetSemantics | 複雑UIの論理構造化 |
MCP・UIAutomator・AIエージェントを活用するなら、各コンポーネントへの testTag と semantics の標準付与が、安定した自動化の土台になります。