讓AI智能體理解螢幕:Jetpack Compose Semantics設計實踐指南

讓AI智能體理解螢幕:Jetpack Compose Semantics設計實踐指南

讓AI智能體理解螢幕:Jetpack Compose Semantics設計實踐指南

前言

要讓Jetpack Compose中的AI智能體和測試自動化工具精準理解「這個按鈕是做什麼的」,Semantics的合理設計是關鍵。

Compose內部擁有「Semantics Tree」,作為無障礙存取、UI測試和自動操作AI(Appium/UIAutomator/MCP等)參考的語義結構發揮作用。這相當於Web中的ARIA和DOM。

Semantics的主要屬性

contentDescription

為僅有圖示的按鈕賦予意義的最基本屬性。

IconButton(
    onClick = onDelete,
    modifier = Modifier.semantics {
        contentDescription = "刪除"
    }
) {
    Icon(Icons.Default.Delete, contentDescription = null)
}

AI和無障礙端將其識別為「刪除按鈕·可點擊·Button角色」。

role

向自訂UI明確指定UI類型。普通的Box(clickable)只是「可點擊的某物」,但添加role後Button、Switch、Checkbox、Tab等含義便清晰了。

Modifier.semantics {
    role = Role.Button
}

stateDescription

向AI傳達UI的當前狀態。

Modifier.semantics {
    stateDescription =
        if (subscribed) "已訂閱"
        else "未訂閱"
}

testTag

MCP、Appium和自動UI智能體中最重要的識別碼。能實現不依賴座標、OCR或文字變化的穩定識別。

Modifier.testTag("login_button")

與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等複雜構成作為一個按鈕展示給AI時,使用clearAndSetSemantics

Modifier.clearAndSetSemantics {
    contentDescription = "將商品加入購物車"
    role = Role.Button
}

可忽略內部巢狀結構和圖示群組,只將含義傳遞給AI。

Semantics設計能實現的功能

自動化操作的穩定化

有了testTag,無需座標或OCR即可實現穩定操作。UI重新設計後,只要testTag保持不變,自動化就不會中斷。多語言支援也會更加健壯。

降低Token使用量

僅依賴螢幕截圖時,圖像分析需要大量Token,但使用Semantics Tree可作為輕量結構化資料處理。

[
  {"type": "Button", "label": "登入"},
  {"type": "TextField", "label": "電子郵件"},
  {"type": "TextField", "label": "密碼"}
]

在長時間自動操作和大規模螢幕分析中尤為有效,還有助於抑制context overflow。

AI的狀態理解

透過stateDescription,AI能推斷螢幕當前狀態,從而做出「現在是暫停狀態,所以按播放按鈕」等判斷。可以讓AI將螢幕理解為狀態機。

MCP整合中的結構化分析

透過MCP Server取得Semantics Tree並傳遞給LLM Agent,可實現整個螢幕的語義理解、推斷下一步操作候選以及狀態轉換分析。

Compose UI → Semantics Tree → MCP Server → LLM Agent

Semantics屬性使用彙總

屬性 用途
testTag 唯一識別
contentDescription 含義
role UI類型
stateDescription 狀態
collectionInfo 清單結構
traversalIndex 導覽順序
customActions AI專用自訂操作

總結

Compose能將「外觀」與「含義」分離。Semantics設計的本質在於能夠獨立設計面向人類的UI與面向AI的語義結構

如果要活用AI智能體、MCP、UIAutomator、自動E2E測試,對各元件進行以下標準化將帶來高投入產出比:

Modifier
    .testTag(...)
    .semantics {
        contentDescription = ...
        role = ...
    }

用Semantics傳達「這是什麼按鈕·按下去會發生什麼·現在是什麼狀態」,而不是顏色、位置、大小——這就是對AI友好的UI設計的核心。