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

5 回复

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混淆配置问题

问题描述

在开发过程中,存在以下两种混淆配置场景的需求:

  1. HAP开启混淆时,能否指定某个被依赖的HAR不开启混淆?
  2. 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中的规则不会自动合并到最终的混淆配置中。

详细说明:

  1. consumer-rules.txt 的作用域:该文件设计的初衷,是用于定义当你的HAR/HSP包作为二进制依赖库发布出去后,被其他应用引用时,提供给下游消费者的建议性混淆保留规则。它确保了你库中的关键类、方法在别人的混淆过程中不被错误处理。
  2. 源码依赖下的编译行为:在当前的开发模式下(源码依赖),整个工程是一起编译、链接并最终打包成一个HAP的。混淆是在这个最终打包阶段进行的,且是一个全局过程。混淆器(如ProGuard/R8)需要一个统一的、顶层的规则配置文件,这个角色由**入口模块(Entry)的obfuscation-rules.txt**承担。
  3. 你的现象解释:你关闭了entity包的混淆开关,只开启har包的。此时,har包的consumer-rules.txt虽然存在,但因为har是源码依赖,其规则不会被自动“上抛”应用到全局混淆流程中。而entity作为入口模块,其混淆开关关闭,导致全局混淆未启用,因此har包中预期的混淆效果没有出现。

解决方案: 如果需要针对源码依赖的特定HAR/HSP模块内容进行混淆,必须将所需的混淆规则(包括希望混淆的指令以及需要保留的规则)统一配置到主Entry模块的obfuscation-rules.txt文件中。你可以手动将har包中consumer-rules.txt里关键的保留规则复制到主模块的配置文件中,并确保主模块的混淆开关已开启。

总结: 在源码依赖场景下,混淆是以应用(HAP)为单元全局处理的,规则由入口模块统管。consumer-rules.txt主要用于二进制分发的库,对源码依赖的编译时不直接生效。

回到顶部