mirror of
https://github.com/wwiinnddyy/LanMountainDesktop.git
synced 2026-08-19 18:23:25 +08:00
feat: implement AirAppRuntimeBridge for managing runtime lifecycle and add corresponding unit tests for launcher window and runtime orchestration
This commit is contained in:
@@ -6,42 +6,20 @@
|
||||
|
||||
### 核心模块
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
L["LanMountainDesktop.Launcher<br/>短生命周期:OOBE / Splash / 版本选择 / 启动协调"]
|
||||
H["LanMountainDesktop 主 Host<br/>桌面组件 / 主窗口 / 托盘 / 设置"]
|
||||
R["AirAppRuntime<br/>生命周期、实例去重、进程协调"]
|
||||
A["AirAppHost(按实例多进程)<br/>内置轻应用窗口渲染"]
|
||||
|
||||
L -->|"启动 Host"| H
|
||||
L -->|"预启动;Host 就绪后 AttachHost(hostPid),随后退出"| R
|
||||
H -->|"内置组件点击 → AirAppLauncherService → 生命周期 IPC"| R
|
||||
R -->|"启动或激活"| A
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────────┐
|
||||
│ 用户交互层 │
|
||||
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
|
||||
│ │桌面组件 │ │主窗口 │ │托盘图标 │ │设置窗口 │ │
|
||||
│ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │
|
||||
└─────────────────────────────────────────────────────────────┘
|
||||
↓
|
||||
┌─────────────────────────────────────────────────────────────┐
|
||||
│ LanMountainDesktop(桌面宿主) │
|
||||
│ ┌──────────────────────────────────────────────────────┐ │
|
||||
│ │ 组件系统 │ │
|
||||
│ │ 组件注册 | 组件渲染 | 布局管理 | 编辑模式 │ │
|
||||
│ └──────────────────────────────────────────────────────┘ │
|
||||
│ ┌──────────────────────────────────────────────────────┐ │
|
||||
│ │ 插件运行时 │ │
|
||||
│ │ 插件加载 | 生命周期 | SDK 接入 | 契约装配 │ │
|
||||
│ └──────────────────────────────────────────────────────┘ │
|
||||
│ ┌──────────────────────────────────────────────────────┐ │
|
||||
│ │ 核心服务层 │ │
|
||||
│ │ 设置 | 主题 | 本地化 | 日志 | 遥测 | IPC │ │
|
||||
│ └──────────────────────────────────────────────────────┘ │
|
||||
└─────────────────────────────────────────────────────────────┘
|
||||
↓ ↓
|
||||
┌──────────────────────┐ ┌──────────────────────────────┐
|
||||
│ LanMountainDesktop │ │ LanMountainDesktop │
|
||||
│ .AirAppRuntime │←IPC→│ .AirAppHost (多实例) │
|
||||
│ Air APP 运行时容器 │ │ Air APP 渲染进程 │
|
||||
└──────────────────────┘ └──────────────────────────────┘
|
||||
↑
|
||||
┌──────────────────────┐
|
||||
│ LanMountainDesktop │
|
||||
│ .Launcher │
|
||||
│ 启动器 (唯一入口) │
|
||||
└──────────────────────┘
|
||||
```
|
||||
|
||||
生产环境中,桌面上的世界时钟、白板和 RSS 阅读器入口属于主 Host 的组件系统。Launcher 不承载这些组件或窗口,也不应在完成 Host PID 交接后继续作为透明/后台窗口存活。
|
||||
|
||||
## 项目结构
|
||||
|
||||
@@ -49,20 +27,29 @@
|
||||
|
||||
| 项目 | 职责 | 类型 |
|
||||
|------|------|------|
|
||||
| **LanMountainDesktop** | 桌面宿主主程序 | WPF 应用 |
|
||||
| **LanMountainDesktop.Launcher** | 启动器(OOBE、Splash、版本管理) | 独立可执行 |
|
||||
| **LanMountainDesktop** | 桌面宿主主程序 | Avalonia 应用 |
|
||||
| **LanMountainDesktop.Launcher** | 短生命周期启动协调器(OOBE、Splash、版本管理、Runtime 预启动与 Host 交接) | 独立可执行 |
|
||||
| **LanMountainDesktop.AirAppRuntime** | Air APP 运行时容器 | 独立服务 |
|
||||
| **LanMountainDesktop.AirAppHost** | Air APP 渲染进程 | 框架依赖应用 |
|
||||
| **LanMountainDesktop.AirAppHost** | 内置 Air APP 窗口渲染进程 | 框架依赖应用 |
|
||||
|
||||
### SDK 和基础设施
|
||||
|
||||
| 项目 | 职责 | 类型 |
|
||||
|------|------|------|
|
||||
| **LanMountainDesktop.PluginSdk** | 插件 SDK | NuGet 包 |
|
||||
| **LanMountainDesktop.AirAppSdk** | Air APP SDK | NuGet 包 |
|
||||
| **LanMountainDesktop.Shared.Contracts** | 共享契约类型 | 类库 |
|
||||
| **LanMountainDesktop.Shared.IPC** | IPC 基础设施 | 类库 |
|
||||
|
||||
### Air APP 第三方开发原型(尚未接入生产)
|
||||
|
||||
| 项目 | 当前状态 |
|
||||
|------|---------|
|
||||
| **LanMountainDesktop.AirAppSdk** | API/清单模型原型;生产 Host、Runtime、AirAppHost 与 Launcher 均未引用或加载它 |
|
||||
| **LanMountainDesktop.AirAppTemplate** | 基于 AirAppSdk 的项目模板原型;其输出不会被生产 Host 自动发现 |
|
||||
| **LanMountainDesktop.AirAppDevServer** | 构建监视、预览和打包原型;预览宿主仍为 TODO,不属于生产运行路径 |
|
||||
|
||||
当前生产 AirAppHost 只按 `appId` 选择编译在程序中的 `world-clock`、`whiteboard`、`rss-reader` 视图,没有第三方 `airapp.json` 扫描、程序集加载或 SDK 生命周期装配。`.laapp` 扩展名当前由插件安装链路使用并要求包内存在 `plugin.json`;AirAppDevServer 以 `airapp.json` 为基础生成的同名扩展包不能作为生产 Air APP 安装包使用。
|
||||
|
||||
### 功能模块
|
||||
|
||||
| 项目 | 职责 | 类型 |
|
||||
@@ -113,11 +100,17 @@
|
||||
- 注册组件
|
||||
- 显示托盘图标
|
||||
↓
|
||||
9. 将 Host PID 附加给 AirAppRuntime
|
||||
9. 启动协调成功,Launcher 获得存活的 Host PID
|
||||
↓
|
||||
10. 清理标记为 .destroy 的旧版本
|
||||
10. Launcher 通过 Runtime 控制 IPC 调用 AttachHost(hostPid)
|
||||
- Runtime 确认 Host PID 与进程存活状态
|
||||
- 交接失败时记录诊断;Host 仍保留按需启动 Runtime 的兜底
|
||||
↓
|
||||
11. 桌面就绪
|
||||
11. 写入启动结果并关闭 Splash/Launcher 生命周期
|
||||
- 不等待 Host 进程退出
|
||||
- 不保留透明或后台 Launcher 窗口
|
||||
↓
|
||||
12. Host 与 AirAppRuntime 独立运行,桌面就绪
|
||||
```
|
||||
|
||||
### 开发环境启动
|
||||
@@ -129,11 +122,34 @@
|
||||
↓
|
||||
跳过 OOBE 和版本管理
|
||||
↓
|
||||
如果 AirAppRuntime 未运行,自动启动
|
||||
↓
|
||||
正常初始化桌面环境
|
||||
↓
|
||||
首次点击内置轻应用入口时尝试连接 AirAppRuntime
|
||||
↓
|
||||
若 Runtime IPC 不可用,由 Host 启动 Runtime 并重试
|
||||
```
|
||||
|
||||
## 内置轻应用运行链路
|
||||
|
||||
当前已上线的轻应用链路只覆盖内置世界时钟、白板和 RSS 阅读器:
|
||||
|
||||
```
|
||||
Host 内的桌面组件接收点击
|
||||
↓
|
||||
AirAppLauncherService 构造 AirAppOpenRequest
|
||||
↓ LanMountainDesktop.AirAppRuntime.v1
|
||||
IAirAppLifecycleService.OpenAsync(request)
|
||||
↓
|
||||
AirAppRuntime 解析实例键,激活已有进程或启动 AirAppHost
|
||||
↓
|
||||
AirAppHost 根据 appId 创建编译内置的窗口内容
|
||||
```
|
||||
|
||||
- 世界时钟共用 `world-clock:clock-suite:global`,RSS 阅读器共用 `rss-reader:global`;白板等其他入口按 `{appId}:{sourceComponentId}:{sourcePlacementId}` 区分实例。
|
||||
- `sourceComponentId` 与 `sourcePlacementId` 从 Host 组件透传到 AirAppHost,使白板等窗口继续使用对应组件实例的上下文与数据。
|
||||
- AirAppHost 打开后向 Runtime 注册,关闭时注销;Runtime 负责实例表、激活与回收,不负责渲染窗口。
|
||||
- 这条链路没有调用 AirAppSdk、AirAppTemplate 或 AirAppDevServer,也不能据此推断第三方 Air APP 已可加载。
|
||||
|
||||
## 核心系统
|
||||
|
||||
### 1. 组件系统
|
||||
@@ -241,28 +257,33 @@ Settings Root
|
||||
**通信拓扑**:
|
||||
|
||||
```
|
||||
┌────────────────┐
|
||||
│ Host │ ← 外部 IPC 入口点
|
||||
│ (主程序) │
|
||||
└────────┬───────┘
|
||||
│ IPC
|
||||
┌────┴────┐
|
||||
↓ ↓
|
||||
┌────────┐ ┌────────────┐
|
||||
│Launcher│ │AirAppRuntime│
|
||||
└────────┘ └──────┬──────┘
|
||||
│ IPC
|
||||
┌─────┴─────┐
|
||||
↓ ↓
|
||||
┌─────────┐ ┌─────────┐
|
||||
│AirAppHost│ │AirAppHost│
|
||||
└─────────┘ └─────────┘
|
||||
启动阶段(Launcher 存活)
|
||||
|
||||
┌──────────┐ 启动/激活 ┌──────────────┐
|
||||
│ Launcher │────────────→│ Host │ ← 外部 IPC 入口点
|
||||
└─────┬────┘ └──────┬───────┘
|
||||
│ Runtime 控制 IPC │ Air APP 生命周期 IPC
|
||||
↓ ↓
|
||||
┌──────────────────────────────────────┐
|
||||
│ AirAppRuntime │
|
||||
│ GetStatus / AttachHost / Open/Close │
|
||||
└──────────────────┬───────────────────┘
|
||||
│ 启动、激活、注册、注销
|
||||
↓
|
||||
┌─────────────┐
|
||||
│ AirAppHost │(按实例多进程)
|
||||
└─────────────┘
|
||||
|
||||
稳定阶段(Host attach 完成)
|
||||
|
||||
Launcher 已退出;Host ←IPC→ AirAppRuntime ←IPC→ AirAppHost
|
||||
```
|
||||
|
||||
**IPC 管道**:
|
||||
- `LanMountainDesktop.Host.v1` - 宿主公共服务
|
||||
- `LanMountainDesktop.AirAppRuntime.v1` - Air APP 生命周期
|
||||
- `LanMountainDesktop.AirAppRuntimeControl.v1` - Runtime 控制
|
||||
- `LanMountainDesktop.AirAppRuntime.v1` - 同一 Runtime 管道上的 Air APP 生命周期服务与 Runtime 控制服务
|
||||
|
||||
`IAirAppLifecycleService` 与 `IAirAppRuntimeControlService` 都注册在 `LanMountainDesktop.AirAppRuntime.v1`。`LanMountainDesktop.AirAppRuntimeControl.v1` 不是当前代码中的独立管道名称。
|
||||
|
||||
## 数据流
|
||||
|
||||
|
||||
Reference in New Issue
Block a user