目录

HAR包使用常见问题排查

Q:每次是否都要先打包成HAR包再引用?

A:不需要每次先打包成HAR包再引用,可以直接引用源码,如entry模块需要依赖foo模块的源码方式如下。在需要引入本地模块源码的模块的oh-package.json5中设置源码依赖项,即entry模块的oh-package.json5中,添加如下配置:

"dependencies": {
    "foo": "file:path/to/foo"  // 此处也可以是以当前oh-package.json5所在目录为起点的相对路径
  },

Q:是否可以将java或jar文件打包成HAR包?

A:当前不支持将java或jar打包成HAR包。HAR包是静态共享包,可以包含ArkTs/ts代码、C++库、资源和配置文件。

Q:HAR包会被重复打包如HAR包中有so库,引用此HAR包的每个module都会拷贝一份此so库,造成包体积非常大,如何优化?

A:推荐将公共资源替换成HSP动态共享包。在多包场景下,如果应用的多个HAP或HSP包使用HAR包实现代码和资源的共享,那么打包后的每个HAP或HSP包中都会存在一份共享HAR包的拷贝,导致APP包中存在冗余代码和资源。如下图示例,应用模块HAP1和HAP2/HSP1都引用了HAR2和HAR3,打包后,APP包中HAR2和HAR3存在多份重复拷贝,体积较大。

这种场景下,推荐开发者使用HSP代替HAR实现代码和资源共享。如下图示例,使用HSP2对原应用进行升级改造,打包后,APP包中HAR2和HAR3只存在一份拷贝,HAR2、HAR3总大小大于HSP时,可以减小应用包大小。

Q:一个应用有多个模块,多个模块中引用同一个HAR包的不同版本是否有影响,怎么指定统一的版本?

A:没有影响,每个模块都会将各自的HAR包拷贝到自己的模块,不会影响其它模块。

ohpm客户端在1.4.0版本开始支持Override机制,可以在项目级别的oh-package.json5(即项目根目录下的oh-package.json5)文件中添加overrides配置,可以将HAR包指定统一的版本。替换的版本既可以是一个具体的版本号,也可以是一个模糊版本,还可以是本地存在的HAR包或源码目录。

overrides必须配置在项目级别的oh-package.json5中,配置在模块级别的oh-package.json5中将不会生效。

Q:一个应用存在多个HAR模块,例如存在模块HARA、模块HARB、模块HARC和模块HARD,HARB中依赖并引用了HARA,HARC中依赖并引用了HARB和HARA,HARD中依赖并引用了HARC、HARB和HARA,现在希望打包完成后的包中只包含一份HARA、HARB、HARC、HARD,避免生成的HAR包冗余重复,该如何实现?

A:

Q:多模块依赖场景下,如何直接打包最外层HAR包而无需逐层打包子模块HAR包?

A:在多模块工程中,模块间存在多层依赖关系(如模块A依赖模块B和模块C,模块B依赖模块D和模块E,模块E依赖模块F和模块G),若使用HAR包仓库管理依赖,需要从底层模块开始逐层打包HAR包并发布到仓库,再逐层修改依赖为HAR包版本号依赖,操作步骤繁琐且耗时。通过在oh-package.json5中使用@module依赖语法,可以将模块间的依赖关系声明为源码依赖,这样在打包最外层HAR包时,所有依赖模块的源码会自动编译并包含在最终HAR包中,无需逐层打包和发布子模块HAR包。

在需要依赖其他模块的模块的oh-package.json5中,将dependencies中的依赖项配置为@module语法。例如,项目中存在名称为Foo的模块(即build-profile.json5文件中modules节点下存在名称为Foo的模块),且该模块Foo的oh-package.json5中name为foo_test,则在依赖方的oh-package.json5中添加如下配置:

"dependencies": {
    "foo_test": "@module:Foo"
  },

通过这种方式,所有模块间依赖均以源码方式引用,直接打包最外层模块的HAR包即可,无需逐层构建和发布子模块HAR包。参考oh-package.json5配置说明。

Q:SDK的HAR包通过dependencies依赖了其他库,使用该SDK的应用即使不使用该依赖,最终产物包中也会自动包含该依赖的内容,如何解耦?

A:将不需要打包进最终产物的依赖配置在oh-package.json5的devDependencies字段中,而非dependencies字段中。devDependencies中声明的依赖仅在开发阶段使用,不会被打包进HAR包产物。参考oh-package.json5字段说明。如果SDK除了该依赖还有其他内容需要使用,但代码中不需要该依赖,则需要将整个HAR包打包进去。