首页 > 其他分享 >OpenHarmony—应用间HSP开发指导

OpenHarmony—应用间HSP开发指导

时间:2023-09-11 16:57:27浏览次数:51  
标签:OpenHarmony ets liba 指导 导出 HSP 应用 HAR

 应用间HSP用于不同应用间的代码、资源共享。 应用间HSP的宿主应用是一种特殊状态的应用,只能由一个HSP组成,不会独立运行在设备上,而是被普通应用模块的依赖项引用。当普通应用运行时,通过动态调用的方式使用应用间HSP提供的能力,从而实现应用自身所需要的功能。

注意事项

1.  应用间HSP的代码会运行在开发者应用的进程中,调用相关代码时,需要做好异常捕获与容错处理,防止由于应用间HSP功能异常导致的稳定性问题。

2.  一个应用可以同时依赖多个应用间HSP。

3.  应用间HSP会影响开发者应用自身的启动时间,依赖过多的应用间HSP可能会导致启动时延发生明显的劣化,建议将依赖的数目控制在16个以内。

4.  应用间HSP安装时需要对特权权限进行校验,如果想要开发应用间HSP,需要配置allowAppShareLibrary应用特权,具体配置方式参考应用特权配置指南

应用间HSP的使用

应用间HSP会分为两部分对外发布:

一部分为HAR,HAR包中不会包含具体的功能实现代码,而仅仅包含导出的对象与方法,所以体积很小。应用开发者将HAR包集成到自身的工程中,然后就可以通过调用HAR包中提供的对象与方法完成自身的应用功能。

另外一部分为HSP,这部分为应用间HSP的具体实现,里面包含js/ts代码、C++库、资源和配置文件。这部分会上架到应用市场或者集成到系统版本中。

集成应用间HSP的HAR

HAR中的index.ets文件是应用间HSP导出的声明文件的入口,所有需要导出的接口,统一在index.ets文件中定义。index.ets文件路径如下:

 

liba
├── src
│   └── main
│       ├── ets
│       │   ├── pages
│       │   └── index.ets
│       ├── resources
│       └── module.json5
└── oh-package.json5
 

  

对外暴露的接口,需要在入口文件index.ets中声明:

index.ets内容样例如下:

 

// liba/src/main/ets/index.ets
export { hello, foo1, foo2, nativeMulti, UIComponent } from './ui/MyUIComponent'
 

  

其中UIComponent为导出的ArkUI组件,hello()、foo1()与foo2()为应用间HSP导出的ts方法,nativeMulti()方法为应用间HSP导出的native方法。具体实现如下:

ArkUI组件

在HSP中ArkUI组件的具体实现样例:

 

// liba/src/main/ets/ui/MyUIComponent.ets
@Component
export struct UIComponent {
  @State message: string = 'Hello World'
  build() {
    Column() {
      Text(this.message)
        .fontSize(32)
        .padding(8)
        .fontColor(0xffffff)
        .backgroundColor(0x0000ff)
    }.padding(8).width('100%')
  }
}
 

 

  

ts方法

在HSP中ts方法的具体实现:

// liba/src/main/ets/ui/MyUIComponent.ets
export function hello(name: string): string {
  return "hello + " + name;
}

export function foo1() {
  return "foo1";
}

export function foo2() {
  return "foo2";
}
 

  

native方法

在HSP中也可以包含C++编写的so。对于so中的native方法,HSP通过间接的方式导出,以导出libnative.so的乘法接口multi为例:

 

// liba/src/main/ets/ui/MyUIComponent.ets
import native from "libnative.so"

export function nativeMulti(a: number, b: number) {
    let result: number = native.multi(a, b);
    return result;
}
 

  

使用HAR导出的能力

引用HAR前,需要先配置对HAR的依赖,配置方式可参考文档。HAR配置成功后,在配置模块的module.json5中会生成相关依赖项信息,如下所示:

 

"dependencies": [
      {
        "bundleName": "com.share.liba",
        "moduleName": "liba",
        "versionCode": 10001
      }
]
 

  

其中bundleName为应用间HSP的bundle名称,moduleName为应用间HSP的模块名称,versionCode为应用间HSP的版本号。

使用HAR中的ArkUI组件

HAR的依赖配置成功后,可以引用HAR的ArkUI组件。ArkUI组件的导入方式与ts的导入方式一致,通过import引入HAR导出的ArkUI组件,示例如下所示:

 

import { UIComponent } from 'liba'

@Entry
@Component
struct Index {
  @State message: string = 'Hello World'
  build() {
    Row() {
      // 引用HAR的ArkUI组件
      UIComponent()
      Column() {
        Text(this.message)
          .fontSize(50)
          .fontWeight(FontWeight.Bold)
      }
      .width('100%')
    }
    .height('100%')
  }
}
 

  

使用HAR中的ts方法

通过import引用HAR导出的ts类和方法,示例如下所示:

 

import { foo1 } from 'liba'
import { foo2 } from 'liba'

@Component
struct Index {
  build() {
    Row() {
      Column() {
        Button('Button')
          .onClick(()=>{
            // 引用HAR的ts方法
            foo1();
            foo2();
        })
      }
      .width('100%')
    }
    .height('100%')
  }
}
 

  

使用HAR中的native方法

通过import引用HAR导出的native方法,示例如下所示:

 

import { nativeMulti } from 'liba'

@Component
struct Index {
  build() {
    Row() {
      Column() {
        Button('Button')
          .onClick(()=>{
            // 引用HAR的native方法
            nativeMulti();
        })
      }
      .width('100%')
    }
    .height('100%')
  }
}
 

  

应用间HSP的分发方式(仅对系统应用开放)

应用间HSP由于并未直接完整的集成到开发者应用中去,所以需要提前预置在系统版本中或者随开发者应用同步安装到设备上,主要有以下两种形式:

1.  随系统发布,部分常用应用间HSP会预置在系统版本中。

2.  随应用发布,即用户在应用市场下载应用时,如果应用依赖了一个或者多个应用间HSP,同时设备上没有安装这个其依赖的应用间HSP时,应用市场会为用户同时下载普通应用以及其依赖的应用间HSP。从而保证普通应用能够正常使用共享库的功能。

应用间HSP的调试方式

开发者本地调试应用间HSP相关的功能时,可能并不具备上述分发的条件,此时可以通过bm相关指令本地完成应用间HSP的分发,主要步骤如下:

1.  获取到应用间HSP的安装包。

2.  通过bm指令先安装应用间HSP的安装包。

 

bm install -s sharebundle.hsp
 

  

3.  通过bm指令后安装开发者自身的应用hap。

 

bm install -p feature.hap
 

  

4.  启动开发者自身的应用,调试相关功能。

注意:步骤2和步骤3不可以颠倒,否则会由于缺少必要的应用间HSP导致开发者的应用安装失败。更多bm相关指令可以参考文档

标签:OpenHarmony,ets,liba,指导,导出,HSP,应用,HAR
From: https://www.cnblogs.com/openharmony/p/17693909.html

相关文章

  • HarmonyOS/OpenHarmony(Stage模型)应用开发组合手势(三)互斥识别
    互斥识别组合手势对应的GestureMode为Exclusive。互斥识别组合手势中注册的手势将同时进行识别,若有一个手势识别成功,则结束手势识别,其他所有手势识别失败。以在一个Column组件上绑定单击手势和双击手势组合而成的互斥识别组合手势为例,由于单击手势只需要一次点击即可触发而双击手势......
  • 【转载】关于如何处理你失业后的情绪的指导
    本文节选自著名求职指导书籍《你的降落伞是什么颜色》,对找不到工作心急如焚的人同样有用。序言失业使得人们在精神上付出了沉重的代价。在最近一个研究中,研究人员访问了6000名求职者,每周采访他们,跟踪采访了两年,发现:失业时间越长的人越容易泄气;失业的时间越长,越容易悲伤,在他的......
  • 上海市发改委党组副书记阮青一行莅临零数科技调研指导
    9月1日下午,上海市发展改革委党组副书记、副主任阮青一行莅临零数科技考察调研,市发改委高技术产业处处长翁轶丛、市发展改革研究院总经济师王晓艳、市发改委长三角一体化发展处副处长黄超明、上海区块链技术协会会长王奕等陪同调研。零数科技创始人兼CEO林乐博士、副总裁刘波等高管......
  • HarmonyOS/OpenHarmony(Stage模型)应用开发组合手势(二)并行识别
    并行识别组合手势对应的GestureMode为Parallel。并行识别组合手势中注册的手势将同时进行识别,直到所有手势识别结束。并行识别手势组合中的手势进行识别时互不影响。以在一个Column组件上绑定点击手势和双击手势组成的并行识别手势为例,由于单击手势和双击手势是并行识别,因此两个手......
  • 专访大连1号/连理卫星总指挥于晓洲:OpenHarmony在航天领域交出创新答卷
    2023年5月10日,长征七号遥七运载火箭在海南文昌发射场成功发射天舟六号货运飞船。由大连理工大学设计研制的辽宁省第一颗卫星,大连1号/连理卫星搭乘天舟六号货运飞船飞向太空。该卫星搭载OpenHarmony操作系统,能够在轨实现低成本亚米级高分辨率的海洋/对地观测。这款卫星成功“上天......
  • “连理”升空 OpenHarmony开启国产卫星系统星辰大海 
    在大连理工大学的实验室里,于晓洲说:“作为大连理工大学发射的第一颗卫星,同时也是辽宁省发射的第一颗卫星,其承载的新技术是一次机遇与挑战。”5月10日,天舟六号货运飞船在长征七号运载火箭的搭载下,扶摇而上奔赴空间站,发射任务取得圆满成功。由大连理工大学运载工程与力学学部航空航......
  • HarmonyOS/OpenHarmony(Stage模型)应用开发组合手势(一)连续识别
    组合手势由多种单一手势组合而成,通过在GestureGroup中使用不同的GestureMode来声明该组合手势的类型,支持连续识别、并行识别和互斥识别三种类型。00001. GestureGroup(mode:GestureMode,...gesture:GestureType[])mode:必选参数,为GestureMode枚举类。用于声明该组合手势的类型。ge......
  • OpenHarmony南向开发培训第四次作业(D9案例数据上云)
    首先,要实现Bearpi(Hi3861)的数据上云,我们要先了解bearpi的上云案例是怎么运行的这里我选取的是D9_iot_cloud_oc_manhole_cover这个案例那么既然是上云,我们肯定要先链接平台,而在案例里链接平台的函数是staticintCloudMainTaskEntry(void)你就记住你什都不用改,要改什么会在文章最后......
  • OpenHarmony应用开发之自定义弹窗
     本文转载自《OpenHarmony应用开发之自定义弹窗》,作者:zhushangyuan_应用场景在应用的使用和开发中,弹窗是一个很常见的场景,自定义弹窗又因为极高的自由度得以广泛应用。本文以橘子购物中一个应用更新提示的弹窗介绍OpenHarmony的自定义弹窗。 接口自定义弹窗官方文档:自定......
  • OpenHarmony南向开发培训第三次作业
    Linux命令创建文件(touch)创建文件:toucha.txt创建多个文件: toucha.txtb.txt创建目录(mkdir)创建文件夹:mkdirm创建多级文件夹:mkdir-pm/n删除文件(rm)删除文件:rma.txt删除文件夹 :rm-rm删除都可用:rm-rxxx拷贝(cp)将文件拷贝到文件夹:cpa.txtc将文件夹拷贝到文......