6.3 KiB
6.3 KiB
AGENTS.md
本仓库是多模块 Monorepo,演示 服务端驱动 UI(Server-Driven UI):后端用 AndroidX Remote Compose 把 UI 编译成二进制文档,Android 端下载后由 RemoteComposePlayer 原生渲染。
仓库结构
VibeCoding_ComposeRemote/
├── ComposeRemoteAndroid/ # 【可改】Android 客户端(Kotlin + Jetpack Compose)
├── ComposeRemoteServer/ # 【可改】Spring Boot 4 后端(生成 Remote Compose 二进制文档)
├── remotecompose/ # 【只读】GitHub 开源:Web 编辑器 + JVM 转换器 + .rc 二进制产物
└── remotecompose-android/ # 【只读】GitHub 开源:纯播放端示例 App
⚠️
remotecompose/与remotecompose-android/是上游 GitHub 开源项目,禁止修改。 仅可在ComposeRemoteAndroid/与ComposeRemoteServer/中编写代码。
架构与数据流
CREATION SIDE (JVM) PLAYBACK SIDE (Android)
┌──────────────────────┐ binary ┌──────────────────────────┐
│ ComposeRemoteServer │ .rc bytes │ ComposeRemoteAndroid │
│ RemoteComposeWriter │ ── HTTP ───▶ │ OkHttp GET → RemoteDoc │
│ → byte[] (octet) │ (GET /card) │ RemoteComposePlayer 渲染 │
└──────────────────────┘ └──────────────────────────┘
- 后端只负责「创建」文档;前端只负责「播放」文档,两端都不解析 JSON 布局、不共享创建端源码。
- 通信协议:Android 向
GET /api/remote-ui/card发请求,后端返回application/octet-stream的二进制byte[],前端用RemoteDocument(bytes)解码。
1. ComposeRemoteAndroid(可改)
- 类型:Android Application,Kotlin + Jetpack Compose(声明式 UI)。
- 构建:Gradle(AGP
9.2.1,Kotlin2.4.0,Compose BOM2026.02.01)。 - SDK:
minSdk 29/targetSdk 36/compileSdk 36.1,Java 语言级别 11。 - 关键依赖:
androidx.compose.remote:remote-player-core / -compose / -view:1.0.0-alpha17(播放端)com.squareup.okhttp3:okhttp:4.12.0(下载二进制文档)
- 网络:
AndroidManifest.xml已声明INTERNET权限,且res/xml/network.xml允许明文流量(cleartextTrafficPermitted=true)。 - 关键文件:
app/src/main/java/com/ttstd/composeremote/MainActivity.kt— 入口,enableEdgeToEdge(),硬编码服务端地址(192.168.1.5:8000)。app/src/main/java/com/ttstd/composeremote/ui/RemoteUIScreen.kt— 拉取二进制 →RemoteDocument→RemoteComposePlayer渲染;含 loading / error 状态。ui/theme/— Material 3 主题(默认未启用ComposeRemoteAndroidTheme)。
- 构建/运行(在
ComposeRemoteAndroid/内):./gradlew :app:assembleDebug./gradlew :app:installDebug(需连接模拟器/设备)
- 约定:
- 服务端地址改为常量或
BuildConfig/local.properties注入,勿在MainActivity中硬编码内网 IP。 - 播放端代码不要引入
remote-creation-*(创建端)依赖。
- 服务端地址改为常量或
2. ComposeRemoteServer(可改)
- 类型:Spring Boot 4.1.0 Web MVC 应用,Java 17,Maven 构建。
- 关键依赖:
spring-boot-starter-webmvc、jackson-databind、lombok、spring-boot-starter-testandroidx.compose.remote:remote-creation-jvm:1.0.0-alpha17(服务端生成二进制文档)- 仓库配置:
maven.google.com(Remote Compose artifacts 来自 Google Maven)。
- 关键文件:
src/main/java/com/ttstd/composeremote/server/controller/RemoteUIController.javaGET /api/remote-ui/card→produces = APPLICATION_OCTET_STREAM,返回二进制byte[]。- 内部用
RemoteComposeWriter(Profile:DOCUMENT_API_LEVEL/PROFILE,1080×1920,density 1.0)写header→startRoot/column/textComponent→encodeToByteArray()。
- 构建/运行(在
ComposeRemoteServer/内):./mvnw spring-boot:run(默认端口 8080 → 需与客户端地址一致,例如 8000)./mvnw clean package
- 约定:
- 新增 UI 时复用
buildRemoteDocument()的 writer/Profile 模式;保持 apiLevel/profiles 与 Android 播放端兼容。 - 注意 Remote Compose 版本一致性:服务端
remote-creation-jvm为1.0.0-alpha17,Androidremote-player同为alpha17;而只读的remotecompose/server用的是alpha05,不要混用。
- 新增 UI 时复用
3. remotecompose(只读,禁止修改)
- 上游:armcha/remotecompose。
- 内容:浏览器拖拽编辑器(Vanilla JS)、Kotlin/Wasm 预览、
server/(JVM 转换器,remote-creationalpha05)、若干.json布局配置 + 生成的.rc二进制文档、index.html实时预览。 - 用途:参考其
.rc文档格式与 JSON→二进制转换逻辑;切勿在此目录提交改动。
4. remotecompose-android(只读,禁止修改)
- 上游:armcha/remotecompose-android。
- 内容:纯播放端示例 App,从 GitHub 下载
.rc文件用RemoteComposePlayer渲染(4 个屏幕 + Compose Navigation)。 - 用途:播放端架构/组件封装(如
RemoteDocumentView、RemoteConfigFetcher)的参考实现;切勿修改。
版本与依赖关键约束
| 模块 | Remote Compose artifact | 版本 |
|---|---|---|
| ComposeRemoteServer | remote-creation-jvm |
1.0.0-alpha17 |
| ComposeRemoteAndroid | remote-player-* |
1.0.0-alpha17 |
| remotecompose/server(只读) | remote-creation* |
1.0.0-alpha05 |
- 创建端与播放端必须使用同一 alpha 版本(
alpha17)以保证二进制兼容;升级时两端同步升级。 - 所有 Remote Compose 依赖均来自 Google Maven(
maven.google.com)。
通用协作约定
- 提交前在各自子项目目录内构建通过(Android:
:app:assembleDebug;Server:./mvnw compile)。 - 不要触碰
remotecompose/、remotecompose-android/。 - 新增「服务端驱动 UI」能力时:后端在
RemoteUIController生成文档,前端在RemoteUIScreen消费,保持二进制协议一致。