前语
所谓同享包,和Android中的Library本质是一样的,意图是为了完成代码和资源的同享,在HarmonyOS中,给开发者提供了两种同享包,HAR(HarmonyArchive)静态同享包,和HSP(HarmonySharedPackage)动态同享包。
两者的差异是,HAR静态同享包中的代码和资源跟从运用方编译,假如有多个运用方,它们的编译产品中会存在多份相同复制;而HSP动态同享包中的代码和资源能够独立编译,运转时在一个进程中代码也只会存在一份,如下图所示:
之所以会呈现HSP动态同享包,意图主要解决如下问题:
1、多个HAP引证相同的HAR,导致的APP包巨细胀大问题。
2、多个HAP引证相同的HAR,HAR中的一些状态变量无法同享的问题。
假如说,仅用于运用内部代码、资源的同享,建议运用动态同享包,假如想作为运用模块的依靠项被引证,就能够挑选静态同享包,在之后得开发中,我们能够根据实践的事务需求进行挑选性运用。
本章的内容大致如下:
1、怎样创立一个同享包
2、动态同享包(library)手动依靠
3、动态同享包用指令办法依靠
4、动态同享包多种办法调用
5、动态同享包注意事项
6、总结
一、怎样创立一个同享包
在当前工程项目名,右键,挑选New,然后挑选Module即可,这儿我在Demo工程里进行创立,详细怎样创立工程项目,这儿就不赘述了,前边现已叙述过了,究竟太简略了。
默认的有两种同享包模板,一种是动态同享包,一种是静态同享包,如下图。
设置同享包姓名,点击Finish。
动态同享包创立结束之后,结构如下图,其type类型为shared,假如你创立的是静态同享包,这儿的类型便是har。
二、动态同享包(library)手动依靠
通过第一步的操作,咱们现已在Demo工程中,创立了一个动态同享包,如下图所示,现在有主Module,entry和动态同享包sharelibrary。
entry假如想要调用sharelibrary中的代码或资源,那么必须让entry关联上sharelibrary,关联办法和Android中类似。
1、依靠办法一
在entry中的oh-package.json5文件中,在dependencies中引进同享包sharelibrary,记住格局:
【“folder”:”file:../folder”】,后面的folder便是你自己创立的同享包,至于前边的folder,是用来生成的映射目录,姓名能够和同享包姓名共同,也能够不共同。
引进之后,进行同步项目,点击SyncNow即可,当然了你能够能够,将鼠标放置在报错处会呈现提示,在提示框中点击Run’ohpminstall’。
履行以上功能之后,就会映射到主Module,entry的oh_modules目录下:
2、依靠办法二
除了依靠办法一之外,也能够采纳如下的依靠办法,也便是【”@xx/xx”:”file:../sharelibrary”】的办法,也是能够的,其原理和依靠办法一的格局一样,差异便是,会在oh_modules目录中创立一个@xx目录。
按照如上办法履行之后,会发现,已在oh_modules中,新建了一个”@ohos目录“,里边是映射的同享包。
三、动态同享包用指令办法依靠
上述,咱们通过手动更改oh-package.json5文件完成了同享包的依靠,除了手动之外,咱们也能够动过指令的办法进行完成,指令行中或在IDETerminal窗口中,目录进入到主模块下,履行ohpminstall../folder指令即可,folder是你的同享包,如下图所示:
指令履行结束之后,就会自动的在oh-package.json5里增加依靠,并生成映射文件。
四、动态同享包多种办法调用
1、办法调用
上述创立的同享包sharelibrary中,有一个东西类Calc,里边有一个简略的求和办法add,那么在entry中怎样调用sharelibrary中的add办法呢?
其实很是简略,和Android项目一样,引进library之后,你能够调用同享包中的资源或许代码了,比方咱们完成调用add办法,如下:
需要注意得是导包,正常情况下,当你打出add办法,会有提示导包,直接承认导包即可,假如没有,能够手动进行导包,导包得途径和你映射的地址基本上是一一对应的,比方,你选用的是@xx/xx的办法,导包就如下:
上面的案例是一个很简略的调用,给文字设置点击事情,直接调用同享包sharelibrary中,东西类Calc中的add办法。
现在形似一切都没有问题,究竟办法一切调用正常,咱们直接运转至模拟器中检查,当然了,你也能够直接运转至HarmonyOS手机上,成果发现报错了,如下所示:
报错的原因便是,咱们未履行布置多个包,究竟在主模块后咱们又创立了一个同享包,解决如下:
挑选运转模块,点击EditConfigurations:
挑选DeployMultiHap标签页,勾选DeployMultiHapPackages,挑选咱们的同享包即可:
再次运转,就能够运转正常了:
咱们点击文字之后,就能够再控制台检查到,调用add求和办法之后的值了:
2、类的调用
上面的案例是怎样调用同享包中的办法,那么同享包假如有一个东西类,咱们该怎样调用呢?
这儿我简略的创立了一个日志东西类,记住需要用export关键字进行对外露出。
运用和上述的办法流程共同,因为设置的是静态的办法,直接调用即可:
3、组件的调用
组件的调用和类的调用是共同的,如下,我界说了一个简略的文本组件,记住运用export关键字,进行对外露出。
@Component
export struct TextWidget {
@State message: string = '我是一个测试的文本'
build() {
Text(this.message)
.fontSize(20)
.fontWeight(FontWeight.Bold)
}
}
运用办法如下,就能够把TextWidget作为一个组件进行调用。
import { add, Log ,TextWidget} from "sharelibrary"
@Entry
@Component
struct Index {
@State message: string = 'Hello World'
build() {
Row() {
Column() {
TextWidget()
Text($r('app.string.app_name'))
.fontSize(20)
.fontWeight(FontWeight.Bold)
.onClick(() => {
var number = add(100, 100)
Log.log("求和", ""+number)
})
}
.width('100%')
}
.height('100%')
}
}
4、跳转同享包内的页面
现在同享包中现已有了一个页面Index,为了便于差异,咱们把里边的展示内容改为:“Hellosharelibrary”
在entry模块中,咱们就能够如下进行跳转,url格局为:’@bundle:包名/模块名/途径/页面地点的文件名(不加.ets后缀)’,详细跳转如下:
router.pushUrl({
url: '@bundle:com.example.demo/sharelibrary/ets/pages/Index'
}).then(() => {
console.log("push page success");
}).catch(err => {
console.error(`pushUrl failed, code is ${err.code}, message is ${err.message}`);
})
详细效果如下:
5、怎样运用同享包中的资源
已然作为一个同享包,要给到其他模块共用,除了代码上复用之外,剩余的便是资源了,查了许多资料和文档,怎样把resources露出出去,这可难住了,能够很负责任的告诉我们,HarmonyOS现在还不支撑,这一点和Android中Library仍是有很大的差异,那怎样完成呢?
完成起来也是非常的简略,已然资源不能露出,类和办法是能够露出的啊,也便是我们能够把资源中的属性,通过东西类做一层中转即可。
1、界说资源
在同享包中我界说了一个很简略的字符串资源,当然了你也能够界说其他类型的资源,比方数字,图片,音视频等等。
2、界说东西类
东西类需要注意,结尾是ets类型,这是为了能够拿到Resource。
3、调用
导包后直接调用即可。
五、动态同享包注意事项
对外露出的接口,需要在同享包进口文件index.ets中声明,否则,其他模块无法调用,都是固定的形式,比方上述的add办法,和自界说的组件等,牢记!!!
同一个类中的,假如多个办法,能够复用,比方:
export { Log, add, minus } from './utils/test'
假如无法运转,报如下过错,请返回第四小节中的办法调用小节,检查完整的解决办法。
六、总结
仍是那句话,假如说,仅用于运用内部代码、资源的同享,建议运用动态同享包,假如想作为运用模块的依靠项被引证,就能够挑选静态同享包。