写点什么

鸿蒙 NEXT 开发浅进阶到精通 01: 代码混淆加固如何实现

  • 2025-06-13
    江苏
  • 本文字数:2491 字

    阅读完需:约 8 分钟

鸿蒙NEXT开发浅进阶到精通01:代码混淆加固如何实现

写在前面

各位鸿蒙工作者朋友们大家好我们今天将要开启新的系列,这个系列主要是集合了一些实战项目应用中遇到的开发问题和华为上架提测问题的解决思路与代码或者对官方 API 的解读 ,希望可以解决你项目开发上的问题或者有所帮助。

概念概述

代码混淆是一种软件安全技术,旨在增加代码的复杂性和模糊性,从而增加攻击者分析和理解代码的难度。

好啦,具体概念和大体步骤可以参考官方链接,以下是基于这里在项目中的实际情况做的调试尝试和 CV 实用性级总结。

实战流程和过程注解

实现混淆加固大体分为三步走:1-开启混;2-配置混;3-打包淆。

如果你还需要为面试准备那还有第 4 步,查看混淆并记住混淆结果-规则映像文件在哪个文件夹,混淆结果文件的名字,,,,,,(知道有这个文件就好了,不知道当时 yi 车 APP 的面试官为什么问我那么深入具体哈哈,很可惜那次没能到北京现场支持)

1-开启混淆

在想要混淆的包里,混淆 entry/build-profile.json5 中,是的官方的这个意思是如果项目是多包架构,可以选择性混淆某个包。

"buildOptionSet": [    {      "name": "release",      "arkOptions": {        "obfuscation": {          "ruleOptions": {            "enable": true,            "files": [              "./obfuscation-rules.txt"            ]          }        }      }    },  ],复制
复制代码


对于首次开启混淆的开发者,我们还是要分析一下 概念---true 是开启,这个 txt 文件就是存放 混淆规则的文件,项目初始化时官方已为我们建立了这个文件,只不过默认未开启混淆,这个文件并没有起到什么影响运行的作用。



2-配置混淆

找到 rules 文件,每个包/ability 都有这个文件,初始化时官方已为我们创建的。



默认这里的代码都是带 #号的,其实就是被注释掉了,开启哪个就把前面的 #号去掉,本文展示的是一套够用的混淆规则,如有要求更高,请移步文档里里去具体配置,看这个官方给的 git 库,认真读一读,获益也还行arkguard/README-cn.md · OpenHarmony/arkcompiler_ets_frontend - Gitee.com

2.1 配置文件中开启混淆的内容-就是你想要混淆哪部分

当然我们最基本的要开启属性名/文件名/自定义方法类的名,但要注意统内部的类不混淆,,因为这点没必要啊,大家都能在官网查到和中项目中引用,没有保密性,如 @kit.PerformanceAnalysisKit 等**Kit,就是原生的一些 API 方法类。

# Obfuscation options://1-混淆配置# -disable-obfuscation: disable all obfuscations -enable-property-obfuscation: obfuscate the property names  //所有属性名混淆 #-enable-string-property-obfuscation  //有再深一点的混淆开启这个,这里暂时不会配,开启就运行不起来 -enable-toplevel-obfuscation: obfuscate the names in the global scope//无脑开启 -enable-export-obfuscation  //开启自定义的一些导入导出的类名,方法名等的混淆,但系统内部的类不混淆,如**Kit复制
复制代码

2.2 开启保留部分规则

由于上面的无脑开启混淆文件名,这里要保留能让代码跑起来的东西(实际踩坑这里的时候才知道什么叫挠头啊哈哈)

保持 entryability 和主页面各级 page 都保留不变,因为你前面开的 enable-filename-obfuscation 把下面的文件名也无脑混淆了,导致启动 APP 时自己都找不到页面路径


-keep-file-name //保持entryability和主页面各级page都保留不变,因为你前面开的enable-filename-obfuscation把下面的文件名也无脑混淆了,导致启动APP时自己都找不到页面路径indexentryEntryAbilityentryabilitypagesStartDetailBannerPageMainPageFeePageRePageInfoPageActivityPage.....有多少个页面和文件夹都复制到这里即可复制
复制代码

2.3 混淆路径

这里有个中 API11 中遇到的 bug 就是统一开启文件夹下所有路径的文件夹名字,但当时并没有成功开启一串,而是一个个路径粘贴进去的

-keep  //后面跟路径,亲测没效果./src/main/ets/pages   //不能让路径目录下的文件名保留不混淆./src/main/ets/entryability/EntryAbility.ets   // 中的名称不混淆复制
复制代码

3-开始混淆

这里注意,混淆的实际执行是在打包,而且建议配置为 release 模式下,因为上架版本的包就是 release,发布前我们也不需要混淆来加固保护代码的哦。



编辑

之前看问答区域有朋友在打包时,打不成 release 包,在 ACG 平台上传代码包的时候,会有检测机制,可以区分出打包的模式,签名配置文件等。

4-查看混淆内容(大厂面试题)

编辑器自己会根据这个来进行运行,而人读就很困难,改起来也困难哦,所以混淆就这点作用,当然还可以配置反混淆操作--暂时不会,链接放这,研究出来了别忘说一声应用代码混淆-安全

在这几个文件夹里查看混淆后的一些对比



映像文件内容展示,下图我们可以看到,我自定义的对象名,类名,那个 MD5 是我们自己封装的加密方法类,也被混淆成了 b1,,当然这里查不到第三方库的加密包名的,因为不是你写的,不给混淆,官方的 API 也不给混淆



通过我在本年 7 月 17 的工作笔记来看,我认为做到这里就可以实战了,但某车 APP 的面试官很严谨,在我告知有笔记知道在哪里找到这文件的情况下,需要我说出文件夹名字和路径,所以想进大厂,很多细节要注意,不能什么都差不多,我当时如果截图的时候多看几眼路径,也对答入流,让人家相信咱们真的懂点这个技能,半天一天能实现。

实战面试的收获-丢掉项目支持 offer 的关键一问

某车 APP 面试官有问到一个问题,可能也是这个问题吧,就是如果项目已经上线,在日志中拿到一个报错点,你如何在代码中精准定位来解决。我回答的很肤浅,

“咱们看下它报错文件夹路径和名字,我在项目代码中全局搜索,就找到混淆的映像文件内对于的实际代码路径了,然后开启修改。然后我也可以通过用户反馈的实际复现效果来定位问题的。”

面试官:“好的,那这个东西它在哪个文件夹呢?”

。。。。。。。。“我做过总结笔记有截图最终的文件夹在哪里,而且在官方文档中也能告诉我们这个文件在哪里哦老师。”

面试官:“好的”。。。。


那么两次提到某车 APP 的面试失败,并没有阴阳的意思,主要是那次没能公费出差到北京,错失了看 2024 年国庆升旗哈哈,所以印象深刻,因为我很少单独安排时间去旅行。一般来说去户外钓鱼或者公园转转就达到了大多旅游爱好者朋友们所要的放松。

发布于: 2025-06-13阅读数: 2
用户头像

偶尔看书钓鱼喝酒打游戏,偶尔敲demo看API 2025-05-31 加入

鸿蒙开发者达人

评论

发布
暂无评论
鸿蒙NEXT开发浅进阶到精通01:代码混淆加固如何实现_harmoyos_彭不懂赶紧问_InfoQ写作社区