鸿蒙(HarmonyOS)中解决Har互相引用导致在最终项目中找不到引用的问题

有一个项目A,创建了不同模块A1,A2去提供不同的功能,此时A1和A2还存在引用关系(假如A1引用了A2的方法)。

正常情况下,导出 A2 的 har 提供到 A1 模块 libs 下并引入,导出 A1 时会发现 A1 的Har 带了 A2的Har,此时在B项目中同时引入 A1和A2的 har,会造成 有两份A2,一份是被直接引用的,一份是在A1的 libs 下。程序也是可以正常运行的。

但是还是想解决一下这个问题,就发现鸿蒙中是可以动态引入的,同时有类似安卓的 "compileOnly" 功能。参考官方文档 动态import :动态import-应用程序包开发与使用-应用程序包基础知识-开发基础知识-基础入门 - 华为HarmonyOS开发者 (huawei.com)

了解到可以利用 动态 import 加上 runtimeOnly 似乎可以解决重复代码和依赖问题,但是实际使用中,会出现引用找不到的问题。会遇到链接中的错误:有关动态import中HAR模块间动态import依赖解耦的问题-华为开发者论坛 | 华为开发者联盟 (huawei.com)看最新评论没有得到有效的解决方案。

无意间发现了如下文章的方法可以解决关于多个har依赖问题-工程管理-DevEco Studio-开发 - 华为HarmonyOS开发者 (huawei.com)

其中上私有仓库,使用版本控制依赖是个不错的方法。

同时也尝试了第二种方法,也成功解决了依赖问题。

用第二种就是 在A1 中引用A2 的模块,而不是直接把A2的har放入A1中(不然打A1的 har 会带上A2的har),然后在B工程中,使用 overrides 重新指定 A2 的 har 路径即可。如此可以保证最终项目中只有一份代码。(无需使用 动态import)

参考文档:

动态import-应用程序包开发与使用-应用程序包基础知识-开发基础知识-入门 - 华为HarmonyOS开发者 (huawei.com)

HAR-共享包-应用程序包基础知识-开发基础知识-入门 - 华为HarmonyOS开发者 (huawei.com)

关于多个har依赖问题-工程管理-DevEco Studio-开发 - 华为HarmonyOS开发者 (huawei.com)

开发及引用动态共享包-开发及引用共享包-应用/服务开发-DevEco Studio使用指南-工具 - 华为HarmonyOS开发者 (huawei.com)

<think>首先,用户的问题是关于HarmonyOS的:他们想知道在鸿蒙系统中,使用HAR包时通过混淆处理是否可以避免多次引用导致的包体积增大。具体问题是:"HarmonyOS 多模块引用 HAR 包 混淆处理 是否可以减小包体积 避免重复引用"。 现在,回顾系统级指令: - 所有行内数学表达式必须使用 $...$ 格式。 - 独立公式必须使用 $$...$$ 格式并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识,例如: [^1] 用户可见层指令: - 回答结构清晰,帮助用户逐步解决问题。 - 尽量保证回答真实可靠。 参考站内引用: - 引用[1]: 关于HAP、HAR和HSP的特点和应用场景。 - 引用[2]: 关于静态共享包(HAR)和动态共享包(HSP)的区别,特别是HAR导致多包间代码和资源的重复拷贝。 - 引用[3]: 关于HarmonyOS编译方式的优化。 - 引用[4]: 总结了HAP、HAR、HSP的功能和使用场景。 关键点是:用户的问题聚焦于HAR包(Harmony Archive)和混淆处理是否能减小包体积,避免重复引用。 从引用中,我看到: - 引用[2] 明确指出:"多包(HAP/HSP)引用相同的HAR时,会造成多包间代码和资源的重复拷贝,从而导致应用包膨大"。这解释了为什么多次引用HAR会增加包体积。 - 混淆处理通常用于代码混淆,以保护知识产权或减小代码大小,但在这个上下文中,是否能解决重复引用问题? 我需要基于真实知识回答。虽然我不是专家,但根据常识和引用: - HAR是静态共享包,意味着每个引用它的模块都会在编译时复制一份代码和资源到HAP中。这会导致重复,增加包体积。 - HSP是动态共享包,在运行时共享,避免了重复拷贝,从而减小包大小。 混淆处理主要针对代码优化,如移除未使用的代码、混淆变量名等,但它不会改变HAR静态共享的本质。混淆可能减小单个模块的大小,但不能解决多个模块引用同一HAR时的重复问题。 因此,混淆处理不能避免重复引用导致的包体积增大。要避免这个问题,应该使用HSP(动态共享包)而不是HAR。 现在,构建回答: 1. **结构清晰**:逐步解释。 - 先解释问题HAR包的特性导致重复引用。 - 然后讨论混淆处理的作用。 - 最后给出建议。 2. **使用中文**:整个回答用中文。 3. **引用段落**:在相关部分末尾添加引用标识,如 [^2]。 4. **生成相关问题**:在回答结束后添加"§§相关问题§§"部分,列出几个相关问题。 回答大纲: - 引言:确认问题。 - 解释HAR包的特性:HAR是静态共享包,编译时复制,导致多模块引用时重复代码,增加包体积。[引用引用[2]] - 讨论混淆处理:混淆可以优化代码大小,但不能解决重复问题;它可能减小单个模块的大小,但每个模块仍然有自己的副本。 - 建议解决方案:使用HSP(动态共享包)来避免重复,因为HSP在运行时共享。[引用引用[2]和引用[4]] - 结论:混淆处理不能避免重复引用导致的包体积增大;推荐使用HSP。 - 生成相关问题。 最后,添加相关问题,例如: 1. HAR和HSP的主要区别是什么? 2. 如何在HarmonyOS中实现动态共享包(HSP)? 3. 混淆处理在HarmonyOS开发中的最佳实践是什么? 确保回答真实可靠:基于提供的引用和一般知识。</think>### HarmonyOS HAR 包混淆处理对包体积的影响分析 在 HarmonyOS 应用中,HARHarmony Archive)是一种静态共享包,用于代码和资源的复用。但多模块(如多个 HAP 或 HSP)引用同一个 HAR 包时,会导致代码和资源在编译时被重复拷贝到每个模块中,从而显著增加应用包体积。混淆处理是一种代码优化技术,主要用于混淆变量名、移除未使用代码等,以减小单个模块的大小。然而,**混淆处理本身并不能避免 HAR 包在多模块引用时的重复拷贝问题,因此无法有效减小因重复引用导致的包体积增大**。下面我将逐步解释原因,并提供优化建议。 #### 1. **HAR 包的特性导致重复引用问题** - HAR 是静态共享包,编译时会将代码和资源完整复制到每个引用它的模块中。例如,如果多个 HAP 或 HSP 都依赖同一个 HAR,每个模块的编译产物都会包含一份 HAR 的副本。这会导致包体积线性增长,尤其在大型应用中影响显著。 - 如引用[2]所述:“多包(HAP/HSP)引用相同的HAR时,会造成多包间代码和资源的重复拷贝,从而导致应用包膨大”。[^2] 混淆处理无法改变这种静态复制的机制,因此它只能优化单个副本的大小,而不能消除多个副本的存在。 #### 2. **混淆处理的作用与局限性** - 混淆处理(如 ProGuard 或 HarmonyOS 自带的混淆工具)主要通过以下方式减小代码大小: - 移除未使用的代码和资源(死代码删除)。 - 缩短变量名和方法名(标识符混淆)。 - 优化字节码结构。 例如,混淆后单个模块的包体积可能减小 10%-30%,但这仅针对每个模块的独立副本。 - **局限性**:混淆处理是编译时的局部优化,它不会改变 HAR 的静态共享特性。当多个模块引用同一个 HAR 时,每个模块经过混淆后仍会包含一份独立的混淆副本,重复问题依然存在。例如: - 假设一个 HAR 包原始大小为 100 KB。 - 混淆后单个副本可能减小到 70 KB。 - 但如果有 3 个模块引用它,总包体积增加量仍为 210 KB(3 × 70 KB),而不是共享的 70 KB。 因此,混淆处理无法从根本上避免重复引用带来的包体积膨胀。 #### 3. **推荐解决方案:使用 HSP 替代 HAR** - 要真正解决重复引用问题并减小包体积,建议使用 HSP(Harmony Shared Package,动态共享包)。HSP 在运行时共享代码和资源,多个模块引用同一个 HSP 时,只加载一份实例,从而避免重复拷贝。 - 如引用[2]和引用[4]对比:“动态共享包(HSP),运行时复用。当多包(HAP/HSP)同时引用同一个共享包时,可以避免HAR造成的多包间代码和资源的重复拷贝,从而减小应用包大小”。[^2][^4] - HSP 支持在配置文件中声明 UIAbility 和 ExtensionAbility 组件,适用于需要高效复用的场景。 - **混淆处理与 HSP 的结合**:如果仍想使用 HAR,可以将其与混淆处理结合来优化单个模块大小,但这仅作为辅助手段。最佳实践是: 1. **优先使用 HSP**:对于高频复用的代码库(如工具类、公共 UI 组件),采用 HSP 动态共享。 2. **仅在简单场景使用 HAR**:对于低频复用或独立模块,HAR 可能更简单,但需注意包体积影响。 3. **应用混淆处理**:在编译时对所有模块(包括 HAR 和 HSP)启用混淆,以进一步减小整体包大小。例如,在 DevEco Studio 的 `build.gradle` 中配置混淆规则: ```groovy android { buildTypes { release { minifyEnabled true // 启用混淆 proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } ``` 4. **其他优化**:结合模块化编译(如引用[3]提到的优化方案),避免整包编译,减少开发时的体积膨胀。[^3] #### 4. **结论** 混淆处理可以优化 HarmonyOS 应用的单个模块大小,但它不能解决 HAR 包在多模块引用时的重复拷贝问题,因此无法避免包体积增大。要有效减小包体积并避免重复引用,核心策略是使用动态共享包(HSP)替代静态共享包(HAR)。混淆处理可作为辅助手段,在 HSP 或 HAR 上应用以提升整体效率。开发者应根据具体业务需求,如引用[1]所述:“合理选择和使用这些模块类型,能够有效提高代码复用率、优化应用性能、减小包体积”。[^1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值