方案变更说明(A2 落地修正):原裁决选 UniFFI,但实查 Maven Central 与 maven.mozilla.org 均无 uniffi Kotlin 运行时构件(404),自编译发布成本超过收益。 改为裸 JNI:阶段 0(真机)已验证该链路,接口刻意保持窄(连接/取帧/发输入/销毁), 将来若引入 UniFFI 只替换本层。 线程与锁纪律(决定接口形态): - nativeNextFrame 等帧期间不持会话锁(clone Arc<Session> 后即释放), 桌面静止 500ms 帧间隔不会卡住 UI 线程的输入调用 - destroy 前必须先停解码线程,Kotlin 侧顺序纪律保证(已登记风险清单) - 句柄 = Box 裸指针(永不为 0),destroy 后置 0 帧返回约定:byte[] = [keyframe 标志 1][seq 8][ts 8][w 4][h 4][Annex-B payload], 定长 25 字节头,Kotlin 切片零 JNI 往返。 viewer-core 适配:Session.frames 改 Arc<tokio Mutex>,next_frame 取 &self, 使解码线程与输入线程可并发借用同一 Session。 验证: - 桌面 cargo build -p android-ffi 零警告 - cargo ndk -t arm64-v8a --release:quinn/ring/rustls 交叉编译全部通过 (消除阶段 1 最大未知:QUIC 栈能否编到 Android) - libandroidffi.so 4.2MB,10 个 Java_com_verify_remote_RustBridge_* 符号导出正确
23 lines
1.1 KiB
TOML
23 lines
1.1 KiB
TOML
[workspace]
|
||
resolver = "2"
|
||
# agent-core:平台无关会话层 + 软件编码视频管线(当前仅 linux-agent 使用)
|
||
# linux-agent:Linux 被控端(X11 + XTest)
|
||
# viewer-core:安卓主控的连接/协议/收帧层(桌面 headless 可验证;Android 经 JNI 复用)
|
||
# android-ffi:viewer-core 的 JNI 薄层(cdylib,交叉编译成 libandroidffi.so)
|
||
members = ["common", "agent-core", "agent", "linux-agent", "viewer", "viewer-core", "android-ffi"]
|
||
# 默认成员保持 Windows 三件套,`cargo build --release` 行为与改动前完全一致;
|
||
# Linux 被控端显式构建:`cargo build --release -p linux-agent`
|
||
default-members = ["common", "agent", "viewer"]
|
||
|
||
[workspace.dependencies]
|
||
anyhow = "1"
|
||
serde = { version = "1", features = ["derive"] }
|
||
bincode = "1.3"
|
||
tokio = { version = "1", features = ["full"] }
|
||
quinn = "0.11"
|
||
rustls = { version = "0.23", default-features = false, features = ["ring", "std", "logging"] }
|
||
rcgen = { version = "0.13", default-features = false, features = ["ring", "pem"] }
|
||
lz4_flex = "0.11"
|
||
windows = "0.62"
|
||
minifb = "0.27"
|