HarmonyOS 鸿蒙Next中混淆能否只针对某个 hap 包开启
HarmonyOS 鸿蒙Next中混淆能否只针对某个 hap 包开启 【问题描述】:混淆能否只针对某个 hap 包开启;我现在是在主entity包里开启release的混淆是生效的 但是如果entity包里的混淆开关关上,只开启har包里的混淆开关,发现我指定的那个不生效,是咋回事。
【问题现象】:需求问题
【版本信息】:6.0编译器,api:20
【复现代码】:不涉及
【尝试解决方案】:
请各位老师看一下;下面这个结论对不对;是不是这个原理
consumer-rules.txt 仅在「Har/Hsp 被当作独立产物构建(出仓、发布)」时才参与规则合并;
一旦 Har/Hsp 被「源码依赖」进主 Entry,编译器依旧只认 Entry 自己的 obfuscation-rules.txt,consumer-rules.txt 不会自动上抛生效。
更多关于HarmonyOS 鸿蒙Next中混淆能否只针对某个 hap 包开启的实战教程也可以访问 https://www.itying.com/category-93-b0.html
hap如果不开启混淆,被依赖的har不会被混淆。
依赖模块混淆规则可以参考混淆规则合并策略:
代码混淆规则如下:
- 若har需要单独编译,需要har单独开启混淆。
- 若hap依赖多个har,需要依赖的hap模块开启混淆,被依赖的har会跟随混淆。
- hap依赖多个hsp,需要hap和hsp分别开启混淆才生效。
- hap依赖三方库,需要hap开启混淆,三方库会跟随混淆,但是默认不会混淆三方库import/export的方法及里面的属性。
更多关于HarmonyOS 鸿蒙Next中混淆能否只针对某个 hap 包开启的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
HAP与HAR混淆配置问题
问题描述
在开发过程中,存在以下两种混淆配置场景的需求:
- HAP开启混淆时,能否指定某个被依赖的HAR不开启混淆?
- HAP未开启混淆时,能否指定某个被依赖的HAR开启混淆?
解决方案
场景一:HAP开启混淆,指定HAR不混淆
可以实现。具体配置方式如下:
在HAP的build-profile.json5文件中开启混淆:
{
"app": {
"signingConfigs": [],
"products": [
{
"name": "default",
"signingConfig": "default",
"compileSdkVersion": 9,
"compileSdkType": "OpenHarmony",
"har": {
"harName": "myHar",
"obfuscation": false // 指定该HAR不开启混淆
}
}
],
"apiType": "public",
"deviceType": []
}
}
场景二:HAP未开启混淆,指定HAR开启混淆
目前不支持。HAR的混淆配置依赖于HAP的混淆设置,当HAP未开启混淆时,无法单独为某个HAR开启混淆。
配置说明
- HAR混淆依赖关系:HAR的混淆配置受HAP的混淆设置控制
- 独立配置:可以在HAP开启混淆的前提下,为不同的HAR设置不同的混淆策略
- 配置位置:在HAP的
build-profile.json5文件中进行HAR混淆配置
建议
如果需要在HAP未混淆的情况下对特定HAR进行代码保护,建议考虑其他代码保护方案,或调整项目结构使HAP开启混淆功能。
楼主这种情况涉及混淆规则合并策略,
根据依赖模块的类型,混淆规则分为以下两个来源:
-
本地HAR/HSP模块 指该模块配置文件build-profile.json5中arkOptions.obfuscation.consumerFiles字段指定的混淆配置文件内容。
-
远程HAR/HSP包 指该远程HAR/HSP包中obfuscation.txt文件内容。
构建HAP、HSP和HAR时,最终的混淆规则是以下文件的合并:
- 当前构建模块的ruleOptions.files属性。
- 依赖的本地HSP的consumerFiles属性。
- 依赖的本地HAR的consumerFiles属性。
- 依赖的远程HAR和远程HSP中的obfuscation.txt文件。
如果构建HAR,生成的远程HAR中的obfuscation.txt是以下文件的合并:
- 自身的consumerFiles属性。
- 依赖的本地HSP的consumerFiles属性。
- 依赖的本地HAR的consumerFiles属性。
- 依赖的远程HAR和远程HSP中的obfuscation.txt文件。
构建HSP时,生成的远程HSP中的obfuscation.txt仅包含自身的consumerFiles属性。
构建HAP时,不会生成obfuscation.txt文件。
ArkGuard混淆原理及功能-ArkGuard源码混淆工具-ArkTS编译工具链-ArkTS(方舟编程语言)-应用框架 - 华为HarmonyOS开发者
在HarmonyOS Next中,混淆可以针对单个HAP包开启。每个HAP包在构建时,可以在其对应的build-profile.json5文件中独立配置"obfuscation"选项。将"obfuscation"设置为true即可开启该HAP的代码混淆。其他未配置或设置为false的HAP包则不会进行混淆。
在HarmonyOS Next中,混淆配置的生效机制确实与你的理解基本一致。
核心结论:
你的结论是正确的。当HAR/HSP包被源码依赖(即作为模块直接引入)到主Entry(或Feature)模块进行编译时,编译器最终只会采用主模块的obfuscation-rules.txt作为整个应用打包时的混淆规则。被依赖模块(HAR/HSP)自身的consumer-rules.txt中的规则不会自动合并到最终的混淆配置中。
详细说明:
consumer-rules.txt的作用域:该文件设计的初衷,是用于定义当你的HAR/HSP包作为二进制依赖库发布出去后,被其他应用引用时,提供给下游消费者的建议性混淆保留规则。它确保了你库中的关键类、方法在别人的混淆过程中不被错误处理。- 源码依赖下的编译行为:在当前的开发模式下(源码依赖),整个工程是一起编译、链接并最终打包成一个HAP的。混淆是在这个最终打包阶段进行的,且是一个全局过程。混淆器(如ProGuard/R8)需要一个统一的、顶层的规则配置文件,这个角色由**入口模块(Entry)的
obfuscation-rules.txt**承担。 - 你的现象解释:你关闭了entity包的混淆开关,只开启har包的。此时,har包的
consumer-rules.txt虽然存在,但因为har是源码依赖,其规则不会被自动“上抛”应用到全局混淆流程中。而entity作为入口模块,其混淆开关关闭,导致全局混淆未启用,因此har包中预期的混淆效果没有出现。
解决方案:
如果需要针对源码依赖的特定HAR/HSP模块内容进行混淆,必须将所需的混淆规则(包括希望混淆的指令以及需要保留的规则)统一配置到主Entry模块的obfuscation-rules.txt文件中。你可以手动将har包中consumer-rules.txt里关键的保留规则复制到主模块的配置文件中,并确保主模块的混淆开关已开启。
总结:
在源码依赖场景下,混淆是以应用(HAP)为单元全局处理的,规则由入口模块统管。consumer-rules.txt主要用于二进制分发的库,对源码依赖的编译时不直接生效。

