news 2026/9/5 2:02:34

Flutter OHOS 使用hvigor插件方式编译flutter项目

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Flutter OHOS 使用hvigor插件方式编译flutter项目
  • 将原先通过直接更改项目配置文件(app.json5、build-profile.json5、oh-package.json5等)的方式优化为通过Hvigor插件方式动态更新配置,可避免由于配置文件被频繁更改而可能造成的提交冲突问题。
  • 直接依赖插件源码来构建,这样编写插件时可直接对源码修改且会有代码提示,体验与Android和iOS统一。

使用hvigor插件方式编译flutter项目的注意点:

  1. 构建出的APP、HAP以及HAR等产物均位于flutter项目的build/ohos目录下
  2. 对于既有项目需要手动调整(工程调整完后需flutter pub get)

对于 flutter app 项目

1. ohos/.gitignore

  • 添加/package.json,/package-lock.json
  • 移除*.har
  • 对应的项目里自动生成的har文件夹也可以直接删除了

2. ohos/oh-package.json5

  • 移除dependencies的@ohos/flutter_ohos
  • 移除overrides的@ohos/flutter_ohos,以及flutter插件

3. ohos/hvigorfile.ts

添加hvigor插件flutterHvigorPlugin

importpathfrom'path'import{ appTasks }from'@ohos/hvigor-ohos-plugin';import{ flutterHvigorPlugin }from'flutter-hvigor-plugin'; exportdefault{system: appTasks, plugins:[flutterHvigorPlugin(path.dirname(__dirname))] }

4. 添加ohos/hvigorconfig.ts

importpathfrom'path'import{ injectNativeModules }from'flutter-hvigor-plugin'; injectNativeModules(__dirname,path.dirname(__dirname))

5. 修改ohos/entry/hvigorfile.ts

import{ hapTasks }from'@ohos/hvigor-ohos-plugin';exportdefault {system: hapTasks, plugins: [] }

6. ohos/entry/oh-package.json5

移除dependencies的@ohos/flutter_ohos以及flutter插件

对于 flutter module 项目

基于Har产物

  1. host工程下oh-package.json5, 移除dependencies和overrides中flutter相关依赖(如不存在则无需处理)
  2. host工程下oh-package.json5, overrides下添加所有flutter构建出的har(注意调整为实际路径)
"overrides": {"@ohos/flutter_ohos":"file:./path/flutter_project/build/ohos/har/release/flutter.har","@ohos/flutter_module":"file:./path/flutter_project/build/ohos/har/release/flutter_module.har","plugin_x":"file:./path/flutter_project/build/ohos/har/release/plugin_x.har", }

上述方式在项目中插件较多且有变动的情况下较为不便,可以在host工程的hvigorfile.ts中添加以下代码实现动态添加依赖的功能

import{ appTasks }from'@ohos/hvigor-ohos-plugin';importfsfrom'fs'importpathfrom'path'import{OhosPluginId}from'@ohos/hvigor-ohos-plugin';import{ getNode, hvigor }from'@ohos/hvigor'constdirectory ='需调整为实际路径'constkeyMap = {"flutter":"@ohos/flutter_ohos","flutter_embedding_debug":"@ohos/flutter_ohos","flutter_embedding_profile":"@ohos/flutter_ohos","flutter_embedding_release":"@ohos/flutter_ohos","arm64_v8a_debug":"flutter_native_arm64_v8a","arm64_v8a_profile":"flutter_native_arm64_v8a","arm64_v8a_release":"flutter_native_arm64_v8a","x86_64_debug":"flutter_native_x86_64","x86_64_profile":"flutter_native_x86_64","x86_64_release":"flutter_native_x86_64","flutter_module":"@ohos/flutter_module"}constrootNode:HvigorNode=getNode(__filename) rootNode.afterNodeEvaluate(node=>{constappContext = node.getContext(OhosPluginId.OHOS_APP_PLUGIN)asOhosAppContextif(!appContext) {return}constoverrides = appContext.getOverrides() ?? {}constdependencies = appContext.getDependenciesOpt() ?? {}constfiles = fs.readdirSync(directory);constkeys =Object.keys(keyMap)for(constfileoffiles) {if(path.extname(file).toLowerCase() !=='.har') {continue}constfileName = path.parse(file).nameconstdepName = keys.includes(fileName) ? keyMap[fileName] : fileNameconstfilePath =`file:${path.join(directory, file)}`dependencies[depName] = filePath overrides[depName] = filePath } appContext.setDependenciesOpt(dependencies) appContext.setOverrides(overrides) })exportdefault{system: appTasks,plugins: [] }

基于源码

  1. host工程下hvigorconfig.ts(如果没有需新建)
// 该文件位于flutter module工程.ohos下,需调整为实际路径import{ injectNativeModules, getFlutterProjectPath }from'./path/flutter_project/.ohos/include_flutter'; injectNativeModules(__dirname, getFlutterProjectPath(),1)
  1. host工程下的hvigorfile.ts, 添加flutterHvigorPlugin插件
import{ appTasks }from'@ohos/hvigor-ohos-plugin';// 该文件位于flutter module工程.ohos下,需调整为实际路径import{ flutterHvigorPlugin, getFlutterProjectPath }from'./path/flutter_project/.ohos/include_flutter';exportdefault {system: appTasks, plugins:[flutterHvigorPlugin(getFlutterProjectPath(),1)] }
  1. host工程下build-profile.json5, 移除flutter_module
  2. host工程下oh-package.json5, 移除dependencies和overrides中flutter相关依赖(如不存在则无需处理)

对于 flutter plugin 项目

注意:对于既有的flutter plugin项目,如果不做任何修改仅会导致example无法正常编译,但不影响该plugin在flutter项目中的正常使用和编译。

可选修改

  1. 插件项目下hvigorfile.ts改成
import{ harTasks }from'@ohos/hvigor-ohos-plugin';exportdefault {system: harTasks, plugins: [] }
  1. 插件项目下oh-package.json5, 移除dependencies的@ohos/flutter_ohos

必须修改

插件example的调整参考前述的flutter app项目。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/5 2:02:30

基于多模态AI的电竞比赛队内语音与选手反应分析技术实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/5 1:56:31

Redis高性能架构深度解析:从单线程模型到I/O多路复用的核心原理

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/5 1:56:11

高性能跨平台网络通信框架 HP-Socket v6.0.9 发布

项目主页 : http://www.oschina.net/p/hp-socket开发文档 : https://www.docin.com/p-4592706661.html下载地址 : https://github.com/ldcsaa/HP-SocketQQ Group: 44636872, 663903943 v6.0.9 更新 一、主要更新 优化Linux通信组件多路复用处理架构,避免“惊群”问…

作者头像 李华
网站建设 2026/9/5 1:55:40

技术博文创作指南:从网络素材到实操文章的结构化方法

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/5 1:55:34

模型微调后如何部署?火山方舟托管平台全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/5 1:55:02

MCP协议详解:一次编写多模型复用的工具服务开发指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华