鸿蒙 6.0 应用开发面试——应用程序包问题
HAR 与 HSP 包的区别是什么?
HAR(静态共享包)编译时打包:代码和资源在构建阶段被完整复制到每个依赖它的 HAP 中。启动即加载:随应用启动直接载入内存,调用时无额外开销。适用场景:少量模块引用、对加载速度敏感的场景(如基础工具库)。
HSP(动态共享包)运行时共享:仅存储一份实例,多个 HAP 在运行时动态加载同一份 HSP。按需加载:首次调用需查找、初始化,有性能损耗但避免重复拷贝。适用场景:被大量 HAP 引用的公共模块(如 UI 组件库),可显著减少包体积。
HSP 打包后,为什么会生成 HAR 包,它是否会导致 App 包大小膨胀?
HSP 编译生成的 HAR 包仅包含配置文件和接口定义,不包含代码逻辑。该 HAR 包仅用于开发阶段,不会影响 App 包的大小。
从包管理的角度,保证代码安全的措施有哪些?
- 编译:编译时,HAR 和 HSP 支持代码混淆。
- 打包:打包时为每个 HSP/HAP 单独签名,签名后的应用才允许安装。
- 安装:终端设备上的应用市场用于安装和卸载应用,不支持其他安装方式。
- 运行时:提供应用沙箱机制,这是一种以安全防护为目的的隔离机制,防止数据遭受恶意路径穿越访问。
HSP/HAR 包中如何引用外部编译的 so 库文件?
- 在 src/main/cpp/CMakeLists.txt 文件中链接 so 库文件。例如:
target_link_libraries(entry PUBLIC libxxx) libxxx.so库文件放入 HAR 或 HSP 的 libs/arm64-v8a 目录。设备类型不同时,需添加对应子目录。新版的 arm64 为 libs/arm64-v8a,老版的 arm64 为 libs/armeabi-v7a,x86 模拟器为 libs/x86_64。
如何判断应用可被卸载?
- 使用 bundleManager.getApplicationInfo 获取应用程序信息。
- ApplicationInfo 具有 removable 属性,可用于判断应用是否可卸载。
Entry 模块的 HAP 和 Feature 模块的 HAP 在使用和功能上的区别是什么?
- Entry 类型的 HAP:是应用的主模块,在 module.json5 配置文件中的 type 标签配置为'entry'类型。在同一个应用中,同一设备类型只支持一个 Entry 类型的 HAP,通常用于实现应用的入口界面、入口图标、主特性功能等。
- Feature 类型的 HAP:是应用的动态特性模块,在 module.json5 配置文件中的 type 标签配置为'feature'类型。一个应用程序包可以包含一个或多个 Feature 类型的 HAP,也可以不包含;Feature 类型的 HAP 通常用于实现应用的特性功能,可以配置成按需下载安装,也可以配置成随 Entry 类型的 HAP 一起下载安装。
HSP 包编译之后会生成什么文件?
HSP 包编译后会生成.hsp 文件和.har 文件。.hsp 文件用于安装,.har 文件仅暴露接口,不包含具体实现。HSP 包中导出的方法头文件位于.har 文件中,实现在.hsp 文件中。
HAR 如何转换为 HSP?
HAR 转为 HSP 主要是通过修改配置文件实现。具体步骤如下:
- 在 HAR 的 module.json5 中,将 type 字段的值改为'shared',并配置 deliveryWithInstall 字段为'true'。
- 若 HSP 需要对外声明可跳转的页面,在 module.json5 文件中添加 pages 字段,并在'resources/base'目录下创建'profile/main_pages.json'文件,配置'src'。
- 将 HAR 的 hvigorfile.ts 文件中的'harTasks'更改为'hspTasks'。
- HAR 的 build-profile.json5 文件中默认生成 consumerFiles 字段,该项字段 HAR 可配置,为默认导出的混淆加固规则,需要删除。
一个 HSP 模块如何快速切换成 HAR 模块?
- 在 HSP 下的 module.json5 中,把"type": 'shared"修改为"type': 'har',删除"deliveryWithInstall"、"pages"字段;


