Files
LanMountainDesktop/docs/CROSS_PLATFORM.md
2026-08-11 19:41:54 +08:00

89 lines
5.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 跨平台架构说明
> 本文档描述阑山桌面的跨平台(桌面 + 移动)架构方案与分层约束。
> 当前目标平台Windows主力、Linux/macOS桌面构建、Android移动端。iOS 暂不在范围内。
## 1. 总体分层
```
┌─────────────────────────────────────────────────────┐
│ Heads平台入口
│ LanMountainDesktopWinExe 桌面宿主) │
│ LanMountainDesktop.Mobile.AndroidAndroid head
├─────────────────────────────────────────────────────┤
│ 共享 UI 层 │
│ LanMountainDesktop.Mobile移动壳/组件面板) │
│ ComponentSystem / Controls / Theme随桌面宿主
├─────────────────────────────────────────────────────┤
│ 平台差异层Platform
│ LanMountainDesktop.Platform接口 + Windows/MacOS 实现)│
├─────────────────────────────────────────────────────┤
│ 共享核心层(必须无平台依赖) │
│ LanMountainDesktop.Core契约 / IPC / 插件打包) │
│ LanMountainDesktop.PluginSdkSDK / 隔离 / 设置/外观)│
└─────────────────────────────────────────────────────┘
```
## 1.1 当前落地状态
-`LanMountainDesktop.Platform`:接口 + NoOp 实现 + `PlatformLog` 日志桥;
Windows 实现(电源管理、原生对话框、桌面层嵌入、窗口置底/区域穿透、
DWM 互操作、图标服务 WindowsIconService/UwpManifestIconResolver、包标识查询
MacIconService合并自 Platform.Abstractions / Windows / MacOS
-`Mobile` + `Mobile.Android`单视图组件面板壳APK 可构建
- ✅ 主工程 `LanMountainDesktop` 已无任何 DllImport/LibraryImport
- ✅ PluginIsolation 的 `InProcPluginIpcTransport`(进程内直通,含测试)已并入 PluginSdk
主工程保留的平台相关内容(有意为之):
- `WindowsNotificationListener` / `WindowsSmtcMusicControlService` / `LocationService`
的 WinRT **反射**调用路径(无编译期平台依赖,运行时 `OperatingSystem.IsWindows()` 保护),
P/Invoke 部分已抽到 `LanMountainDesktop.Platform.Windows` 命名空间下的 `WindowsPackageIdentity`
- `LinuxPowerManagementService`(纯命令行调用,无平台 API
- 静态工厂门面(`*ServiceFactory`)留在 `LanMountainDesktop.Services` 命名空间,
保持既有调用点不变,内部委托平台实现。
## 2. Platform 层规则
- 所有 P/Invoke、`DllImport`/`LibraryImport`、Windows 注册表、COM/Office 互操作等平台专属代码,
一律放入 `LanMountainDesktop.Platform` 项目(按平台子命名空间区分),禁止出现在主工程与共享层。
- `LanMountainDesktop.Platform` 的接口与 DTO 部分只包含跨平台契约与 Null/NoOp 兜底实现。
- Head 项目在启动时负责注册对应平台实现(桌面注册 Windows 实现Android 注册移动实现或 NoOp
## 3. 插件体系的平台策略
| 能力 | 桌面 | Android |
|---|---|---|
| 插件契约PluginSdk / PluginIsolation.Contracts | 保留 | 保留(不变) |
| 进程内加载AssemblyLoadContext | 保留 | 保留 |
| 进程外隔离(命名管道 + AirAppHost 子进程) | 保留 | 不可用,降级为进程内 |
| IPC 传输 | 命名管道dotnetCampus.Ipc | 进程内直通InProc transport同一契约 |
| AirApp 运行时(独立进程) | 保留 | 第一版不提供 |
插件代码不感知传输差异:同一套 `PluginIsolation` 契约在桌面走管道,在移动端走进程内直通。
## 4. 移动端形态
- 移动端不存在"桌面层自由摆放"的交互,组件以**组件面板**(可滚动卡片流/网格)呈现。
- 复用同一批组件控件与 Appearance 主题资源,仅替换容器布局。
- 单窗口生命周期(`ISingleViewApplicationLifetime`)。
## 5. 明确舍弃(移动端不提供)
- 电源管理PowerManagementService
- 桌面层嵌入 / 点击穿透MainWindowDesktopLayerService、WindowPassthroughService
- Office 互操作MudTools.OfficeInterop.*
- Harmony 运行时补丁Platform/Windows/Patches仅随 Windows head 编译)
- AirApp 独立进程运行时
## 6. 构建与 CI
- 桌面:`dotnet build LanMountainDesktop.slnx`Windows/Linux/macOS 三平台 CI
- Android`dotnet build LanMountainDesktop.Mobile.Android/...csproj`CI `build-android` job
需要 `dotnet workload install android`)。
- 共享层新增依赖时,必须确认该包支持 `net10.0-android`,否则放入 Platform 层。
## 7. 相关文档
- 共享库平台依赖审计报告:`docs/cross-platform-shared-audit.md`
- 架构总览:`docs/ARCHITECTURE.md`