混淆选项配置指导

  • 开启-enable-toplevel-obfuscation选项,如果代码中有globalThis访问全局变量,会出现访问失败的情况,需要使用-keep-global-name来保留此全局变量名称。

  • 待上述选项应用适配成功后,开启-enable-property-obfuscation选项。此选项开启后以下场景需要适配:

1.若代码中存在静态定义、动态访问的情况,或动态定义、静态访问的情况,需要使用-keep-property-name保留属性名称。示例:


// 静态定义,动态访问:属性名在对象定义时是静态的,但访问时通过动态构建属性名(通常使用字符串拼接)来访问
const obj = {
  staticName: value  // 静态定义属性
};
const fieldName = 'static' + 'Name';  // 动态构建属性名
console.log(obj[fieldName]);  // 使用方括号语法动态访问属性

// 动态定义,静态访问:属性名通过动态表达式在对象定义时确定,但访问时直接使用点语法(假设你知道属性名的结果)
const obj = {
  [dynamicExpression]: value  // 动态定义属性
};
console.log(obj.dynamicPropertyName);  // 使用点语法静态访问属性

2.若代码中使用点语法访问未在ArkTS/TS/JS代码中定义的字段,比如访问native实现的so库,字段固定的json文件与数据库等场景:

3.若为构建HAR模块并发布给其他模块使用的场景,需要在HAR模块的consumer-rules.txt文件中,将不能被二次混淆的属性使用-keep-property-name进行保留。当构建HAR时,consumer-rules.txt文件会生成obfuscation.txt文件。当其他模块依赖此HAR时,Deveco Studio会解析obfuscation.txt文件并读取其中的白名单。

4.验证应用功能,排查遗漏的场景。若应用出现功能异常,依据混淆后的报错栈从对应的中间产物中找到报错行的代码,排查需要配置的白名单并使用-keep-property-name进行保留。

  • 待上述选项应用适配成功后,开启-enable-export-obfuscation选项。此选项开启后以下场景需要适配:
    a.若构建HSP模块,它会提供接口及其属性给其它模块调用,因此需要将对外接口使用-keep-global-name来保留、将对外暴露的class/interface等语法中的属性使用-keep-property-name保留。

b.若构建HAR模块并发布给其他模块使用的场景,要在HAR模块中的obfuscation-rules.txt文件中将对外接口使用-keep-global-name来保留,将对外暴露的class/interface等语法中的属性使用-keep-property-name保留。

c.若在代码中引用so库的api,如import { napiA } from 'library.so';需要使用-keep-global-name napiA保留so接口名称。

d.验证应用功能以及模块被依赖时的接口调用功能,排查遗漏的场景。若应用出现功能异常,依据混淆后的报错栈从对应的中间产物中找到报错行的代码,排查需要配置的白名单并进行保留。

  • 待上述选项应用适配成功后,开启-enable-filename-obfuscation选项。此选项开启后以下场景需要适配:

a.若代码中有动态import语句,如const path = './filePath'; import(path),会出现文件引用失败的情况,需要使用-keep-file-name filePath来保留这个文件名。

b.若应用中有描述路由表信息的routerMap配置,其中的pageSourceFile字段标记页面在模块的路径,需要使用-keep-file-name来保留这个路径。

c.若代码中有传入ohmUrl进行页面跳转,如router.pushUrl({url: '@bundle:com.example.routerPage/Library/Index'),使用-keep-file-name来保留这个路径。

d.验证应用功能,排查遗漏的场景。若应用出现功能异常,且报错栈中的路径为混淆后的路径,可以在模块中的build/default/[...]/release/obfuscation/nameCache.json文件中查询到原始路径,进而找到源码文件。另外,插件hstack支持自动还原混淆后的报错堆栈。在定位到需要保留的路径后,使用-keep-file-name来保留此路径。

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐