Remmina 向 HarmonyOS(OHOS arm64)的移植源码仓库:收录上游 Remmina 源码树(基线 1.4.41)与本平台适配改动,依 GPL-2.0-or-later 释出
Harmony-Remmina
Remmina 向 HarmonyOS(OHOS arm64)的移植源码仓库:收录上游 Remmina 1.4.41 源码树(已就地应用本平台适配改动)与交叉构建脚本,依 GPL-2.0-or-later 释出。
注意:与"pristine 树 + 补丁序列"式仓库不同,本仓
sources/remmina是移植态源码树——改动直接落在树内并以PATCH-<n>(AirRemmina)/__OHOS__注释标记(见《改动指示》)。树内改动可由scripts/patch_remmina.py对上游 v1.4.41 基线幂等重放复现。
来源与许可
| 项 | 内容 |
|---|---|
| 上游项目 | Remmina — The GTK+ Remote Desktop Client(GTK3 远程桌面客户端,RDP/VNC/SSH/SFTP) |
| 上游源码地址 | https://gitlab.com/Remmina/Remmina |
| 上游版本 / 基线 | 1.4.41(树内 CMakeLists.txt 第 39 行 project(Remmina VERSION 1.4.41);CHANGELOG.md 首条 ## v1.4.41,与上游 v1.4.40→v1.4.41 对比链接一致) |
| 上游许可证 | GPL-2.0-or-later(树内 LICENSE 为 GPLv2 全文,COPYING 为上游声明件;各源文件版权头标注 "either version 2 of the License, or (at your option) any later version") |
| 本仓库许可 | 上游源码树(含本平台改动)+ 移植脚本,整体依 GPL-2.0-or-later 释出;改动作为上游衍生作品同许可 |
| 上游源码获取渠道 | git clone https://gitlab.com/Remmina/Remmina 后检出 tag v1.4.41,或 https://gitlab.com/Remmina/Remmina/-/releases/v1.4.41 |
| 上游版权头 | 树内各源文件的上游版权头/license 头保持原样,未作修改 |
| 无担保 | 依 GPL 条款,本移植以"按原样"发布,不含任何担保(树内 COPYING 亦含上游无担保声明) |
移植方式
- 交叉编译目标:OHOS aarch64(
aarch64-linux-ohos,clang 15 / LLVM),工具链文件cross/ohos-toolchain.cmake(CMake)与cross/ohos-aarch64.cross(meson)。 - 构建形态:主程序由上游可执行改造为共享库
libremmina.so(scripts/patch_remmina.pyP1),插件(vnc/rdp/exec)保持上游g_module_open动态加载模型;产物经scripts/deploy_stack.sh/scripts/deploy_remmina.sh做 ELF 归一(NEEDED 去版本号、去除 libc.so 依赖、段对齐修复)。 - 依赖栈(均为独立上游项目,按各自渠道获取后由
scripts/build_m1_deps.sh交叉编译):- GTK3 / glib 及衍生库(gtk 3.24 系 + OHOS GDK 后端)
- libsodium 1.0.20 https://github.com/jedisct1/libsodium(密码加密)
- libssh 0.11.1 https://www.libssh.org(SSH 隧道 / SFTP)
- libvncserver 0.9.15 https://github.com/LibVNC/libvncserver(VNC 插件)
- curl(TLS)https://curl.se、FreeRDP 3.30(RDP 插件)https://www.freerdp.com
- 特性裁剪:configure 期关闭 WWW / Python 插件 / GVNC / X2GO / KF5Wallet / SPICE / Avahi / VTE / NEWS / STATS / TIP / 翻译 / manpages / GCrypt / libsecret(全参数见《交叉构建》)。
仓库结构
Harmony-Remmina/
README.md LICENSE .gitignore
sources/remmina/ # 上游 Remmina 1.4.41 移植态源码树(改动就地应用,带 PATCH 标记)
scripts/ # 交叉构建、依赖构建、部署与 ELF 工具
env.sh # 交叉编译环境(工具链/前缀/平台宏)
patch_remmina.py # 树内改动的幂等重放器(P1–P7,对 pristine v1.4.41 可重放)
build_m1_deps.sh # 新编依赖(libsodium/libssh/libvncserver/curl)
build_remmina.sh # Remmina 本体 CMake 交叉构建
deploy_stack.sh deploy_remmina.sh # 产物部署与 ELF 归一
elf_edit.py unpatchelf.py # ELF 原位编辑工具
cross/
ohos-toolchain.cmake # CMake 交叉工具链文件
ohos-aarch64.cross # meson 交叉配置文件
改动指示
依 GPL-2.0 §2 标注改动义务。本树为已应用改动的发布态;可复现统计(在仓库根目录执行):
grep -rl '__OHOS__' sources/remmina | wc -l # → 4 个文件含 __OHOS__ 条件编译
grep -rln 'PATCH-[0-9a-z]*(AirRemmina)' sources/remmina | wc -l # → 7 个文件含 PATCH 标记(共 10 处)
新增文件 1 个:sources/remmina/src/ohos_pthread_shim.c。其余改动全部为既有文件的条件编译/构建目标修改,逐条如下(编号与树内 PATCH-<n>(AirRemmina) 注释、scripts/patch_remmina.py 一致):
| # | 触及文件 | 改动内容 |
|---|---|---|
| P1 | src/CMakeLists.txt |
主程序目标 add_executable(remmina …) → add_library(remmina SHARED …);移除 -rdynamic(共享库默认导出符号,插件 g_module_open 回查服务函数表需要);install(TARGETS remmina …) 由 ${CMAKE_INSTALL_BINDIR} 改 LIBRARY DESTINATION lib(3 处标记) |
| P2 | src/remmina.c |
#ifdef __OHOS__ 下入口 main 改名并导出为 remmina_ohos_main(visibility("default"),供宿主集成层 dlsym 调用) |
| P3 | src/remmina.c |
#ifdef __OHOS__ 下 GDK 后端白名单置为 "ohos" |
| P4 | src/rcw.c |
#ifndef __OHOS__ 守护 Wayland 多显示器分支宏引用(OHOS 单屏等效直接 return) |
| P4b | src/remmina_pref_dialog.c |
#ifndef __OHOS__ 守护上游漏守护的 Wayland 宏引用 |
| P5 | src/ohos_pthread_shim.c(新增) |
pthread_cancel / pthread_setcancelstate / pthread_setcanceltype / pthread_testcancel 的 no-op 兜底实现(OHOS musl 运行库不导出该符号族) |
| P6 | src/remmina_exec.c |
#ifdef __OHOS__ 下快速连接补 sftp:///SFTP:// scheme 分支(上游缺失,落到按文件打开路径报错),user:pass@ 解析条件同步扩展 |
| P7 | plugins/rdp/rdp_plugin.c |
pre_connect 设 FreeRDP_TlsSecLevel = 0:FreeRDP 3.30 默认 112-bit 安全等级在 OpenSSL 3 下剔除 SHA1 族签名,导致 Windows Server 2012 R2 等旧版 SChannel 的 RDP 自签证书 TLS 握手必败;0 = 不限制,恢复旧服务器兼容 |
补丁正文与树内注释保持移植时原样(含历史工程代号注释),未改写,以保证 scripts/patch_remmina.py 标记串匹配、可继续幂等重放。
功能状态 / 已知限制
- 本树可构建出:
libremmina.so主体 +remmina-plugin-vnc.so/remmina-plugin-rdp.so(FreeRDP3 模式)/remmina-plugin-exec.so(M2–M6 里程碑实证:VNC 端到端、RDP 端到端、SFTP 传输)。 - exec 插件的
g_spawn/外部工具通道在沙箱内受限(编译保留、运行可能失败)。 - WWW、Python、GVNC、X2GO、SPICE 等插件依裁剪开关不构建;翻译在构建期关闭(中文化由部署侧提供)。
- 依赖栈(GTK3 OHOS 后端等)不在本仓内,需按《移植方式》所列上游渠道自行交叉编译后配置路径。
交叉构建
以下实参均摘自仓内脚本,未增补外部参数:
source scripts/env.sh
python3 scripts/patch_remmina.py # 对 pristine v1.4.41 重放 P1–P7(幂等)
bash scripts/build_m1_deps.sh # libsodium/libssh/libvncserver/curl(cmake/meson + cross 文件)
cmake -S sources/remmina -B <构建树> -G Ninja \
-DCMAKE_TOOLCHAIN_FILE=cross/ohos-toolchain.cmake \
-DCMAKE_BUILD_TYPE=Release \
-DREMMINA_RUNTIME_PLUGINDIR=<设备侧插件目录> \
-DWITH_FREERDP3=ON -DWITH_CUPS=OFF \
-DWITH_WWW=OFF -DWITH_PYTHONLIBS=OFF -DWITH_GVNC=OFF -DWITH_X2GO=OFF \
-DWITH_KF5WALLET=OFF -DWITH_SPICE=OFF -DWITH_AVAHI=OFF \
-DHAVE_LIBAPPINDICATOR=OFF -DWITH_VTE=OFF -DWITH_GCRYPT=OFF \
-DWITH_NEWS=OFF -DWITH_STATS=OFF -DWITH_TIP=OFF \
-DWITH_TRANSLATIONS=OFF -DWITH_MANPAGES=OFF \
-DWITH_ICON_CACHE=OFF -DWITH_UPDATE_DESKTOP_DB=OFF -DWITH_LIBSECRET=OFF
cmake --build <构建树> && cmake --install <构建树>
(完整流程与设备路径变量见 scripts/build_remmina.sh;工具链文件内 find 根、sysroot 与编译器路径为本移植环境实值,复用前需按自身环境调整。)
相关资源
- 上游主页 / Wiki:https://gitlab.com/Remmina/Remmina/-/wikis/home
- 上游源码:https://gitlab.com/Remmina/Remmina(tag
v1.4.41) - GPL-2.0-or-later 许可文本:https://www.gnu.org/licenses/old-licenses/gpl-2.0.html(全文见本仓
LICENSE)
许可证
| 组件 | 许可 |
|---|---|
sources/remmina(上游源码树,含本平台改动) |
GPL-2.0-or-later(Remmina 上游全体贡献者著作权) |
scripts/ cross/(本平台移植脚本与交叉配置) |
GPL-2.0-or-later(与上游同许可释出) |
各组件著作权归其上游项目/作者所有;本仓改动仅授予 GPL 所要求的同等自由许可,不含任何担保。