写点什么

通过实例学习鸿蒙静态库的创建与使用

  • 2023-09-11
    福建
  • 本文字数:2538 字

    阅读完需:约 8 分钟

简要介绍


静态共享包 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:

@Componentexport 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@Componentstruct 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 的依赖。直接在页面文件中引入静态库中的接口。


import { TitleManager, getRandomNum } from "@ohos/library"
@Entry@Componentstruct 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"    }  ]}
复制代码


模块导出:

不需要在 Index.ets 中做导出操作,HAP 模块编译时会自动从依赖的模块中收集资源文件。


模块导入:

由于我们是放在同一个 har 包中,所以不用重新配置对 HAR 的依赖。

对于资源文件不需要在页面文件中显式的执行导入操作。


ResourceCaller.ets:

@Entry@Componentstruct 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 静态库的开发和使用,对基本使用方法有了详细的了解,相信在以后读开源代码时,能够分清静态库和动态库了。

发布于: 刚刚阅读数: 4
用户头像

还未添加个人签名 2023-06-19 加入

还未添加个人简介

评论

发布
暂无评论
通过实例学习鸿蒙静态库的创建与使用_鸿蒙_互联网工科生_InfoQ写作社区