- 将原先通过直接更改项目配置文件(app.json5、build-profile.json5、oh-package.json5等)的方式优化为通过Hvigor插件方式动态更新配置,可避免由于配置文件被频繁更改而可能造成的提交冲突问题。
- 直接依赖插件源码来构建,这样编写插件时可直接对源码修改且会有代码提示,体验与Android和iOS统一。
使用hvigor插件方式编译flutter项目的注意点:
- 构建出的APP、HAP以及HAR等产物均位于flutter项目的
build/ohos目录下 - 对于既有项目需要手动调整(工程调整完后需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产物
- host工程下oh-package.json5, 移除dependencies和overrides中flutter相关依赖(如不存在则无需处理)
- 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: [] }基于源码
- host工程下hvigorconfig.ts(如果没有需新建)
// 该文件位于flutter module工程.ohos下,需调整为实际路径import{ injectNativeModules, getFlutterProjectPath }from'./path/flutter_project/.ohos/include_flutter'; injectNativeModules(__dirname, getFlutterProjectPath(),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)] }- host工程下build-profile.json5, 移除flutter_module
- host工程下oh-package.json5, 移除dependencies和overrides中flutter相关依赖(如不存在则无需处理)
对于 flutter plugin 项目
注意:对于既有的flutter plugin项目,如果不做任何修改仅会导致example无法正常编译,但不影响该plugin在flutter项目中的正常使用和编译。
可选修改
- 插件项目下hvigorfile.ts改成
import{ harTasks }from'@ohos/hvigor-ohos-plugin';exportdefault {system: harTasks, plugins: [] }- 插件项目下oh-package.json5, 移除dependencies的
@ohos/flutter_ohos。
必须修改
插件example的调整参考前述的flutter app项目。