Jetpack Compose Semantics 設計でAIエージェントにUIを理解させる

Jetpack Compose Semantics 設計でAIエージェントにUIを理解させる

はじめに

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エージェントを活用するなら、各コンポーネントへの testTagsemantics の標準付与が、安定した自動化の土台になります。