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

news2024/11/26 15:49:51

前言

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

静态共享包(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.coloradmin.cn/o/976924.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

STM32纯中断方式发送接收数据(串行通信;keil arm5;)

除了main文件其他文件均无修改,正常运行--在keil arm5内

【腾讯云Cloud Studio实战训练营】戏说cloud studio

文章目录 前言产品概述项目体验登录空间模板模板项目体验 总结 前言 在奇幻世界中,存在着一片神秘的云海,被人们称为腾讯云云端开发环境 Cloud Studio。这片云海是一座巨大的浮岛,上面漂浮着一个集成式开发环境(Integrated Devel…

2023年行研行业研究报告

第一章 行业概述 1.1 行研行业 行业定义为同一类别的经济活动,这涉及生产相似产品、应用相同生产工艺或提供同类服务的集合,如食品饮料行业、服饰行业、机械制造行业、金融服务行业和移动互联网行业等。 为满足全球金融业的需求,1999年8月…

指针练习(2)

1. int main() {int a[5][5];int(*p)[4];p a;printf("%p,%d\n", &p[4][2] - &a[4][2], &p[4][2] - &a[4][2]);return 0; } 解析:a是一个5行5列的二维数组,而p是一个访问4个元素的数组指针,将数组a的首元素地址也…

【开发问题系列】CSV转Excel

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学…

innovus: 加IO buffer

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 set fid [open $net_file w] foreach port_name $input_ports { set net [get_nets -q -of_object [get_ports $port_name]] set net_name [get_attribute $net full_name] …

python实现对excel表中的某列数据进行排序

如下需要对webCms中的B列数据进行升序排序,且不能影响到其他列、工作表中的数据和格式。 import pandas as pd import openpyxl from openpyxl.utils.dataframe import dataframe_to_rows# 读取 Excel 文件 file_path 1.xlsx sheet_name webCms# 读取 Excel 文件并…

Java之文件操作与IO

目录 一.认识文件 1.1文件是什么? 1.2文件的组织 1.3文件路径 1.4文件的分类 二.文件操作 2.1File概述 三.文件内容操作--IO 3.1JavaIO的认识 3.2Reader和Writer ⭐Reader类 ⭐Writer类 3.2FileInputStream和FileOutputStream ⭐FileInputStream类 …

scala基础

scala 基础 1. scala简介 scala是运行在 JVM 上的多范式编程语言,同时支持面向对象和面向函数编程早期scala刚出现的时候,并没有怎么引起重视,随着Spark和Kafka这样基于scala的大数据框架的兴起,scala逐步进入大数据开发者的眼帘…

线程同步机制类封装及线程池实现

1.线程池 线程池是由服务器预先创建的一组子线程,线程池中的线程数量应该和 CPU 数量差不多。线程池中的所有子线程都运行着相同的代码。当有新的任务到来时,主线程将通过某种方式选择线程池中的某一个子线程来为之服务。相比与动态的创建子线程&#x…

CRC(Cyclic Redundancy Check)校验

CRC校验概念介绍 CRC,全称是Cyclic Redundancy Check,即循环冗余校验,它是一种计算校验码的方法。 生成多项式 可以用一个二进制比特位的序列来表示。例如生成多项式的二进制比特位序列是11001,X的指数就表示该比特位为1。二进…

[Spring] @Configuration注解原理

文章目录 1.Configuration注解介绍2.ConfigurationClassPostProcessor2.1 Parse12.2 Parse22.3 Parse32.4 Parse42.5 Parse5 3.ConfigurationClassBeanDefinitionReader3.1Bean方法解析成BeanDefinition 4.Configuration总结 1.Configuration注解介绍 在spring中是通过Configu…

墨西哥专线物流公司是什么?

墨西哥专线物流公司是为了满足墨西哥国内和国际货物运输需求而专门设立的一类物流公司。在全球贸易不断增长的背景下,墨西哥作为一个重要的贸易伙伴国,其货物运输需求逐渐增加,因此墨西哥专线物流公司的角色也变得越来越重要。 墨西哥专线物流…

26 | 深入浅出之静态测试方法

人工静态方法 代码走查结对编程同行评审(提交到git后,同事审核。最常用) 自动静态方法 自动静态方法,主要有以下三个特点: 相比于编译器,可以做到对代码更加严格、个性化的检查; 不真…

【AWS实验】 使用 Lake Formation 设置数据湖

文章目录 实验概览目标实验环境任务 1:探索实验环境任务 1.1:在 S3 存储桶中创建文件夹任务 1.2:加载 AWS Cloud9 IDE任务 1.3:将数据复制到 S3 存储桶 任务 2:设置 AWS Lake Formation任务 2.1:注册 Amazo…

kali 安装cpolar内网穿透实现 ssh 远程连接

文章目录 1. 启动kali ssh 服务2. kali 安装cpolar 内网穿透3. 配置kali ssh公网地址4. 远程连接5. 固定连接SSH公网地址6. SSH固定地址连接测试 简单几步通过cpolar 内网穿透软件实现ssh 远程连接kali! 1. 启动kali ssh 服务 默认新安装的kali系统会关闭ssh 连接服务,我们通…

Android之 Canvas绘制

一 Canvas介绍 1.1 Canvas 是绘制图形的重要类之一,它可以在 View 或 SurfaceView 上绘制各种图形和文本. 1.2 要创建 Canvas,首先需要有一个 View 或 SurfaceView 对象,在 View 或 SurfaceView 的绘制方法中,可以通过 Canvas 的…

【transformer】自注意力源码解读和复杂度计算

Self-attention A t t e n t i o n ( Q , K , V ) s o f t m a x ( Q K T d k ) V Attention(Q,K,V) softmax(\frac{QK^T}{\sqrt{d_k}})V Attention(Q,K,V)softmax(dk​ ​QKT​)V 其中, Q Q Q为查询向量, K K K和 V V V为键向量和值向量,…

Langchain使用介绍之 - 基于向量存储进行检索

Text Embedding Models 如何将一段Document转换成向量存储到向量数据库中,首先需要了解Langchain提供了哪些将文本转换成向量的model,langchian提供了很多将自然语言转换成向量的的模型,如下图所示,除了下图列举的model&#xff0…

java和js实现MD5加密

java import java.security.MessageDigest;public class Demo2 {public static void main(String[] args) {Demo2 demo2 new Demo2();String encry demo2.md5("admin");System.out.println("加密后:" encry);}/*** md5加密*/private static…