前语

所谓同享包,和Android中的Library本质是一样的,意图是为了完成代码和资源的同享,在HarmonyOS中,给开发者提供了两种同享包,HAR(HarmonyArchive)静态同享包,和HSP(HarmonySharedPackage)动态同享包

两者的差异是,HAR静态同享包中的代码和资源跟从运用方编译,假如有多个运用方,它们的编译产品中会存在多份相同复制;而HSP动态同享包中的代码和资源能够独立编译,运转时在一个进程中代码也只会存在一份,如下图所示:

HarmonyOS开发:探索动态共享包的依赖与使用

之所以会呈现HSP动态同享包,意图主要解决如下问题:

1、多个HAP引证相同的HAR,导致的APP包巨细胀大问题。

2、多个HAP引证相同的HAR,HAR中的一些状态变量无法同享的问题。

假如说,仅用于运用内部代码、资源的同享,建议运用动态同享包,假如想作为运用模块的依靠项被引证,就能够挑选静态同享包,在之后得开发中,我们能够根据实践的事务需求进行挑选性运用。

本章的内容大致如下:

1、怎样创立一个同享包

2、动态同享包(library)手动依靠

3、动态同享包用指令办法依靠

4、动态同享包多种办法调用

5、动态同享包注意事项

6、总结

一、怎样创立一个同享包

在当前工程项目名,右键,挑选New,然后挑选Module即可,这儿我在Demo工程里进行创立,详细怎样创立工程项目,这儿就不赘述了,前边现已叙述过了,究竟太简略了。

HarmonyOS开发:探索动态共享包的依赖与使用

默认的有两种同享包模板,一种是动态同享包,一种是静态同享包,如下图。

HarmonyOS开发:探索动态共享包的依赖与使用

设置同享包姓名,点击Finish。

HarmonyOS开发:探索动态共享包的依赖与使用

动态同享包创立结束之后,结构如下图,其type类型为shared,假如你创立的是静态同享包,这儿的类型便是har

HarmonyOS开发:探索动态共享包的依赖与使用

二、动态同享包(library)手动依靠

通过第一步的操作,咱们现已在Demo工程中,创立了一个动态同享包,如下图所示,现在有主Module,entry和动态同享包sharelibrary

HarmonyOS开发:探索动态共享包的依赖与使用

entry假如想要调用sharelibrary中的代码或资源,那么必须让entry关联上sharelibrary,关联办法和Android中类似。

1、依靠办法一

在entry中的oh-package.json5文件中,在dependencies中引进同享包sharelibrary,记住格局:

“folder”:”file:../folder”】,后面的folder便是你自己创立的同享包,至于前边的folder,是用来生成的映射目录,姓名能够和同享包姓名共同,也能够不共同。

HarmonyOS开发:探索动态共享包的依赖与使用

引进之后,进行同步项目,点击SyncNow即可,当然了你能够能够,将鼠标放置在报错处会呈现提示,在提示框中点击Run’ohpminstall’。

HarmonyOS开发:探索动态共享包的依赖与使用

履行以上功能之后,就会映射到主Module,entry的oh_modules目录下:

HarmonyOS开发:探索动态共享包的依赖与使用

2、依靠办法二

除了依靠办法一之外,也能够采纳如下的依靠办法,也便是【”@xx/xx”:”file:../sharelibrary”】的办法,也是能够的,其原理和依靠办法一的格局一样,差异便是,会在oh_modules目录中创立一个@xx目录。

HarmonyOS开发:探索动态共享包的依赖与使用

按照如上办法履行之后,会发现,已在oh_modules中,新建了一个”@ohos目录“,里边是映射的同享包。

HarmonyOS开发:探索动态共享包的依赖与使用

三、动态同享包用指令办法依靠

上述,咱们通过手动更改oh-package.json5文件完成了同享包的依靠,除了手动之外,咱们也能够动过指令的办法进行完成,指令行中或在IDETerminal窗口中,目录进入到主模块下,履行ohpminstall../folder指令即可,folder是你的同享包,如下图所示:

HarmonyOS开发:探索动态共享包的依赖与使用

指令履行结束之后,就会自动的在oh-package.json5里增加依靠,并生成映射文件。

HarmonyOS开发:探索动态共享包的依赖与使用

四、动态同享包多种办法调用

1、办法调用

上述创立的同享包sharelibrary中,有一个东西类Calc,里边有一个简略的求和办法add,那么在entry中怎样调用sharelibrary中的add办法呢?

HarmonyOS开发:探索动态共享包的依赖与使用

其实很是简略,和Android项目一样,引进library之后,你能够调用同享包中的资源或许代码了,比方咱们完成调用add办法,如下:

HarmonyOS开发:探索动态共享包的依赖与使用

需要注意得是导包,正常情况下,当你打出add办法,会有提示导包,直接承认导包即可,假如没有,能够手动进行导包,导包得途径和你映射的地址基本上是一一对应的,比方,你选用的是@xx/xx的办法,导包就如下:

HarmonyOS开发:探索动态共享包的依赖与使用

上面的案例是一个很简略的调用,给文字设置点击事情,直接调用同享包sharelibrary中,东西类Calc中的add办法。

现在形似一切都没有问题,究竟办法一切调用正常,咱们直接运转至模拟器中检查,当然了,你也能够直接运转至HarmonyOS手机上,成果发现报错了,如下所示:

HarmonyOS开发:探索动态共享包的依赖与使用

报错的原因便是,咱们未履行布置多个包,究竟在主模块后咱们又创立了一个同享包,解决如下:

挑选运转模块,点击EditConfigurations

HarmonyOS开发:探索动态共享包的依赖与使用

挑选DeployMultiHap标签页,勾选DeployMultiHapPackages,挑选咱们的同享包即可:

HarmonyOS开发:探索动态共享包的依赖与使用

再次运转,就能够运转正常了:

HarmonyOS开发:探索动态共享包的依赖与使用

咱们点击文字之后,就能够再控制台检查到,调用add求和办法之后的值了:

HarmonyOS开发:探索动态共享包的依赖与使用

2、类的调用

上面的案例是怎样调用同享包中的办法,那么同享包假如有一个东西类,咱们该怎样调用呢?

这儿我简略的创立了一个日志东西类,记住需要用export关键字进行对外露出。

HarmonyOS开发:探索动态共享包的依赖与使用

运用和上述的办法流程共同,因为设置的是静态的办法,直接调用即可:

HarmonyOS开发:探索动态共享包的依赖与使用

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”

HarmonyOS开发:探索动态共享包的依赖与使用

在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}`);
            })

详细效果如下:

HarmonyOS开发:探索动态共享包的依赖与使用

5、怎样运用同享包中的资源

已然作为一个同享包,要给到其他模块共用,除了代码上复用之外,剩余的便是资源了,查了许多资料和文档,怎样把resources露出出去,这可难住了,能够很负责任的告诉我们,HarmonyOS现在还不支撑,这一点和Android中Library仍是有很大的差异,那怎样完成呢?

完成起来也是非常的简略,已然资源不能露出,类和办法是能够露出的啊,也便是我们能够把资源中的属性,通过东西类做一层中转即可。

1、界说资源

在同享包中我界说了一个很简略的字符串资源,当然了你也能够界说其他类型的资源,比方数字,图片,音视频等等。

HarmonyOS开发:探索动态共享包的依赖与使用

2、界说东西类

东西类需要注意,结尾是ets类型,这是为了能够拿到Resource。

HarmonyOS开发:探索动态共享包的依赖与使用

3、调用

导包后直接调用即可。

HarmonyOS开发:探索动态共享包的依赖与使用

五、动态同享包注意事项

对外露出的接口,需要在同享包进口文件index.ets中声明,否则,其他模块无法调用,都是固定的形式,比方上述的add办法,和自界说的组件等,牢记!!!

HarmonyOS开发:探索动态共享包的依赖与使用

同一个类中的,假如多个办法,能够复用,比方:

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

假如无法运转,报如下过错,请返回第四小节中的办法调用小节,检查完整的解决办法。

HarmonyOS开发:探索动态共享包的依赖与使用

六、总结

仍是那句话,假如说,仅用于运用内部代码、资源的同享,建议运用动态同享包,假如想作为运用模块的依靠项被引证,就能够挑选静态同享包