简要介绍
静态共享包HAR(Harmony Archive),是为了实现代码和资源的共享,可以包含代码、C++库、资源和配置文件,随使用方一起编译,如果在多个应用中进行调用,就需要有多个HAR,和应用绑定在一起,是一对一的关系。
为了从零开始熟悉静态共享包,我们通过简单的实例,学习一下具体的创建过程和使用方法。
具体实现
1、新建主工程
新建一个普通的HarmonyOS工程,选择Application -> Empty Ability -> Model(Stage),开发工具不允许直接新建static library工程,个人猜测可能就是因为静态库必须和应用本身绑定在一起的缘故。
单独的工程目录结构如下,当前的模块目录是entry目录,字体加粗显示,
2、建立静态库
右击工程名,选择New -> Module…,选择Static Library,
模块创建完成后,工程结构如下图,staticlibrary工程目录名粗体显示,
我们观察staticlibrary模块下的module.json5文件,发现对应的type值为har,代表静态库,主工程的type类型值为entry,而动态库的type值官方定义为shared。本人对type值的定义感觉有点别扭,静态库和动态库的type的定义不太对应,静态库type定义为har了,动态库type为什么不能定义为hsp,或者动态库type定义为了shared,静态库type为什么不能定义为static?而是现在这种,静态库type为har,动态库type为shared,其实这些都不重要,记住就行了,也不需要手动经常改。
3、对多种形式的封装
查了一下文档,HAR支持ArkUI组件、接口和资源这三种形式的封装,所以逐一测试一下。基本方法相同,首先是在属于提供方的模块中,实现模块功能,并在index.ets中进行导出export操作,然后在使用方的应用page页面中进行导入import操作。
HAR对ArkUI组件的支持
功能实现:
MainPage.ets:
@Component export struct MainPage { @State message: string = 'Hello Har' build() { Row() { Column() { Text(this.message) .fontSize(50) .fontWeight(FontWeight.Bold) .fontColor(Color.Red) } .width('100%') } .height('30%') } }
模块导出:
Index.ets:
export { MainPage } from './src/main/ets/components/mainpage/MainPage'
模块导入:
导入har,或者引用HAR前,需要先配置对HAR的依赖,打开entry主模块下的oh-package.json5文件,因为我们是在主模块中要引用静态库,所以我们修改模块级依赖配置文件oh-package.json5,dependencies下添加新建的库,后面file:…/跟着的是工程目录树中静态库的名称staticlibrary。
我们在主模块页面index.ets中引入静态库的组件。
import { MainPage } from "@ohos/library" @Entry @Component struct Index { @State message: string = 'This is entry' build() { Row() { Column() { MainPage() Text(this.message) .fontSize(50) .fontWeight(FontWeight.Bold) } .width('100%') } .height('100%') } }
现在基本完成了,编译看看效果,可以先编译静态库,在项目树中选择staticlibrary,然后点击菜单栏中的build,会看到第一个菜单为 Make Module ‘staticlibrary’,执行后,我们发现在工程代码目录staticlibrary\build\default\outputs\default下有一个staticlibrary.har文件,说明编译成功。
我们再选中entry,然后点击菜单栏中的build,会看到第一个菜单为 Make Module ‘entry’,执行后,我们发现在工程代码目录entry\build\default\outputs\default下有一个entry-default-unsigned.hap文件,说明也编译成功了。
我们通过预览器查看一下界面。
我们再通过模拟器查看一下运行效果。
模拟器中成功运行,说明我们通过entry中调用staticlibrary操作成功。
HAR对ArkUI接口的支持
功能实现:
MainInterface.ets:
export class TitleManager { static getTitle() { return "100以内随机数:"; } } export function getRandomNum() { return Math.floor(Math.random() * 100); }
模块导出:
Index.ets:
export { TitleManager } from './src/main/ts/MainInterface' export { getRandomNum } from './src/main/ts/MainInterface'
模块导入:
由于我们是放在同一个har包中,所以不用重新配置对HAR的依赖。直接在页面文件中引入静态库中的接口。
InterfaceCaller.ets:
import { TitleManager, getRandomNum } from "@ohos/library" @Entry @Component struct InterfaceCaller { build() { Column() { Row() { Text(TitleManager.getTitle()) .fontSize(30) Text(getRandomNum().toString()) .fontSize(30) .fontWeight(FontWeight.Bold) } .width('100%') .height('100%') .justifyContent(FlexAlign.Center) .padding(20) } .height('100%') } }
我们通过预览器查看一下界面。
HAR对ArkUI资源的支持
功能实现:
直接编辑staticlibrary下的resources/base/element/和media下的资源文件即可。
String.json:
{ "string": [ { "name": "page_show", "value": "page from npm package" } ] }
Har.png:
模块导出:
不需要在Index.ets中做导出操作,HAP模块编译时会自动从依赖的模块中收集资源文件。
模块导入:
由于我们是放在同一个har包中,所以不用重新配置对HAR的依赖。
对于资源文件不需要在页面文件中显式的执行导入操作。
ResourceCaller.ets:
@Entry @Component struct ResourceCaller { build() { Row() { Column() { Text($r('app.string.page_show')) .fontSize(30) .padding(20) Image($r("app.media.har")) .width(100) .objectFit(ImageFit.Contain) } .width('100%') .height('100%') .justifyContent(FlexAlign.Center) .padding(20) } .height('100%') } }
我们通过预览器查看一下界面。
至此,我们基本实践了HAR包支持的三种形式。
经验总结
以前感觉HAR很陌生,这次通过对概念的了解,知道了其作用,并通过实例动手操作,完全掌握了HAR静态库的开发和使用,对基本使用方法有了详细的了解,相信在以后读开源代码时,能够分清静态库和动态库了。
相关内容拓展:(技术前沿)
开发语言作为软件搭建的底层,长久以来一直使用英文编程,Java、C 等语言对于专业程序员来说并不难,然而许多非 IT 专业的人,希望搭建出适合自己使用的软件,却被晦涩难懂的英文编程阻拦在外。
所幸的是,自 2000 年以来,低代码领域虽然在夹缝中艰难生存,但是经历 20 年风雨,如今却已柳木成荫,相关领域企业超过百家,近年如火如荼的“JNPF 平台”更是低代码界的一匹黑马。
JNPF 平台由具备 10 多年系统开发经验和企业项目交付经验的技术团队倾力打造而成的企业级低代码平台。支持多国语言切换搭建界面,业务流程只需要“拖拉拽”方式、少量或完全不需要编写代码即可搭建,操作起来就像搭积木一样简单,会玩电脑就可以开发软件。
核心功能:表单引擎、可视化引擎、BI引擎、流程引擎、权限引擎、门户引擎、大屏引擎、接口中心、物联平台
如果那你未曾尝试过这个领域,你或许可以试试看!官网:https://www.jnpfsoft.com/?csdn