Compose Multiplatform 1.12.0:Hot Reload 内置 MCP 服务器,让编码代理亲眼看到自己改的代码跑起来

·阅读约 9 分钟·Evergreen Tools Team
Mobile and desktop UI screens illustrating Compose Multiplatform targets

💡 工具推荐排查代理驱动的 UI 改动?用 Evergreen Tools 的 JSON 格式化工具检查 MCP 消息、Text Diff Checker 对比 UI 状态前后差异,并用 AI 代码审查工具对代理生成的 Kotlin 代码做二次把关。 JSON 格式化工具, 文本差异对比工具, AI 代码审查工具

2026 年 8 月 26 日,JetBrains 发布 Compose Multiplatform 1.12.0。最值得开发者注意的不是又一批 API 微调,而是 Compose Hot Reload 内置的实验性 MCP 服务器:AI 编码代理第一次可以直接连接「正在运行的 Compose 应用」,触发重载、截图、检查语义树、模拟点击与输入、读取日志——自己验证自己改的代码。UI 开发长期是编码代理的短板,因为「改完了」很难自动证明;这个闭环正在把短板变成可以迭代的反馈回路。

1. 为什么代理需要「看见自己改的代码」

后端代码可以靠测试与类型系统验证,UI 却很难:按钮是否对齐、弹窗是否挡住了内容、深色模式下对比度是否够——这些在静态分析里几乎不可见。过去代理只能「生成代码然后祈祷」,人类再花大量时间人工点验。MCP 的意义在于把运行中的应用变成代理可读、可操作的对象,让验证从主观目测变成可编程步骤。随着代理承担更长的 UI 任务,反馈通道的价值只会更大:没有反馈环,十步的 UI 改动几乎不可能一次做对,而每次猜错都要消耗一整轮人工评审。

// Compose Multiplatform 1.12.0 WindowState API v2 lets you pick
// the screen and control placement precisely (experimental).
import androidx.compose.ui.unit.DpSize
import androidx.compose.ui.window.v2.WindowBoundsProvider
import androidx.compose.ui.window.v2.WindowPositionProvider
import androidx.compose.ui.window.v2.WindowSizeProvider
import androidx.compose.ui.window.v2.rememberWindowState

val windowState = rememberWindowState(
    initialBoundsProvider = WindowBoundsProvider(
        positionProvider = WindowPositionProvider.CenteredOnScreen,
        sizeProvider = WindowSizeProvider.Fixed(
            DpSize(width = 400.dp, height = 200.dp)
        )
    )
)

2. Hot Reload MCP 服务器暴露了什么

按 JetBrains 的发布说明,服务器允许代理触发重载、拍摄截图、检查语义树、模拟点击与文本输入、读取应用日志。语义树是关键:它不是像素级猜测,而是组件的结构化视图,代理可以据此断言某个按钮存在、某个标签可访问。截图与日志则覆盖「看起来对不对」与「跑起来有没有报错」两个维度。

Developer testing a running application interface
// Or let a window size to its content, then expand naturally
// with fillMaxSize() when the user enlarges it.
val flexibleState = rememberWindowState(
    initialBoundsProvider = WindowBoundsProvider(
        positionProvider = WindowPositionProvider.CenteredOnScreen,
        sizeProvider = WindowSizeProvider.Unconstrained
    )
)

// In the composable:
//   Modifier.fillMaxSize()  -- expands when window is resized

3. 接线方式与调试技巧

MCP 走标准 JSON-RPC,任何支持 MCP 的编码代理都可以列出并调用 Hot Reload 暴露的工具。调试时可以先用 JSON 格式化工具查看消息内容,确认工具调用与返回结构。值得注意的是这仍是实验性功能:协议与工具名可能在后续版本变化,升级 1.12.x 小版本时留意 release notes 中的兼容性说明。

// The Hot Reload MCP server speaks standard MCP JSON-RPC, so any
// agent can list the tools it exposes. This is the protocol shape.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/list",
  "params": {}
}

// Expected tools on Compose Hot Reload (as announced):
//   reload, screenshot, inspect_semantic_tree,
//   click, input_text, read_logs

4. 1.12.0 的其他亮点

Web 端新增自动字体回退:遇到应用字体不覆盖的字符时,按需下载匹配的 Noto 字体子集并重组文本,日文、阿拉伯文、天城文与 emoji 不再需要开发者手动打包字体。桌面端则推出实验性的 WindowState/DialogState API v2(androidx.compose.ui.window.v2),支持选择屏幕、自定义定位与尺寸逻辑、设置窗口最小/最大尺寸、以及让对话框相对父窗口定位——示例见上方代码块。

Agent tooling dashboard showing MCP server interactions

5. 建立「编辑-重载-观察-迭代」循环

要让代理真正可靠,给它一份可验证的 UI 契约:按钮可见、对齐符合栅格、日志无新异常、语义树暴露无障碍标签。代理每轮修改后触发重载、截图、读日志、查语义树,把结果与契约比对,失败就继续修。契约越具体,代理的自主迭代越不容易跑偏。

// The core pattern: edit, reload, observe, iterate. An agent that
// can screenshot and read logs closes its own feedback loop.
async function agentLoop(agent, mcp) {
  await agent.edit('fix the button alignment in Settings');
  await mcp.call('reload', {});              // trigger Hot Reload
  const shot = await mcp.call('screenshot', {});
  const logs = await mcp.call('read_logs', { since: shot.timestamp });
  const tree = await mcp.call('inspect_semantic_tree', { focus: 'Settings' });
  return verifyAgainst({ shot, logs, tree });
}

6. 现在该做什么

第一,升级到 Compose Multiplatform 1.12.0 并在开发构建中开启 Hot Reload。第二,在支持 MCP 的编码代理里接上 Hot Reload 服务器,先用「改一个按钮对齐」这样的小任务验证闭环。第三,为常用界面写一份 UI 校验清单,作为代理的验证基准。最后,把 MCP 消息与代理生成的 Kotlin 都纳入审查流程——闭环让代理更快,审查让结果可信。

// UI-state contract: give the agent something to verify against.
// Screenshot diffs plus the semantic tree beat vibes.
const UI_CHECKLIST = [
  'button is visible on the Settings screen',
  'alignment matches the 8dp grid',
  'no new exceptions in application logs',
  'semantic tree exposes an accessibility label'
];

function verifyAgainst(evidence) {
  const failures = [];
  if (!evidence.tree.includes('SettingsButton')) failures.push('missing node');
  if (evidence.logs.includes('Exception')) failures.push('log exception');
  return failures.length === 0 ? 'PASS' : failures;
}

📌 常见问题 FAQ

Compose Hot Reload 的 MCP 服务器是什么?

1.12.0 中 Hot Reload 内置的实验性 MCP 服务器,让 AI 编码代理连接正在运行的 Compose 应用,可触发重载、截图、检查语义树、模拟点击与文本输入、读取应用日志,从而自主验证修改结果。

Compose Hot Reload 的 MCP 服务器是什么?

1.12.0 中 Hot Reload 内置的实验性 MCP 服务器,让 AI 编码代理连接正在运行的 Compose 应用,可触发重载、截图、检查语义树、模拟点击与文本输入、读取应用日志,从而自主验证修改结果。

Compose Hot Reload 的 MCP 服务器是什么?

1.12.0 中 Hot Reload 内置的实验性 MCP 服务器,让 AI 编码代理连接正在运行的 Compose 应用,可触发重载、截图、检查语义树、模拟点击与文本输入、读取应用日志,从而自主验证修改结果。

Compose Hot Reload 的 MCP 服务器是什么?

1.12.0 中 Hot Reload 内置的实验性 MCP 服务器,让 AI 编码代理连接正在运行的 Compose 应用,可触发重载、截图、检查语义树、模拟点击与文本输入、读取应用日志,从而自主验证修改结果。

Compose Hot Reload 的 MCP 服务器是什么?

1.12.0 中 Hot Reload 内置的实验性 MCP 服务器,让 AI 编码代理连接正在运行的 Compose 应用,可触发重载、截图、检查语义树、模拟点击与文本输入、读取应用日志,从而自主验证修改结果。

为什么这对 UI 开发重要?

UI 问题很难靠静态分析发现,过去代理无法证明「改好了」。MCP 把运行中的应用变成代理可操作的对象,使验证成为可编程步骤,形成编辑-重载-观察-迭代的闭环。

为什么这对 UI 开发重要?

UI 问题很难靠静态分析发现,过去代理无法证明「改好了」。MCP 把运行中的应用变成代理可操作的对象,使验证成为可编程步骤,形成编辑-重载-观察-迭代的闭环。

为什么这对 UI 开发重要?

UI 问题很难靠静态分析发现,过去代理无法证明「改好了」。MCP 把运行中的应用变成代理可操作的对象,使验证成为可编程步骤,形成编辑-重载-观察-迭代的闭环。

为什么这对 UI 开发重要?

UI 问题很难靠静态分析发现,过去代理无法证明「改好了」。MCP 把运行中的应用变成代理可操作的对象,使验证成为可编程步骤,形成编辑-重载-观察-迭代的闭环。

为什么这对 UI 开发重要?

UI 问题很难靠静态分析发现,过去代理无法证明「改好了」。MCP 把运行中的应用变成代理可操作的对象,使验证成为可编程步骤,形成编辑-重载-观察-迭代的闭环。

1.12.0 的字体回退如何工作?

Web 端渲染遇到应用字体不覆盖的字符时,会按需下载匹配的 Noto 字体子集并重组文本,日文、阿拉伯文、天城文与 emoji 无需手动打包字体即可正确显示。

1.12.0 的字体回退如何工作?

Web 端渲染遇到应用字体不覆盖的字符时,会按需下载匹配的 Noto 字体子集并重组文本,日文、阿拉伯文、天城文与 emoji 无需手动打包字体即可正确显示。

1.12.0 的字体回退如何工作?

Web 端渲染遇到应用字体不覆盖的字符时,会按需下载匹配的 Noto 字体子集并重组文本,日文、阿拉伯文、天城文与 emoji 无需手动打包字体即可正确显示。

1.12.0 的字体回退如何工作?

Web 端渲染遇到应用字体不覆盖的字符时,会按需下载匹配的 Noto 字体子集并重组文本,日文、阿拉伯文、天城文与 emoji 无需手动打包字体即可正确显示。

1.12.0 的字体回退如何工作?

Web 端渲染遇到应用字体不覆盖的字符时,会按需下载匹配的 Noto 字体子集并重组文本,日文、阿拉伯文、天城文与 emoji 无需手动打包字体即可正确显示。

WindowState API v2 有什么用?

实验性的 v2 API(androidx.compose.ui.window.v2)提供更精细的窗口与对话框控制:选择显示屏幕、自定义定位与尺寸逻辑、设置最小/最大尺寸、对话框相对父窗口定位。

WindowState API v2 有什么用?

实验性的 v2 API(androidx.compose.ui.window.v2)提供更精细的窗口与对话框控制:选择显示屏幕、自定义定位与尺寸逻辑、设置最小/最大尺寸、对话框相对父窗口定位。

WindowState API v2 有什么用?

实验性的 v2 API(androidx.compose.ui.window.v2)提供更精细的窗口与对话框控制:选择显示屏幕、自定义定位与尺寸逻辑、设置最小/最大尺寸、对话框相对父窗口定位。

WindowState API v2 有什么用?

实验性的 v2 API(androidx.compose.ui.window.v2)提供更精细的窗口与对话框控制:选择显示屏幕、自定义定位与尺寸逻辑、设置最小/最大尺寸、对话框相对父窗口定位。

WindowState API v2 有什么用?

实验性的 v2 API(androidx.compose.ui.window.v2)提供更精细的窗口与对话框控制:选择显示屏幕、自定义定位与尺寸逻辑、设置最小/最大尺寸、对话框相对父窗口定位。

MCP 服务器可以用于生产环境吗?

目前是实验性功能,官方定位在开发与调试场景。协议与工具名可能在后续版本变化,生产构建不建议依赖,升级小版本时请留意 release notes。

MCP 服务器可以用于生产环境吗?

目前是实验性功能,官方定位在开发与调试场景。协议与工具名可能在后续版本变化,生产构建不建议依赖,升级小版本时请留意 release notes。

MCP 服务器可以用于生产环境吗?

目前是实验性功能,官方定位在开发与调试场景。协议与工具名可能在后续版本变化,生产构建不建议依赖,升级小版本时请留意 release notes。

MCP 服务器可以用于生产环境吗?

目前是实验性功能,官方定位在开发与调试场景。协议与工具名可能在后续版本变化,生产构建不建议依赖,升级小版本时请留意 release notes。

MCP 服务器可以用于生产环境吗?

目前是实验性功能,官方定位在开发与调试场景。协议与工具名可能在后续版本变化,生产构建不建议依赖,升级小版本时请留意 release notes。