Tauri 应用移植到 OpenHarmony/鸿蒙PC完整指南

发布时间:2026/6/10 9:28:55

Tauri 应用移植到 OpenHarmony/鸿蒙PC完整指南 手把手教你将一个 Tauri v2 桌面应用移植到 OpenHarmony鸿蒙设备上运行 。更多交流学习欢迎加入开源鸿蒙PC社区https://harmonypc.csdn.net/适用目标OHOS ARM64平板/开发板/ x86_64鸿蒙 PC本文基于 AtomMQTT Client 的真实移植经验沉淀文章目录1. 背景介绍什么是 Tauri为什么要移植到 OpenHarmony移植原理2. 前置准备硬件要求软件要求网络配置中国大陆3. 环境搭建关键3.1 安装 OHOS Rust 目标3.2 安装 tauri-cliOHOS fork3.3 配置 OHOS SDK 路径3.4 配置链接器Windows 特有4. 创建 Tauri 项目5. 改造为 OHOS 兼容结构5.1 修改 lib.rs5.2 修改 Cargo.toml5.3 创建图标5.4 配置 tauri.conf.json5.5 配置 .cargo/config.toml6. 交叉编译6.1 初始化 OHOS 工程6.2 编译 Rust 代码6.3 同步产物到 OHOS 工程7. DevEco Studio 打包 HAP7.1 导入工程7.2 修改必要文件hvigorfile.tsbuild-profile.json57.3 构建 HAP8. 部署到设备8.1 连接设备8.2 安装 HAP8.3 启动应用9. 常见问题与解决方案9.1 编译错误9.2 运行时问题9.3 OHOS 调试面板9.4 完整 Debug Checklist10. 总结移植流程回顾关键经验参考项目展望1. 背景介绍什么是 TauriTauri 是一个使用 Web 前端技术HTML/CSS/JS/React/Vue 等构建桌面应用的框架后端使用 Rust。相比 ElectronTauri 更轻量、更安全、性能更好。为什么要移植到 OpenHarmonyOpenHarmony开源鸿蒙正在快速发展鸿蒙 PC 版也逐渐成熟。将 Tauri 应用移植到 OHOS 可以复用现有的 Tauri 代码— 不需要用 ArkUI 重写 UI跨平台覆盖— 一套代码同时支持 Windows/macOS/Linux/OHOS鸿蒙原生体验— 运行在 OHOS 设备上通过 hdc 部署移植原理Tauri OHOS 移植的核心思路是Tauri App (Rust WebView) │ ▼ napi-ohos 桥接层 ← Rust 与 OHOS 原生代码的桥梁 │ ▼ OHOS ArkWeb WebView ← 渲染前端页面 │ ▼ HAP 打包 ← DevEco Studio 打包为鸿蒙应用社区已有先锋 richerfu 完成了 Tauri v2 的 OHOS fork本指南在此基础之上。移植案例参考MQTT Client的Tauri应用移植到 OpenHarmony 鸿蒙 PC/ARM64 实践记录2. 前置准备硬件要求项目要求开发机Windows 10/11 x86_64本文以 Win10 为例目标设备OpenHarmony 平板/开发板ARM64或 鸿蒙 PCx86_64磁盘空间至少 10GB含 OHOS SDK、Rust 工具链软件要求软件版本下载Rust1.75rustup.rsNode.js18nodejs.orgOHOS SDK6.xHarmonyOS 开发者网站DevEco Studio5.0HarmonyOS 开发者网站Git任意git-scm.com网络配置中国大陆# GitHub 代理加速gitconfig--globalurl.https://ghfast.top/https://github.com.insteadOfhttps://github.com# crates.io 镜像.cargo/config.toml[source.crates-io]replace-withustc-sparse[source.ustc-sparse]registrysparsehttps://mirrors.ustc.edu.cn/crates.io-index/[net]git-fetch-with-clitrue3. 环境搭建关键3.1 安装 OHOS Rust 目标rustup targetaddaarch64-unknown-linux-ohos rustup targetaddx86_64-unknown-linux-ohos3.2 安装 tauri-cliOHOS fork这是最关键的一步。需要从 richerfu/tauri 的feat/open-harmony分支安装。# 克隆 OHOS 分支gitclone--branchfeat/open-harmony https://ghfast.top/https://github.com/richerfu/tauri.git tauri-ohos# ⚠️ 必须修复 cargo-mobile2 版本# 编辑 tauri-ohos/crates/tauri-cli/Cargo.toml# 找到这一行# cargo-mobile2 { version 0.20.6, ... }# 改为# cargo-mobile2 { version 0.22, ... }# 安装 tauri-clicargoinstall--pathtauri-ohos/crates/tauri-cli# 验证安装cargotauri--version# 应输出类似: cargo-tauri-cli 2.8.4# 安装 ohrsOHOS 运行时支持cargoinstallohrs为什么必须改 cargo-mobile2 版本原仓库锁定在旧版0.20.6但新版的cargo-mobile2已经包含了open_harmony平台支持。如果跳过此步骤会报错cannot find open_harmony in cargo_mobile23.3 配置 OHOS SDK 路径从 HarmonyOS 开发者网站下载 OHOS SDK 后目录结构类似D:\software\sdk\default\openharmony\ ├── native\ # NDK 核心 │ ├── llvm\bin\ # clang, lld, llvm-ar │ ├── sysroot\ # 系统头文件和库 │ └── build\cmake\ # CMake 工具链 ├── ...设置环境变量注意指向 SDK根目录不是native/$env:OHOS_HOME D:\software\sdk\default\openharmony3.4 配置链接器Windows 特有OHOS NDK 自带的aarch64-unknown-linux-ohos-clang是 Unix shell 脚本Windows 无法直接使用。需要创建一个.cmd包装器echo off REM ohos-clang.cmd - aarch64 OHOS linker wrapper for Rust D:\software\sdk\default\openharmony\native\llvm\bin\clang.exe ^ -target aarch64-linux-ohos ^ --sysrootD:\software\sdk\default\openharmony\native\sysroot ^ -D__MUSL__ -fuse-ldlld %*放置在项目src-tauri/目录下然后在.cargo/config.toml中引用[target.aarch64-unknown-linux-ohos] linker ..\\ohos-clang.cmd ar D:\\software\\sdk\\default\\openharmony\\native\\llvm\\bin\\llvm-ar.exe rustflags [ -C, link-arg-fuse-ldlld, -C, link-arg--rtlibcompiler-rt, ]4. 创建 Tauri 项目用标准方式创建一个 Tauri v2 项目# 使用 create-tauri-app非交互式npmcreate tauri-applatest my-tauri-app ----templatevanilla--managernpmcdmy-tauri-appnpminstall项目结构初始如下my-tauri-app/ ├── public/ # 前端静态文件 │ └── index.html ├── src/ # 前端源码如果用框架的话 ├── src-tauri/ # Rust 后端 │ ├── src/ │ │ ├── lib.rs │ │ └── main.rs │ ├── Cargo.toml │ ├── build.rs │ ├── tauri.conf.json │ └── icons/ ├── package.json └── ...5. 改造为 OHOS 兼容结构5.1 修改 lib.rs这是最重要的改动。Tauri v2 标准main.rs中直接调用.run()但 OHOS 需要mobile_entry_point宏。src-tauri/src/lib.rs// 将应用逻辑提取到 lib.rs// 注意 cfg_attr 宏 —— 这是 OHOS 正常运行的关键#[cfg_attr(mobile, tauri::mobile_entry_point)]pubfnrun(){tauri::Builder::default().invoke_handler(tauri::generate_handler![greet,// 你的命令]).run(tauri::generate_context!()).expect(error while running tauri application);}#[tauri::command]fngreet(name:str)-String{format!(Hello, {}!,name)}src-tauri/src/main.rs// #![cfg_attr 用于 Windows 隐藏控制台窗口#![cfg_attr( all(not(debug_assertions), target_os windows), windows_subsystem windows)]fnmain(){// 调用 lib.rs 中的 run 函数my_tauri_app_lib::run();}注意lib.rs中的 crate 名称my_tauri_app_lib需要与Cargo.toml中[lib] name一致。5.2 修改 Cargo.toml[package] name my-tauri-app version 0.1.0 edition 2021 [lib] name my_tauri_app_lib crate-type [staticlib, cdylib, rlib] # ← 必须 [build-dependencies] # 使用本地 tauri-ohos 仓库的 tauri-build tauri-build { path ../tauri-ohos/crates/tauri-build, default-features false, features [codegen] } [dependencies] # 使用本地 tauri-ohos 仓库的 tauri tauri { path ../tauri-ohos/crates/tauri } serde { version 1, features [derive] } serde_json 1 # OHOS 目标需要 napi 支持 [target.cfg(target_env ohos).dependencies] napi-derive-ohos 1.1 napi-ohos { version 1.1, features [napi8] }5.3 创建图标OHOS 需要 RGBA PNG 图标# 用 Node.js 生成 RGBA PNGnode-e const fs require(fs); const { createCanvas } require(canvas); // 或用纯 PNG 库 // 最简单找一个 1024x1024 的 RGBA PNG 放到 src-tauri/icons/ 或者用在线工具生成一个 1024x1024 的 RGBA PNG命名为icon.png放入src-tauri/icons/。5.4 配置 tauri.conf.json{productName:My Tauri App,version:0.1.0,identifier:com.example.myapp,build:{frontendDist:../public,devUrl:http://localhost:1420,beforeBuildCommand:,beforeDevCommand:},app:{windows:[{title:My Tauri App,width:1080,height:800,resizable:true,center:true}],security:{csp:null}},bundle:{active:true,targets:all,icon:[icons/icon.png]}}如果需要在 WebView 中通过window.__TAURI__访问 Tauri API添加app:{withGlobalTauri:true,...}5.5 配置 .cargo/config.toml# src-tauri/.cargo/config.toml [source.crates-io] replace-with ustc-sparse [source.ustc-sparse] registry sparsehttps://mirrors.ustc.edu.cn/crates.io-index/ [net] git-fetch-with-cli true [target.aarch64-unknown-linux-ohos] linker ..\\ohos-clang.cmd ar D:\\software\\sdk\\default\\openharmony\\native\\llvm\\bin\\llvm-ar.exe rustflags [ -C, link-arg-fuse-ldlld, -C, link-arg--rtlibcompiler-rt, ]6. 交叉编译6.1 初始化 OHOS 工程$env:OHOS_HOME D:\software\sdk\default\openharmonycd src-tauri cargo tauri ohos init--skip-targets-install这会生成src-tauri/gen/ohos/目录包含完整的 DevEco Studio 工程。6.2 编译 Rust 代码cd src-tauri# 编译 ARM64平板/手机/鸿蒙pccargo tauri ohos build-t aarch64# 或者编译 x86_64cargo tauri ohos build-t x86_64编译成功后产物在src-tauri/target/aarch64-unknown-linux-ohos/release/libmy_tauri_app_lib.so6.3 同步产物到 OHOS 工程# 复制 .so 到正确位置Copy-Item-Pathtarget/aarch64-unknown-linux-ohos/release/libmy_tauri_app_lib.so-Destinationgen/ohos/entry/libs/arm64-v8a/-Force# 同步前端文件Copy-Item-Path..\public\*-Destinationgen\ohos\entry\src\main\resources\rawfile-Recurse-Force7. DevEco Studio 打包 HAP7.1 导入工程打开 DevEco StudioFile → Open→ 选择src-tauri/gen/ohos/目录等待工程加载完成7.2 修改必要文件hvigorfile.tsDevEco Studio 打开项目时会尝试执行cargo tauri ohos dev-eco-studio-script这会失败因为 Rust 编译已经在命令行完成。注释掉这个调用// src-tauri/gen/ohos/entry/hvigorfile.tsfunctiontauriPlugin():HvigorPlugin{return{pluginId:tauri,apply(node:HvigorNode){constbuildRustCode(){// 注释掉Rust 编译已在命令行完成// const target properties.target || aarch64;// execFileSync(cargo,// [tauri, ohos, dev-eco-studio-script, --target, target.toString()], {// cwd: resolve(__dirname, ../../../),// stdio: inherit,// });}node.getTaskByName(defaultConfigureCmake)!.afterRun(buildRustCode);}}}build-profile.json5某些 DevEco Studio 版本对build-profile.json5的 schema 验证很严格只允许以下字段{ apiType: stageMode, buildOption: { externalNativeOptions: { path: ./src/main/cpp/CMakeLists.txt, arguments: , cppFlags: } }, buildOptionSet: [ { name: release, nativeLib: { debugSymbol: { strip: true, exclude: [] } } } ], targets: [ { name: default, runtimeOS: HarmonyOS }, { name: ohosTest } ] }❌不要包含runtimeOSVersion、runtimeOSBranch、enableParallel等字段❌不要在buildOption.arkOptions中加libList.so放在libs/下会被自动发现7.3 构建 HAPDevEco Studio 菜单栏:Build → Build HAP(s)等待构建完成产物在entry/build/outputs/default/entry-default-signed.hap8. 部署到设备8.1 连接设备# 查看已连接的设备hdc list targets# 如果没看到设备检查 USB 连接和驱动8.2 安装 HAPhdcinstall-rentry-default-signed.hap8.3 启动应用hdc shell aa start-aEntryAbility-bcom.example.myappcom.example.myapp是tauri.conf.json中的identifier字段。9. 常见问题与解决方案9.1 编译错误错误信息原因解决cannot find open_harmony in cargo_mobile2cargo-mobile2 版本过旧改为0.22toolchain file not foundOHOS_HOME 路径错误设为 SDK 根目录不是native/icon ... is not RGBA图标格式不对用 RGBA PNGcolor type6cannot find module napi_derive_ohos缺少 napi 依赖在 Cargo.toml 添加 OHOS target depsohpm not found缺少 ohpm安装 DevEco Studio它会自带 ohpm9.2 运行时问题现象原因解决界面加载了但按钮无响应JS 语法错误node --check public/script.js检查中文显示为乱码Mojibake 编码问题以 UTF-8 无 BOM 保存文件window.__TAURI__为 undefinedIPC bridge 未注入设置withGlobalTauri: trueWebView 白屏前端文件未正确同步检查rawfile/目录是否有文件9.3 OHOS 调试面板如果前端交互有问题可以在public/script.js顶部注入 Debug 面板window.__dbg(function(){varpdocument.createElement(div);p.id__dbgpnl;p.style.cssTextposition:fixed;bottom:0;left:0;right:0;max-height:200px;overflow:auto;background:#1a1b26;color:#9ece6a;font:12px monospace;z-index:99999;// ... 创建 toggle header log body ...varbodydocument.createElement(div);body.id__dbgB;p.appendChild(body);document.body.appendChild(p);return{info:function(m){varedocument.createElement(div);e.textContentm;body.appendChild(e);},error:function(m){varedocument.createElement(div);e.style.color#f7768e;e.textContent[ERR] m;body.appendChild(e);}};})();// 探测 Tauri IPC__dbg.info(__TAURI__: typeofwindow.__TAURI__);部署后屏幕底部会显示调试信息帮助定位 IPC 和 JS 问题。9.4 完整 Debug Checklistrustup target list确认 OHOS 目标已安装cargo tauri --version确认是 OHOS fork 版本$env:OHOS_HOME指向 SDK 根目录链接器.cmd文件存在且路径正确node --check public/script.js语法通过tauri.conf.json中withGlobalTauri: truebuild-profile.json5通过 schema 验证hvigorfile.ts中的 cargo 调用已注释.so已复制到libs/arm64-v8a/10. 总结移植流程回顾1. 环境搭建 ──→ 2. 创建项目 ──→ 3. 改造结构 ──→ 4. 编译 ──→ 5. 打包 ──→ 6. 部署 Rust目标 npm create 修改lib.rs cargo tauri DevEco hdc install tauri-cli tauri-app 修改Cargo.toml ohos build Studio OHOS SDK 链接器配置 Build HAP 链接器包装关键经验cargo-mobile2 版本— 安装 tauri-cli 前必须先修复这个依赖否则无法识别 OHOS 平台OHOS_HOME 指向 SDK 根目录— CLI 会自动拼接native/不要多拼一层Windows 链接器— 必须创建.cmd包装Unix shell 脚本在 Windows 不可用JS 语法错误是最大坑— OHOS WebView 没有 DevTools错误会被静默吞掉务必node --check编码问题— 中文文本在重新保存时可能被错误编码注意 UTF-8 无 BOMDevEco Studio 版本差异— 不同版本对build-profile.json5的 schema 校验不同按提示调整参考项目AtomMQTT Client for OpenHarmony — 本文的实践案例完整的 MQTT 客户端移植tauri-demo — OHOS 移植的参考示例Tauri OHOS Fork — 社区移植分支atomMqtt — 配套 MQTT Broker 服务端展望随着 OpenHarmony 生态的发展Tauri 应用的跨平台能力将覆盖到更多设备形态。这套移植方案不仅适用于 MQTT 客户端也适用于任何 Tauri v2 应用 —— 包括但不限于工具类应用JSON 格式化、正则测试、编码转换数据可视化仪表盘轻量级的 IoT 管理工具个人知识管理应用跨平台不在于一次写出在所有平台运行的代码而在于一套架构、一种模式能在不同平台间高效迁移。更多交流学习欢迎加入开源鸿蒙PC社区https://harmonypc.csdn.net/

相关新闻