HarmonyOS开发:走进静态共享包的依赖与使用

前言

在上一篇,我们进行了动态共享包的开发和使用,由于动态共享包有一定的局限性,比如,调用共享包资源还得要通过工具类进行调用,再比如仅用于应用内部代码、资源的共享,如果我想要开源,以远程依赖的方式给任何一个想要用的人进行使用,动态共享包就无法实现,针对以上的种种问题,有没有办法进行解决呢?必须有,这就是今天的主角,静态共享包

静态共享包(Harmony Archive)HAR,可以包含代码、C++库、资源和配置文件,可以给一个或多个模块进行依赖使用,和动态共享包不同的是,它不能单独运行,仅仅只能作为依赖项进行使用。

静态共享包很多的使用方式和动态共享包是一致的,考虑到大多数都是首次接触到HarmonyOS开发,为了方便大家更能直观的学习和练习,这里我把静态共享包的流程,也从头至尾的阐述一遍。

本章的内容大纲如下:

1、如何创建一个静态共享包(HAR)

2、静态共享包本地依赖方式

3、静态共享包的多种调用方式

4、静态共享包混淆文件

5、总结

一、如何创建一个静态共享包(HAR)

和动态共享包一样,在当前工程项目名,右键,选择New,然后选择Module即可。

选择Static Library。

设置共享包名字,点击Finish。

和动态共享包不同的是,静态共享包的类型为har。

二、静态共享包本地依赖方式

1、工程内部依赖

工程内部依赖方式,完全和动态共享包一模一样,可以手动进行依赖或者命令方式:

手动方式一,记住格式:【"folder": "file:../folder"】

"staticlibrary": "file:../staticlibrary"

手动方式二:格式,【"@xx/xx": "file:../staticlibrary"】

"@ohos/library": "file:../staticlibrary"

引入之后,进行同步项目,点击Sync Now即可,当然了你可以可以,将鼠标放置在报错处会出现提示,在提示框中点击Run 'ohpm install'。

命令方式依赖:

命令行中或在IDE Terminal窗口中,目录进入到需要引用的模块下,执行ohpm install ../folder命令即可,folder是你的共享包,如下图所示:

命令执行完毕之后,就会自动的在oh-package.json5里添加依赖,并生成映射文件,映射到调用Module的oh_modules目录下:

2、不同工程之间依赖

以上,无论是动态共享包还是静态共享包,都是同工程之间的依赖,但是,很多场景下,为了代码上的复用,我们会有多个项目复用共享包的情况,比如网络共享包,各个工具共享包等等,那么这种方式如何实现呢?

比如,在另一个项目MyLibrary中,有一个静态共享包net,我们在Demo项目中如何使用呢,当然了,这是简单的举例,可以是任何的一个项目,或者任何的一个静态共享包,体现的就是不在一个工程下。

第一步:编译库模块

选中需要共享的静态共享包,点击菜单栏的Build > Make Module选项,如下图:

构建完成之后,在build->default->outputs->default下,就会生成一个.har文件,如下图:

第二步:在需要调用此静态共享包的项目中进行依赖

记住,使用格式【"@xx/xx": "file:../xx.har"】,否则无法进行依赖。

以上的方式,不利于团队之间协作,毕竟你的设备中有这个.har,其他人未必有,所以,为了更好了进行团队协作,还有一种简单的方式,可以把.har文件复制到项目中去,具体的目录自己定义,如下图,我创建了一个libs目录,用于存放.har文件

在上述的依赖方式中,无论是同工程,还是不同工程,在实际的开发中,都有着一定的局限性,比如,如果是同工程,那么就实现不了项目之间的复用,如果是不同工程,即便把.har复制到项目中,实现了团队协作,如果har有更新,那么还得替换,着实不便。

有没有一种类似Android中的远程Maven形式呢,可以很负责任的告诉大家,必须有,那就远程依赖方式,由于内容比较多,我们放到下一篇文档来阐述。

三、静态共享包多种调用方式

无论你是采用同工程还是不同工程,还是远程的依赖的方式,其本质的实现方式是一样的。

1、资源调用

资源调用就比较简单了,可以直接调用,不用和动态共享包那样做中转处理。

比如静态共享包中,有一个字符串资源,当然,也可以是其他的资源,比如颜色、大小、音视频等等,都可以。

其他引用到此静态共享包的模块,就可以直接调用,按照$r('app.type.name')格式,type是你自己定义的资源类型,name是你定义的资源名字,如上图的资源,我们就可以如下调用,毕竟是静态共享包,可以和当前模块的调用方式完全一样。

$r('app.string.static_name')

关于资源类型,HarmonyOS提供了多种资源类型,在前面的了解工程结构那章有详细的介绍,这里再简单罗列一下:

文件

概述

boolean.json

布尔型

color.json

颜色

float.json

浮点型

intarray.json

整型数组

integer.json

整型

pattern.json

样式

plural.json

复数形式

strarray.json

字符串数组

string.json

字符串值

media

多媒体文件,如图形、视频、音频等文件,支持的文件格式包括:.png、.gif、.mp3、.mp4等

rawfile

用于存储任意格式的原始资源文件:$rawfile('filename')"

2、方法调用

比如在静态共享包中,有一个add求和方法,代码如下,记得如果想外暴露,一定要使用关键字export。

其他引用到此静态共享包的模块就可以如下调用,直接调用add方法即可,会有提示导包,如果没有,可按照图中导包方式进行导包即可。

3、类调用

和方法调用一样,我们在静态共享包中创建一个需要暴露的类,这里我以一个日志打印类作为测试,记住凡是需要暴露给外部使用的,一定要添加关键字export。

调用方式和方法如出一辙:

4、组件调用

在静态共享包中有一个自定义的文本组件,展示的内容为:Hello staticlibrary,如下:

调用方式如下,可以直接作为视图展示:

5、跳转静态共享包中的页面

经过验证之后,HAR不支持在配置文件中声明pages页面,如果验证不对,还望大家可以进行指出。

6、注意事项

对外暴露的接口,需要在共享包入口文件index.ets中声明,否则,其他模块无法调用,都是固定的模式,比如上述的add方法,和自定义的组件等,切记!!!

同一个类中的,如果多个方法,可以复用,比如:

export { Log, add, minus } from './utils/test'

四、静态共享包混淆文件

混淆,在开发中,顾名思义,就是把易于理解的代码变成难于阅读和理解的行为,目的是为了代码的安全,避免外泄,如果仅仅是自己公司使用,确实没必要混淆,毕竟都是同一家公司,没必要做的那么苛刻,如果是作为一个开源的代码,为了自身的权益,只开放功能,而保留代码的安全,那么就可以进行混淆,当然了,凡是不能绝对,还是得具体问题具体分析。

我们先看一下未混淆前的效果,所有的源代码均可在oh_modules中清晰查看:

一起再看下混淆后的效果,变成了两个文件,由原来的Net.ts,换成了Net.d.ts和Net.js两个文件,再看源码,已无法查看到原来的样式。

如何进行混淆呢,很是简单,再需要打静态共享包的build-profile.json5文件中,增加如下的属性即可:

artifactType字段有以下两种取值,默认缺省为original。

original:不混淆。

obfuscation:混淆,目前仅支持uglify混淆。

需要注意的是,按照官方解读,artifactType字段设置为obfuscation时,apiType字段必须设置为stageMode,因为Stage模型才支持混淆。

五、总结

静态共享包解决了,多项目开发复用代码的问题,也实现了,代码功能封装直接远程使用的方便,提供了一个开源的便捷使用,这是仅应用内部代码、资源共享的动态共享包所不能比的,当然了,两种共享包,各有优缺点,如何取舍,在于自己的决策。

其实关于静态共享包.har,大家有没有发现,动态共享包在构建编译后,也会创建一个.har文件,没错,你也可以完全通过动态共享包,开发自己的静态共享包

下一篇,我们将带来静态共享包如何实现远程依赖和上传以及关于静态共享包私服的搭建,敬请期待!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/126655.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MAC终端美化

先看看效果: 1.安装on-my-zsh 打开终端,输出: sh -c "$(curl -fsSL https://gitee.com/mirrors/oh-my-zsh/raw/master/tools/install.sh)"安装过程中如果出现了链接超时的错误,不要慌,就再来一次&#x…

进程间通信(IPC)的方法:命名管道

使用管道时,一个进程的输出可成为另外一个进程的输入。 命名管道(Named pipe或FIFO)是一种类似于管道的特殊文件,但在文件系统上有一个名称,它允许以先进先出(FIFO, first in, first out)的方式存储有限数量的数据。它的使用类似于消息…

http请求头部(header)详解

目录 常见的请求头部字段 GET方法的使用方法: POST方法的使用方法: Accept字段的使用方法 Content-Type字段的使用 总结 在互联网协议中,HTTP请求头部(header)是一个非常重要的组成部分。它们是客户端和服务器之…

Vue + Element UI 前端篇(十):动态加载菜单

Vue Element UI 实现权限管理系统 前端篇(十):动态加载菜单 动态加载菜单 之前我们的导航树都是写死在页面里的,而实际应用中是需要从后台服务器获取菜单数据之后动态生成的。 我们在这里就用上一篇准备好的数据格式Mock出模…

Spring boot 第一个程序

新建工程 选择spring-boot版本 右键创建类TestController: 代码如下: package com.example.demo; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springf…

【图卷积神经网络】1-入门篇:为什么使用图神经网络(下)

为什么使用图神经网络? 在本书中,我们将重点介绍图学习技术中的深度学习家族,通常称为图神经网络。GNNs是一种新的深度学习架构类别,专门设计用于处理图结构化数据。与主要用于文本和图像的传统深度学习算法不同,GNNs明确地用于处理和分析图数据集(见图1.4)。 图1.4 - …

内网穿透:FRP(Forwarding Remote Proxy)反向代理

frp 是一个可用于内网穿透的高性能的反向代理应用,支持 tcp, udp 协议,为 http 和 https 应用协议提供了额外的能力,且尝试性支持了点对点穿透 下载地址 https://github.com/fatedier/frp/releases 选择最新的就行,linux和windo…

ac7260网卡不能连5g

之前路由器是双频,最近为了连物联网一堆,把双频拆成两个wifi 结果电脑上装的pdd网卡就罢工了,连4g可以,但是连5g网络就不行,连上却没网,导致网盘下东西慢。刚开始以为是tplink的易展问题,结果看…

无涯教程-Flutter - 数据库

SQLite" class"css-1occaib">SQLite数据库是基于事实和标准SQL的嵌入式数据库引擎,它是小型且经过时间考验的数据库引擎,sqflite软件包提供了许多函数,可以有效地与SQLite数据库一起使用,它提供了操作SQLite数据…

sql:SQL优化知识点记录(十)

(1)慢查询日志 Group by的优化跟Order by趋同,只是多了一个having 开启慢查询日志: 演示一下慢sql:4秒之后才会出结果 查看一下:下方显示慢查询的sql (2)批量插入数据脚本 函数和存…

【广州华锐互动】智慧园区3D数据可视化系统有什么作用?

随着科技的不断发展,智慧园区3D数据可视化系统已经成为了现代园区管理的重要组成部分。它通过将大量的数据进行整合、分析和展示,为企业提供了一个直观、高效的数据管理平台,帮助企业实现精细化管理,提高运营效率,降低…

Python实操 PDF自动识别并提取Excel文件

最近几天,paddleOCR开发了新的功能,通过将图片中的表格提取出来,效果还不错,今天,作者按照步骤测试了一波。 首先,讲下这个工具是干什么用的:它的功能主要是针对一张完整的PDF图片,可…

uni-app 可视化创建的项目 移动端安装调试插件vconsole

可视化创建的项目,在插件市场找不到vconsole插件了。 又不好npm install vconsole 换个思路,先创建一个cli脚手架脚手架的uni-app项目,然后再此项目上安装vconsole cli脚手架创建uni-app项目 安装插件 项目Terminal运行命令:npm…

Docker-基础命令使用

文章目录 前言命令帮助命令执行示意图docker rundocker psdocker inspectdocker execdocker attachdocker stopdocker startdocker topdocker rmdocker prune参考说明 前言 本文主要介绍Docker基础命令的使用方法。 命令帮助 Docker命令获取帮助方法 # docker -h Flag shor…

python library reference

文章目录 1. 标准库2. Python标准库介绍3. 示例 1. 标准库 https://docs.python.org/zh-cn/3/library/ https://pypi.org/ https://pypi.org/search/ 2. Python标准库介绍 Python 语言参考手册 描述了 Python 语言的具体语法和语义,这份库参考则介绍了与 Pytho…

网络协议从入门到底层原理学习(一)—— 简介及基本概念

文章目录 网络协议从入门到底层原理学习(一)—— 简介及基本概念一、简介1、网络协议的定义2、网络协议组成要素3、广泛的网络协议类型网络通信协议网络安全协议网络管理协议 4、网络协议模型对比图 二、基本概念1、网络互连模型2、计算机之间的通信基础…

7.Xaml Image控件

1.运行图片 2.运行源码 a.xaml源码 <!--Source="/th.gif" 图像源--><!--Stretch="Fill" 填充模式--><Image x:Name

OpenCV 04(通道分离与合并 | 绘制图形)

一、通道的分离与合并 - split(mat)分割图像的通道 - merge((ch1,ch2, ch3)) 融合多个通道 import cv2 import numpy as npimg np.zeros((480, 640, 3), np.uint8)b,g,r cv2.split(img)b[10:100, 10:100] 255 g[10:100, 10:100] 255img2 cv2.merge((b, g, r))cv2.imshow…

0401hive入门-hadoop-大数据学习.md

文章目录 1 Hive概述2 Hive部署2.1 规划2.2 安装软件 3 Hive体验4 Hive客户端4.1 HiveServer2 服务4.2 DataGrip 5 问题集5.1 Could not open client transport with JDBC Uri 结语 1 Hive概述 Apache Hive是一个开源的数据仓库查询和分析工具&#xff0c;最初由Facebook开发&…

stm32之31.iic

iic双线制。一根是SCL&#xff0c;作为时钟同步线;一根是SDA&#xff0c;作为数据传输线 SDN #include "iic.h"#define SCL PBout(8)#define SDA_W PBout(9) #define SDA_R PBin(9)void IIC_GPIOInit(void) {GPIO_InitTypeDef GPIO_InitStructure;//使能时钟GR…