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

系统 OpenHarmony
以前感觉HAR很陌生,这次通过对概念的了解,知道了其作用,并通过实例动手操作,完全掌握了HAR静态库的开发和使用,对基本使用方法有了详细的了解,相信在以后读开源代码时,能够分清静态库和动态库了。

想了解更多关于开源的内容,请访问:

51CTO 开源基础软件社区

https://ost.51cto.com

简要介绍

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

想了解更多关于开源的内容,请访问:

51CTO 开源基础软件社区

https://ost.51cto.com

责任编辑:jianghua 来源: 51CTO 开源基础软件社区
相关推荐

2023-09-08 14:48:41

动态共享包HSP

2011-08-18 10:47:48

Xcode 4静态库

2011-07-27 14:56:07

iPhone Makefile Dylib

2009-08-27 16:00:03

C#静态字段C#实例字段

2011-07-11 16:13:01

Java静态变量实例变量

2009-12-28 11:08:34

ADO 实例

2011-07-18 15:52:50

iPhone 静态库

2021-01-19 09:35:36

Python视频游戏编程语言

2009-06-27 10:59:04

2010-04-22 10:41:18

静态库bada

2010-09-10 15:37:44

SQL函数

2010-11-19 09:48:48

ORACLE创建实例

2015-05-13 09:57:14

C++静态库与动态库

2011-04-02 16:33:33

2011-08-11 16:55:34

Oracle数据库AWR

2024-12-31 00:07:12

2011-06-21 15:11:04

QT 数据库

2011-08-18 13:37:57

iPhone项目静态库

2010-04-01 09:45:38

NoSQL

2024-08-26 00:00:01

C#线程操作系统
点赞
收藏

51CTO技术栈公众号