# MiniAPP Javet Node Runtime 技术方案 > 目标:把 MobileClaw MiniAPP 从“单 HTML 页面”升级为“可源码编辑、可编译、可导入导出、可运行 Vue/TS 等现代前端框架”的项目级应用,并在 Android 内通过 Javet 运行受控 Node 构建器。 本文档记录当前确定的技术路线、ChatAI 需要新增的方法、AI 创建/修改 MiniAPP 的执行流程、Node/Javet 版本方案、MiniAPP 包格式、导入导出策略和原生桥约束。 ## 1. 背景 当前 MiniAPP 的底层模型仍是单文件 HTML: - `MiniApp` 元数据中保存 `htmlPath`。 - `AppManagerSkill` 的 `create/update` 主要接收完整 `html` 字符串。 - `MiniAppStore` 将内容保存为 `{id}.html` 和 `{id}.json`。 - WebView 使用 `loadDataWithBaseURL(file://...)` 注入 HTML 字符串运行。 - Claw 原生桥通过向 HTML 中插入 ` ``` 原因: - Vue/Vite 的 module script 可能很早执行。 - `onPageFinished` 后补注入可能晚于业务代码。 - 固定 runtime 文件更容易版本化和调试。 ### 8.4 TypeScript SDK 每个项目包含: ```text src/mobileclaw.ts ``` 只暴露类型安全 SDK: ```ts export const Claw = { fetch, sql, python, files, ai, log, toast, device, clipboard, close, setTitle, } ``` 业务代码禁止直接访问: ```ts window.Android ``` ### 8.5 Capabilities 权限 `miniapp.json` 声明权限: ```json { "capabilities": ["network", "files", "sqlite", "python", "ai"] } ``` 原生桥按权限判断是否允许调用: | capability | 允许能力 | | --- | --- | | `network` | `Claw.fetch` | | `files` | `Claw.files` | | `sqlite` | `Claw.sql` | | `python` | `Claw.python` | | `shell` | `Claw.shell` | | `ai` | `Claw.ai.chat` | | `clipboard` | `Claw.clipboard` | | `native_intent` | `openUrl`, `shareText`, `launchApp` | 默认不开放 `shell`。 ## 9. 验证体系 ### 9.1 构建验证 `miniapp_project.build` 至少检查: - Node/Javet 可用。 - builder 版本匹配。 - `vite.config.ts` 可解析。 - `src/main.ts` 存在。 - TypeScript/Vue 编译通过。 - `dist/index.html` 生成。 - `dist/assets/*` 资源存在。 ### 9.2 静态验证 `miniapp_project.validate` 静态检查: - 禁止 `window.Android`。 - 禁止原生 `fetch(` 和 `XMLHttpRequest`,除非 bridge polyfill 内部。 - 禁止外部 CDN,除非 manifest 允许。 - 检查 `Claw` 调用是否 `await`。 - 检查 `dist/index.html` 是否加载 `/_claw/bridge.js`。 ### 9.3 运行验证 隐藏 WebView 加载: ```text https://appassets.androidplatform.net/miniapps/{id}/dist/index.html ``` 探针检查: - `window.Claw` 是否存在。 - body 是否可见。 - 页面尺寸是否合理。 - DOM 是否挂载。 - 控件或视觉内容是否存在。 - console error / unhandled rejection。 - runtime logs 是否有 error。 ## 10. 实施阶段 ### 阶段 1:Javet 可行性验证 目标:确认 Android 内 Node 可运行。 任务: - 添加 `javet-node-android` 依赖。 - 新增 `NodeRuntimeManager`。 - 实现 `node_runtime.status`。 - 实现 `node_runtime.prepare`。 - 跑 hello-world Node script。 - 输出 Node 版本、ABI、运行日志。 完成标准: - 真机可返回 Node 版本。 - 多次调用不崩溃。 - 出错时能返回结构化错误。 ### 阶段 2:受控 Vite Builder 目标:在 Android 内将一个固定 Vue/TS 模板编译成 `dist/`。 任务: - 准备 `node_builder` 资产。 - 新增 `build-miniapp.mjs`。 - 新增 `MiniAppBuildService`。 - 构建 `vue3-vite-ts` 示例项目。 - 解析 Vite/TS 错误为结构化 JSON。 完成标准: - `src/App.vue` 可编译成 `dist/index.html`。 - 编译失败能定位文件行号。 ### 阶段 3:MiniAPP v2 存储 目标:让 MiniAPP 支持项目目录。 任务: - 扩展或新增 `MiniAppProjectStore`。 - 支持 `filesDir/apps/{id}/`。 - 保留 v1 `{id}.html` 兼容。 - 支持源码文件读写、搜索、patch。 - 支持 build logs。 完成标准: - 旧 MiniAPP 不受影响。 - 新 MiniAPP 可保存多文件项目。 ### 阶段 4:ChatAI 工具升级 目标:AI 能按项目流程创建和修改 MiniAPP。 任务: - 升级 `AppManagerSkill`。 - 增加项目级 actions。 - 更新 `get_guide`。 - 更新 AgentRuntime 对 validate/build 错误的自动修复提示。 完成标准: - AI 创建项目时会 build/validate/open。 - AI 修改项目时会 search/read/patch/build/validate。 ### 阶段 5:WebView v2 Runtime 目标:运行 `dist/` 多文件应用。 任务: - 接入 `WebViewAssetLoader`。 - 加载 v2 `dist/index.html`。 - 提供 `/_claw/bridge.js`。 - 根据 capabilities 限制桥能力。 - 关闭不必要 file 权限。 完成标准: - Vue/Vite 产物可在 WebView 正常运行。 - Bridge 在业务代码前可用。 - v1 仍可打开。 ### 阶段 6:导入导出 目标:完整迁移 MiniAPP 项目。 任务: - 导出 v2 包:manifest、miniapp、src、dist、backend、data。 - 导入 v2 包。 - 导入无 dist 的源码包时触发 build。 - 支持 v1 包导入。 - 支持冲突策略。 完成标准: - 导出的 v2 包在另一台设备导入后可直接运行。 - 缺 dist 时可在设备上重建。 ## 11. 风险与处理 | 风险 | 处理 | | --- | --- | | Javet 包体积增加 | 只保留 `arm64-v8a` 和 `x86_64`;后续按渠道拆分 | | Node/Vite 内存占用高 | 单构建队列,限制并发,设置超时 | | npm 生态 Android 兼容问题 | 不跑任意 npm;预置 builder;必要时走依赖白名单 | | esbuild/Rollup ABI 不匹配 | `node_runtime.diagnose` 检查;builder 包按 ABI 准备 | | AI 乱改 dist | 工具层禁止 patch `dist/`,只允许 build 生成 | | 原生桥安全风险 | WebViewAssetLoader origin + capabilities + 禁止外部不可信内容 | | 旧 MiniAPP 兼容 | v1/v2 双路径,迁移显式触发 | ## 12. 当前代码落点 | 当前文件 | 后续改动 | | --- | --- | | `app/build.gradle.kts` | 添加 Javet 依赖,确认 ABI/packaging | | `MiniAppStore.kt` | 扩展 v2 项目目录、导入导出、v1 兼容 | | `MiniAppActivity.kt` | v2 使用 WebViewAssetLoader 加载 dist | | `AppLauncherPage.kt` | 工作台预览同步支持 v2 runtime | | `MiniAppPreflightValidator.kt` | 从 HTML 字符串验证升级为项目/dist 验证 | | `AppManagerSkill.kt` | 增加项目级 actions 和 v2 guide | | `AppJsBridge.kt` | 增加 capabilities 和 origin 校验 | | `ClawApplication.kt` | 初始化 NodeRuntimeManager / MiniAppBuildService | ## 13. 第一版验收标准 第一版完成后,至少要满足: 1. Android 真机内能通过 Javet 返回 Node 版本。 2. AI 可以创建一个 `vue3-vite-ts` MiniAPP 项目。 3. 项目可在 Android 内 build 成 `dist/`。 4. 编译失败时 AI 能读取报错文件并修复。 5. WebView 能运行 `dist/index.html`。 6. Claw bridge 在 Vue 应用启动前可用。 7. MiniAPP v2 可以导出和导入。 8. 旧版 HTML MiniAPP 不受影响。