序言
本篇文章,将基于开发者文档,对鸿蒙包结构相关内容进行浓缩总结
。
以下内容基于Stage
模型(HarmonyOS 3.1 Developer Preview版本新增),FA
模型在目前已经不再主推。
阅读本文前,最好对基本的鸿蒙Stage模型开发知识
有所了解,包括UIAbility
、Page
、Component
的基本概念等。
应用程序包定义和特性
- 操作系统之上运行的程序简称应用,一个应用对应软件包文件称为
应用程序包
- 应用程序包由
可执行代码、资源、三方库等文件
整合而成,便于应用部署 - 应用包屏蔽系统平台差异(x86、ARM、32位、64位)等
- 提供包信息(应用版本、应用名称、组件、申请权限等),
包管理
提供接口供开发者在程序中查询 - 媒体资源、原生资源、字符资源以及国际化资源等,
包管理
将资源归档并形成索引
多模块(Module)机制
模块化开发:原生提供模块化机制,方便我们将不同的功能特性按模块来划分和管理。
多设备适配:每一个module支持标注其支持的设备类型,应用市场分发时,将不同的module组合部署到对应的设备上,新建module后,其module.json5中默认支持3种类型
"deviceTypes": [
"phone",
"tablet",
"2in1",
"car" // next新增
]
Module类型和结构
两图胜千言,包有两个形态,开发态对应我们在编译器新建的一个个
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相同)
动态库hsp中结构有pages配置
静态库har没有pages配置
强调一遍,har
中不能包含pages配置声明,但是可以包含page页面,通过命名路由跳转。
补充,Library类型的hsp、har
,在编译上存在差别,har会被多个引用他的地方拷贝,存在重复。这也是他叫做静态库的原因。因为har编译的时候会被拷贝到每一个使用它的地方。固定在那个包里面。而动态库是所有使用hsp的地方,共享同一份。
还有一个关键点是,hsp模块编译后除了会生成一个.hsp文件,还会生成一个.har文件。这个.har文件中包含了HSP对外导出的接口,应用中的其他模块需要通过.har文件来引用HSP的功能。
其他的,想到在补充吧。