HarmonyOS鸿蒙Next中entry能打成har吗(entry.har)

HarmonyOS鸿蒙Next中entry能打成har吗(entry.har)

4 回复

【解决方案】

新建项目的entry在module.json5中默认type为entry,只能打出来HAP包不能打包出HAR包,HAP包不能作为共享包给其它应用使用,需要使用HAR或集成态HSP,如果想把HAP转换为HAR也可以参考HAP转HAR指导

【背景知识】

HAP:是应用安装和运行的基本单元。HAP包是由代码、资源、第三方库、配置文件等打包生成的模块包,其主要分为两种类型:entry和feature。应用程序包可以只包含一个基础的entry包,也可以包含一个基础的entry包和多个功能性的feature包。

HAR:是静态共享包,可以包含代码、C++库、资源和配置文件。通过HAR可以实现多个模块或多个工程共享ArkUI组件、资源等相关代码。

  • 支持应用内共享,也可以发布后供其他应用使用。
  • 作为二方库,发布到OHPM私仓,供公司内部其他应用使用。
  • 作为三方库,发布到OHPM中心仓,供其他应用使用。
  • 多包(HAP/HSP)引用相同的HAR时,会造成多包间代码和资源的重复拷贝,从而导致应用包变大。

HSP:是动态共享包,可以包含代码、C++库、资源和配置文件,通过HSP可以实现代码和资源的共享。HSP不支持独立发布,而是跟随其宿主应用的APP包一起发布,与宿主应用同进程,具有相同的包名和生命周期。多个HAP/HSP共用的代码和资源放在同一个HSP中,可以提高代码、资源的可重用性和可维护性,同时编译打包时也只保留一份HSP代码和资源,能够有效控制应用包大小。

  • 应用内HSP:在编译过程中与应用包名(bundleName)强耦合,只能给某个特定的应用使用。
  • 集成态HSP:构建、发布过程中,不与特定的应用包名耦合;使用时,工具链支持自动将集成态HSP的包名替换成宿主应用包名,并且会重新签名生成一个新的HSP包,作为宿主应用的安装包,这个新的HSP也属于应用内HSP。

更多关于HarmonyOS鸿蒙Next中entry能打成har吗(entry.har)的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


不能

在HarmonyOS Next中,entry模块不能直接打包为entry.har。entry是应用的主模块,用于生成HAP(Harmony Ability Package)安装包。HAR(Harmony Archive)是静态共享包,通常由library模块打包生成,用于代码和资源的复用。

在HarmonyOS Next中,entry模块不能直接打包为HAR(Harmony Archive)

HAR是静态共享包,主要用于封装公共的代码、资源、C++库等,以便在多个模块间复用。而entry模块是应用的主模块,它承担着应用入口和核心功能集成的作用,其性质与HAR的定位有根本区别:

  1. 功能定位不同:entry是应用的编译和部署单元,包含Ability、页面等核心逻辑;HAR是代码和资源的复用单元,不包含Ability等入口组件。
  2. 构建限制:DevEco Studio的构建系统不支持将entry模块配置为HAR输出。在build-profile.json5中,只有"type": "har"的模块才会生成HAR文件,entry模块的类型固定为"type": "entry"
  3. 依赖关系:在HarmonyOS Next的Stage模型中,HAR可以被entry依赖,但entry不能被配置为其他模块的依赖项。如果将entry改为HAR,会破坏应用的正常编译和安装结构。

如果需要复用entry中的代码,正确的做法是:

  • 将需要共享的代码、资源或C++库抽取到独立的模块中,并将该模块的build-profile.json5中的type设置为"har"
  • 然后,在原来的entry模块和任何其他需要复用的模块中,通过dependencies引入这个HAR。

例如,共享工具类:

  • 创建模块library,类型设为har,放入工具类Utils.ets
  • 在entry的build-profile.json5中配置:"dependencies": [ "library" ]
  • 这样,entry和未来其他模块都能通过import { Utils } from 'library'来使用。

总之,entry本身不能打包为HAR,但可以通过抽取公共部分到独立HAR来实现代码复用。

回到顶部