
在鸿蒙生态中一个应用从源代码到用户手机上的图标会经历一个从工程代码到编译产物再到上架分发的完整形态转变。理解过程中涉及的核心包结构——AppApplication Package、HAPHarmony Ability Package、HARHarmony Archive和HSPHarmony Shared Package是进行模块化开发和应用架构设计的基石。它们之间的关系可以简单概括为HAP是应用运行的基本单元HAR和HSP是代码复用的两种方式而App则是最终上架市场的发布形态。1. App Pack上架市场的最终形态App Pack以.app为后缀是鸿蒙应用上架到应用市场的唯一发布形态。它本身是一个“打包集合”不能在设备上直接安装运行。一个App Pack中通常包含一个或多个HAP文件Entry类型必须有一个Feature类型可有多个以及可能存在的HSP文件。同时它还会附带一个pack.info文件用于描述包内每个HAP和HSP的属性信息。核心要点App Pack是面向分发市场的而HAP/HSP才是面向设备安装和运行的实际单元。2. HAP应用安装与运行的基本单元HAPHarmony Ability Package是鸿蒙应用安装和运行的基础单位。它包含编译后的代码、资源文件和配置文件。一个应用必须至少包含一个HAP。根据功能和角色的不同HAP分为两种类型2.1 Entry 类型角色应用的主模块是应用的唯一入口。要求对于同一种设备类型一个App中有且只有一个Entry类型的HAP。功能通常包含应用的主界面、桌面图标以及启动图标提供应用的基础核心功能。2.2 Feature 类型角色应用的动态特性模块用于扩展应用能力。数量一个App可以包含零个、一个或多个Feature类型的HAP。核心价值按需加载和跨设备适配。按需加载通过将deliveryWithInstall配置为falseFeature HAP不会在应用首次安装时下载而是在用户需要用到特定功能时才从应用市场动态获取从而有效减小应用的初始安装包大小。例如一个电商App可以将直播功能设计为Feature HAP用户点击直播入口时才触发下载安装。跨设备适配可以根据不同设备如手机、手表、车机的能力和硬件条件分发不同的Feature HAP实现灵活适配。特性Entry 类型 HAPFeature 类型 HAP作用应用主入口提供基础功能应用扩展功能按需使用数量限制同设备类型下仅1个0个或多个安装方式随应用一起安装可选择随应用安装或按需下载是否必须是否3. HAR vs HSP两种代码共享包在大型应用开发中模块化是核心思想。HAR和HSP正是实现代码、资源、组件在不同模块间复用的两种“共享包”。它们的本质区别在于编译和运行时的加载机制不同这直接决定了它们的使用场景。3.1 HARHarmony Archive静态共享包机制静态复用。HAR在编译时会将自身代码和资源完整地拷贝并打包到引用它的每个HAP或HSP包中。特点多副本如果有多个模块引用了同一个HAR那么每个模块的产物中都会有一份该HAR的独立副本导致应用包体积增大空间换时间。高效率由于代码在编译时已打入宿主包应用启动后使用时无需额外加载步骤直接调用效率极高。可发布HAR包可以独立发布到OHPMOpenHarmony Package Manager私仓或中心仓供其他应用甚至公司外部使用。适用场景基础工具库、UI组件库如网络请求封装、通用日期工具类、基础Button组件等。跨应用共享需要将能力发布给公司内部其他应用或三方开发者使用的场景。3.2 HSPHarmony Shared Package动态共享包机制动态复用。HSP在编译时会独立编译成一个单独的.hsp文件。当多个HAP引用同一个HSP时在设备上只存在一份该HSP的代码实例所有引用它的HAP在运行时共享这一份代码。特点单副本有效避免代码重复显著减小应用包体积时间换空间。按需加载HSP可以在运行时按需加载而不是在应用启动时全部加载可以优化应用的启动速度。随应用发布HSP目前主要支持应用内共享必须随宿主应用一起打包和发布不能独立分发。适用场景多个HAP/HSP共用的公共能力当多个模块都需要使用同一套稳定的公共UI组件、工具类或Native库时使用HSP能有效避免重复减小包体积。需要按需加载的大功能模块将一个不常用的但体积较大的功能封装为HSP可以实现按需加载优化启动性能。对比维度HAR静态共享包HSP动态共享包加载机制编译时打包进引用方多副本运行时动态加载单副本共享包体积影响多模块引用会导致包体积增大有效减小应用包体积加载性能无需额外加载使用效率高按需加载首次使用有微小性能损耗发布范围可发布到OHPM仓库跨应用共享主要支持应用内共享随App发布典型场景基础工具库、跨应用共享组件多模块共享的公共能力、按需加载的大模块总结与架构选择建议在实际项目架构中如何选择这几种包类型可以参考以下策略HAP是必需品任何应用都必须包含一个Entry类型的HAP作为入口。只有当应用功能足够复杂需要按需加载或跨设备差异化部署时才考虑拆分Feature类型的HAP。优先考虑HAR审慎使用HSP对于大多数代码复用场景特别是基础工具类和UI组件优先使用HAR因为它调试简单加载效率高。HSP虽然能节省空间但会引入版本依赖、调试复杂等问题应仅在多个模块确实需要共享同一份稳定代码如公共登录模块、支付模块时使用。组合策略当一个HAR被多个HAP或HSP依赖导致包体积增长过快时可以考虑将多个HAR组合并封装成一个HSP供其他模块统一引用从而在享受复用性的同时利用HSP的单副本特性减小包体积。