前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >鸿蒙版 Flutter 升级 ohos 构建过程:支持依赖插件源码构建

鸿蒙版 Flutter 升级 ohos 构建过程:支持依赖插件源码构建

作者头像
徐建国
发布于 2025-05-08 08:09:47
发布于 2025-05-08 08:09:47
16500
代码可运行
举报
文章被收录于专栏:个人路线个人路线
运行总次数:0
代码可运行

前言

在鸿蒙版 Flutter 开发过程中,我们曾面临两大挑战:一是配置文件的频繁修改易导致提交冲突,二是插件开发时缺乏代码提示。为解决这些问题,本次更新引入了 Hvigor 插件,实现动态配置更新,并支持直接依赖插件源码进行构建,显著提升开发体验。

一、对于 flutter app 项目

背景说明

由于构建产物位置变更,需对项目配置进行相应调整,以适配新的构建流程。

具体步骤

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1. **调整 .gitignore 文件**

在 ohos/.gitignore 中添加以下内容:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/package.json
/package-lock.json

同时移除:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
*.har

对应的项目里自动生成的 har 文件夹也可以直接删除。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
2. **修改 oh-package.json5 文件**

移除 ohos/oh-package.json5 中 dependencies 的 @ohos/flutter_ohos,以及 overrides 中的 @ohos/flutter_ohos 和 flutter 插件。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
3. **添加 Hvigor 插件**

在 ohos/hvigorfile.ts 中添加 Hvigor 插件 flutterHvigorPlugin,代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import path from 'path'
import { appTasks } from '@ohos/hvigor-ohos-plugin';
import { flutterHvigorPlugin } from 'flutter-hvigor-plugin';

export default {
    system: appTasks,
    plugins:[flutterHvigorPlugin(path.dirname(__dirname))]
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
4. **创建 hvigorconfig.ts 文件**

添加 ohos/hvigorconfig.ts 文件,内容如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import path from 'path'
import { injectNativeModules } from 'flutter-hvigor-plugin';

injectNativeModules(__dirname, path.dirname(__dirname))
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
5. **修改 entry/hvigorfile.ts 文件**

修改 ohos/entry/hvigorfile.ts 文件为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { hapTasks } from '@ohos/hvigor-ohos-plugin';
export default {
    system: hapTasks,
    plugins: []
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
6. **更新 oh-package.json5 文件**

移除 ohos/entry/oh-package.json5 中 dependencies 的 @ohos/flutter_ohos 以及 flutter 插件。

二、对于 flutter module 项目

基于 Har 产物

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1. **移除 flutter 相关依赖**

在 host 工程下 oh-package.json5 中移除 dependencies 和 overrides 中的 flutter 相关依赖(如不存在则无需处理)。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
2. **添加 Har 产物路径**

在 host 工程下 oh-package.json5 的 overrides 中添加所有 flutter 构建出的 har 产物路径,例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
"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 中添加以下代码实现动态添加 overrides:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import fs from'fs'
import path from'path'
import { OhosPluginId } from'@ohos/hvigor-ohos-plugin';
import { getNode, hvigor } from'@ohos/hvigor'

const directory = '替换为 har 产物目录路径'
const rootNode = getNode(__filename)
rootNode.afterNodeEvaluate(node => {
const appContext = node.getContext(OhosPluginId.OHOS_APP_PLUGIN) as OhosAppContext
let overrides = appContext.getOverrides() ?? {}
const files = fs.readdirSync(directory)
for (const file of files) {
    if (path.extname(file).toLowerCase() !== '.har') {
      continue
    }
    let depName = path.parse(file).name
    switch (depName) {
      case'flutter':
        depName = '@ohos/flutter_ohos'
        break
      case'flutter_module':
        depName = '@ohos/flutter_module'
        break
    }
    overrides[depName] = `file:${path.join(directory, file)}`
  }
  appContext.setOverrides(overrides)
})
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
3. **添加依赖**

在 entry(或其他 hap 模块)的 oh-package.json5 的 dependencies 中添加以下依赖:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
"dependencies": {
    "@ohos/flutter_ohos": "",
    "@ohos/flutter_module": "",
}

如果本模块直接使用了某些 Flutter 插件中的 API,则需添加相应插件的依赖,例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
"dependencies": {
    ...
    "plugin_x": ""
}

基于源码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1. **配置 hvigorconfig.ts 文件**

在 host 工程下创建或修改 hvigorconfig.ts 文件(如果没有需新建),添加以下代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { injectNativeModules, getFlutterProjectPath } from './path/flutter_project/.ohos/include_flutter';

injectNativeModules(__dirname, getFlutterProjectPath(), 1)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
2. **更新 hvigorfile.ts 文件**

在 host 工程下的 hvigorfile.ts 中添加 flutterHvigorPlugin 插件,代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { appTasks } from '@ohos/hvigor-ohos-plugin';
import { flutterHvigorPlugin, getFlutterProjectPath } from './path/flutter_project/.ohos/include_flutter';

export default {
  system: appTasks,
  plugins:[flutterHvigorPlugin(getFlutterProjectPath(), 1)]
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
3. **移除 flutter_module**

在 host 工程下 build-profile.json5 中移除 flutter_module。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
4. **移除 flutter 相关依赖**

在 host 工程下 oh-package.json5 中移除 dependencies 和 overrides 中的 flutter 相关依赖(如不存在则无需处理)。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
5. **添加依赖**

在 entry(或其他 hap 模块)的 oh-package.json5 的 dependencies 中添加以下依赖:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
"dependencies": {
    "@ohos/flutter_ohos": "",
    "@ohos/flutter_module": "",
}

如果本模块直接使用了某些 Flutter 插件中的 API,则需添加相应插件的依赖,例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
"dependencies": {
    ...
    "plugin_x": ""
}

三、对于 flutter plugin 项目

可选修改

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1. **更新 hvigorfile.ts 文件**

将插件项目下的 hvigorfile.ts 改为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { harTasks } from '@ohos/hvigor-ohos-plugin';
export default {
    system: harTasks,
    plugins: []
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
2. **移除 dependencies**

在插件项目下 oh-package.json5 中移除 dependencies 的 @ohos/flutter_ohos。

必须修改

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

总结

本次鸿蒙版 Flutter 优化 ohos 构建过程,通过引入 Hvigor 插件实现了动态配置更新,有效避免了配置文件频繁修改引发的提交冲突。同时,支持直接依赖插件源码进行构建,极大地提升了插件开发体验,使其与 Android 和 iOS 平台保持一致。调整后,构建产物统一存放于 flutter 项目的 build/ohos 目录下。对于既有项目,需按照上述步骤手动调整,调整完成后执行 flutter pub get 即可。大家可关注相关 pr[1],待其合并后,便可以按照这种方式进行构建。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-05-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 大前端之旅 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Banner——第一阶段考核
1.中国朋友们聚会时喜欢玩"逢7过"的游戏,老外有个同样的游戏,FlipFlop,它从1计数到100,顺序输出。当遇到3的倍数就要说“Flip”,遇到5的倍数就要说“Flop”,既为3的倍数又为5的倍数则要说“FlipFlop”,说错的话表演节目或罚酒。 public class Test1 { public static void main(String[] args) { for(int i=1;i<=100;i++) { if
传说之下的花儿
2023/04/16
1730
Banner——第一阶段考核
Java之数组
数组概述 数组是具有相同数据类型的一组数据的集合。数组中的每个元素具有相同的数据类型。数组的长度是固定的。在Java中同样将数组看作是一个对象,虽然基本数据类型不是对象,但是由基本数据类型组成的数组则是对象。在程序设计中引入数组可以更有效地管理和处理数据。可根据数组的维数将数组分为一维数组、二维数组…… 数组的创建 int[] arr1={0,1,2}; int arr2[]={0,1,2}; int[] arr3=new int[3]; in
二十三年蝉
2018/02/27
8930
Java之数组
Java案例_数组拓展
建议:先根据题目要求进行编写,然后再与我所提供的答案进行对比。因为你的方法和思路可能是最完美的!
小炜同学
2022/08/20
8900
蓝桥杯最后的冲刺篇(JAVA)
目录 1.路径​  题目要求:  解题思路:​ 源码附上: 2.夺宝奇兵​  题目要求:  解题思路: 源码附上:  3. 七星填数 题目要求:  解题思路:  代码附上:  4.蓝桥幼儿园​ 题目要求:  解题思路: 源码附上: 友友们  又见面啦 我是你们的小王同学 你们的三连是我写作最大的动力!!(doge) 小王的gitee: 比特王信哲 (bitewang) - Gitee.com 1.
王同学要努力
2022/12/21
2270
蓝桥杯最后的冲刺篇(JAVA)
Java基础知识及细节之数组
注意:同一个容器可以存储不同的数据类型,但前提是,其他类型必须满足自动类型转换为容器类型。 建议: 容器的类型,和存储的数据类型保持一致。
小炜同学
2022/08/20
3650
Java基础知识及细节之数组
第四天 数组【悟空教程】
第04天 Java基础 第1章 数组 1.1 数组概念 软件的基本功能是处理数据,而在处理数据时,必须先进行数据持有,将数据持有之后,再对数据进行处理。我们将程序中可以临时存储数据的部分叫做容器。 Java当中具有持有数据功能的容器中,数组是最基本的,也是运算速度最快的。 1.2 数组的定义格式 数组是引用类型的一种,其使用方式与引用类型类似,均使用new关键字创建对象为变量赋值。 格式1:数据类型[] 数组名 = new 数据类型[元素个数或数组长度]; 格式2:数据类型 数组名[] = new 数据类
Java帮帮
2018/06/11
8270
第五天 方法【悟空教程】
第05天 方法 第1章 方法 1.1 方法概述 软件的本质是为我们提供了解决日常事务的许多功能。在Java当中通过方法的方式来完成这些功能。即Java中的某个方法提供了某种功能,供我们人类解决问题。 我们可以将一个完整功能的代码组织成一个方法,在再次完成相同的功能时,便可以直接以整体的方式调用该功能,而不需要再将具体实现过程完整重复编写一遍。 main方法就是一个特殊的方法。作为程序入口,供JVM调用。 我们将不同功能定义成不同方法。供其他方法调用。最先接触方法时,我们定义不同的方法,供main方法直接调
Java帮帮
2018/06/11
5090
Java学习笔记之IDE的Debug使用和基础练习
本文主要涉及Java IDE工具IntelliJ的Debug使用和一些Java基础练习。
Jetpropelledsnake21
2021/11/16
5920
Java学习笔记之IDE的Debug使用和基础练习
JAVA入门学习二
循环结构分类:for / while / do…while 跳出循环:break; [ 只能在switch和循环中 ] 继续执行:continue; [ 只能在循环中 ] 结束方法:return value; 返回值作用不是结束循环而是结束方法;
全栈工程师修炼指南
2020/10/23
4610
JAVA入门学习二
使用java理解程序逻辑
1)需求描述:使用java编写一个图书信息管理系统,保存3本图书信息;然后使用自定义方法完成显示图书列表和显示最高单价图书信息两个功能。
星辰xc
2022/04/09
1.1K0
使用java理解程序逻辑
蓝桥杯专项---一维前缀/差分巩固题目
下面的这个是分为了两个情况,这个0,1指的是我们的这个循环的初始值是从哪一个数字开始的:
阑梦清川
2025/02/24
760
蓝桥杯专项---一维前缀/差分巩固题目
【Java】JDK安装及java语法基础
JDK(JavaDevelopment Kit):是指Java开发套件,类似gcc/g++,有了它就可以编译运行java程序。
DevFrank
2024/07/24
1490
【Java】JDK安装及java语法基础
Java—编程案例(专题)
各位同学,前面我们已经学习过很多Java的基础知识了,主要有变量、数组、运算符、流程控制、方法等。但是对于这些知识点的运用,掌握得还不是很熟练,所以今天我们专门花一天时间,给同学们讲几个专项练习题,把前面所学习的知识巩固一下。
用户4396583
2024/09/23
1390
第六天 知识点练习与回顾【悟空教程】
第06天 知识点练习与回顾 第1章 练习 1.1.1 看循环的执行流程 1-5求和案例 public class Demo02DebugTest { public static void main(String[] args) { // 定义求和变量 int sum = 0; // 循环获取每一个数据 for (int x = 1; x <= 5; x++) { sum += x; } System.out.println("sum:" + sum); } } 1.1.2 看方法的调用流程 求和方法的调用
Java帮帮
2018/06/11
5590
Java基础-day03-基础题
Java基础-day03-基础题 1.Scanner类,练习案例 Test1,定义main()方法,按以下步骤编写代码: A.导入Scanner类; B.在main()方法中实例化Scanner对象;
Java帮帮
2018/03/19
7060
Java基础-day03-基础题
【愚公系列】2021年12月 Java教学课程 18-数组
​ 这个自动编号称为数组索引(index),可以通过数组的索引访问到数组中的元素。
愚公搬代码
2021/12/29
4570
【愚公系列】2021年12月 Java教学课程 18-数组
Java 数组、排序和查找
# Java 数组、排序和查找 # 为什么需要数组 一个养鸡场有 6 只鸡,它们的体重分别是 3kg,5kg,1kg,3.4kg,2kg,50kg 。请问这六只鸡的总体重是多少?平 均体重是多少? 请
用户9615083
2022/12/25
2K0
Java 数组、排序和查找
Java基础综合测试
输入包含多组测试用例。 每组测试数据首先是一个正整数N,表示本组数据有N个整数。 请处理到文件结束。
xbhog
2021/02/04
9700
Java基础综合测试
Java基础-day05-基础题
1.定义:3个重载方法,求2个,3个,4个数的平均数。 代码实现: package StudentJavaSEday05; /** * 定义3个重载方法,求2个,3个,4个数的平均数 * @aut
Java帮帮
2018/03/19
6420
Java基础-day05-基础题
Java--十大排序算法
思想:两个相邻元素想比较,不断颠倒位置实现【i,不停的使arr.length-i-1内的最大数的放最后】 -如果数组的最大值刚好是在第一位,要将它挪到正确的位置就需要 n - 1 次移动
司六米希
2022/11/15
2690
相关推荐
Banner——第一阶段考核
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验