HarmonyOS 要点笔记之包结构与模块HAP、HSP、HAR(Stage模型)

565 阅读3分钟

序言

本篇文章,将基于开发者文档,对鸿蒙包结构相关内容进行浓缩总结

以下内容基于Stage模型(HarmonyOS 3.1 Developer Preview版本新增),FA模型在目前已经不再主推。

阅读本文前,最好对基本的鸿蒙Stage模型开发知识有所了解,包括UIAbilityPageComponent的基本概念等。

应用程序包定义和特性

  • 操作系统之上运行的程序简称应用,一个应用对应软件包文件称为应用程序包
  • 应用程序包由可执行代码、资源、三方库等文件整合而成,便于应用部署
  • 应用包屏蔽系统平台差异(x86、ARM、32位、64位)等
  • 提供包信息(应用版本、应用名称、组件、申请权限等),包管理提供接口供开发者在程序中查询
  • 媒体资源、原生资源、字符资源以及国际化资源等,包管理将资源归档并形成索引

多模块(Module)机制

模块化开发:原生提供模块化机制,方便我们将不同的功能特性按模块来划分和管理。

多设备适配:每一个module支持标注其支持的设备类型,应用市场分发时,将不同的module组合部署到对应的设备上,新建module后,其module.json5中默认支持3种类型

"deviceTypes": [
  "phone",
  "tablet",
  "2in1",
  "car" // next新增
]

Module类型和结构

包结构分类.png 包结构.png 两图胜千言,包有两个形态,开发态对应我们在编译器新建的一个个module,它们编译后最终形态成为hap、hsp、har的包。也就是模块是同一个东西的两种存在形式。

第二张图中,我们新建项目,不管是Application类型还是AtomicService类型都会存在红框1的目录结构,也就是项目必须自带一个唯一的entry类型的hap

之后,我们可以根据项目的模块化需要,新建独立的feature类型的hap,以及其他共享库har或hsp

hap、hsp、har区分和记忆

先说记忆方法,三个包类型缩写中的p原意是package,记忆时候可以把它们关联为page。为什么是page呢?因为har静态库不支持在配置文件中声明pages页面,但是可以包含pages页面,并通过命名路由的方式进行跳转。我们可以记忆为只有hap、hsp可以声明pages页面。然后,hap、hsp中,a代表Ability,所以默认的程序包是hap(一个entry类型,0或多个feature类型),hsp是动态库,且不支持Ability。这样可以强化记忆他们的特点和区别。

如图:Entry的hap中结构有pages配置(feature的hap相同) 包结构pages_entry.png 动态库hsp中结构有pages配置 包结构pages_hsp.png 静态库har没有pages配置 包结构pages_har.png

强调一遍,har中不能包含pages配置声明,但是可以包含page页面,通过命名路由跳转。

补充,Library类型的hsp、har,在编译上存在差别,har会被多个引用他的地方拷贝,存在重复。这也是他叫做静态库的原因。因为har编译的时候会被拷贝到每一个使用它的地方。固定在那个包里面。而动态库是所有使用hsp的地方,共享同一份。 harhsp区别.png 还有一个关键点是,hsp模块编译后除了会生成一个.hsp文件,还会生成一个.har文件。这个.har文件中包含了HSP对外导出的接口,应用中的其他模块需要通过.har文件来引用HSP的功能。 其他的,想到在补充吧。