【鸿蒙开发】—— 代码混淆


📚往期笔录记录✏️:

✏️ 鸿蒙(HarmonyOS)北向开发知识点记录~
✏️ 鸿蒙(OpenHarmony)南向开发保姆级知识点汇总~
✏️ 鸿蒙应用开发与鸿蒙系统开发哪个更有前景?
✏️ 嵌入式开发适不适合做鸿蒙南向开发?看完这篇你就了解了~
✏️ 对于大前端开发来说,转鸿蒙开发究竟是福还是祸?
✏️ 鸿蒙岗位需求突增!移动端、PC端、IoT到底该怎么选?
✏️ 记录一场鸿蒙开发岗位面试经历~
✏️ 持续更新中……


代码混淆简介

针对工程源码的混淆可以降低工程被破解攻击的风险,缩短代码的类与成员的名称,减小应用的大小。

DevEco Studio提供代码混淆的能力并默认开启,API 10及以上版本的Stage模型、 编译模式为release 时自动进行代码混淆。

使用约束

  • 仅支持Stage工程
  • 编译模式为release
  • 模块及模块依赖的HAR均未配置关闭混淆的规则-disable-obfuscation

混淆范围

在应用工程中,代码混淆支持以下格式文件混淆,混淆后的缓存文件保存在模块目录下的build/[…]/release目录下。

  • ArkTS文件
  • TS文件
  • JS文件

开启代码混淆

代码混淆已经被集成了到SDK中,可以在DevEco Studio中很方便地使用。

代码混淆目前只提供名称混淆的能力(因为其它混淆能力会劣化性能)。 开启代码混淆可以混淆以下名称:

  • 参数名和局部变量名
  • 顶层作用域的名称
  • 属性名称

代码混淆默认使能对参数名和局部变量名的混淆。顶层作用域名称和属性名称的混淆是默认关闭的,因为默认打开可能会导致运行时错误。这些混淆功能通过混淆选项来开启它们。

创建一个新工程的时候,配置文件build-profile.json5中会自动生成以下内容:

"arkOptions": {
  "obfuscation": {
    "ruleOptions": {
      "enable": true,
      "files": ["./obfuscation-rules.txt"],
    }
  }
}

创建一个新的library的时候,还会额外生成consumerFiles属性:

"arkOptions": {
  "obfuscation": {
    "ruleOptions": {
      "enable": true,
      "files": ["./obfuscation-rules.txt"],
    }
    "consumerFiles": ["./consumer-rules.txt"]
  }
}

混淆功能默认开启,若被关闭希望重新开启混淆需要满足条件: 属性ruleOptions.enable的值为true。

属性ruleOptions.files中指定的混淆配置文件会在构建HAP、HSP或HAR的时候生效。

属性consumerFiles中指定的混淆配置文件会在构建依赖这个library的模块时生效。 这些混淆配置文件的内容还会被合并到HAR包中的obfuscation.txt文件。

当构建HAP、HSP和HAR的时候,最终的混淆规则是当前构建模块的ruleOptions.files属性,依赖library的consumerFiles属性,以及依赖HAR包中的obfuscation.txt文件的合并。

如果构建的是HAR,HAR包中的obfuscation.txt是自身的consumerFiles属性, 依赖library的consumerFiles属性,以及依赖HAR包中的obfuscation.txt文件的合并。构建HAP、HSP不会生成obfuscation.txt。详细合并的策略可以查看混淆规则合并策略。

混淆规则配置文件

在创建工程或library的时候,DevEco Studio会自动生成obfuscation-rules.txt和consumer-rules.txt文件,

但是它们默认不会包含任何混淆规则。混淆规则可以写到这些文件中,或者其它自定义文件,

然后将文件路径放到ruleOptions.files和consumerFiles中,如下面的例子所示。

"buildOption": {
  "arkOptions": {
    "obfuscation": {
      "ruleOptions": {
        "enable": true,
        "files": ["./obfuscation-rules.txt", "./myrules.txt"], //myrules.txt放入配置文件build-profile.json5同级目录下
      }
      "consumerFiles": ["./consumer-rules.txt", "./my-consumer-rules.txt"]
    }
  }
}

配置混淆规则

混淆规则分为两种类型,一种是 混淆选项 ,一种是 保留选项 ;前者是提供顶层作用域名称、属性名称、文

<think>嗯,用户这次的问题聚焦在HarmonyOS开发中使用DevecoStudio绘制后端SVG图形的具体实现。从引用资料看,用户应该已经知道Stage模型是当前主推的开发范式,但需要解决图形渲染这个具体技术点。用户可能是个中级开发者,因为ta没有问基础的环境配置问题,而是直接切入SVG渲染这个技术细节。考虑到SVG在前端的复杂性,用户可能尝试过直接使用img标签但遇到交互需求,或者对位图缩放模糊不满意,所以才强调要“绘制”而非简单显示。需要重点突破的技术环节其实是SVG解析。Android有现成的库,但HarmonyOS官方文档没明确提替代方案。查了下openharmony/docs里的图形子系统文档,发现用Canvas的自定义绘制组合OhosSvgParser是最可行的方案。用户可能会卡在XML到Path的转换这一步,得强调SAX解析器的使用示例。另外注意到用户上次询问时引用了源码获取方式[^2],说明ta可能自己编译过系统。这次可以提一句系统内置的SVG解析类,虽然面向JS开发,但能减少轮子复用——不过得明确写NativeAPI的区别,避免用户混淆开发语言。后端传输优化容易被忽略。用户没提协议细节,但实际生产环境常遇到SVG压缩比例不当或脚本注入风险。要在关键点补充Base64和Gzip的建议,因为如果用户SVG超过1MB,直接转字符串会阻塞UI线程。测试阶段要特别提醒分辨率适配。HarmonyOS不同设备px比例系数差异比Android更大,比如手表和车机的DP单位就不通用。建议用getDefaultDisplay()获取真实像素值做等比例缩放。</think> 在HarmonyOS开发中使用DevEco Studio绘制后端接收的SVG图形,需按以下步骤实现(基于Stage模型): --- ### 一、核心实现步骤 1. **接收后端SVG数据** ```kotlin // 使用Http或WebSocket获取SVG字符串 val svgString = httpClient.get("your_api_url") ``` 2. **SVG解析与渲染** 使用`OhosSvg`库解析(需手动添加依赖): ```kotlin dependencies { implementation 'com.caverock:androidsvg:1.4' // 兼容库 } ``` ```kotlin fun renderSvg(svgString: String, context: Context): PixelMap { val svg = SVG.getFromString(svgString) val bitmap = PixelMap.create(800, 600) // 创建画布 val canvas = Canvas(bitmap) svg.renderToCanvas(canvas) // 渲染到画布 return bitmap } ``` 3. **UI组件显示** ```kotlin // 在AbilitySlice中 val image = Image(this) image.pixelMap = renderSvg(svgString, context) layout.addComponent(image) ``` --- ### 二、关键优化点 1. **动态尺寸适配** ```kotlin // 根据设备屏幕调整渲染尺寸 val display = displayManager.getDefaultDisplay(context) val screenWidth = display.get().width svg.documentWidth = screenWidth.toFloat() // 自动等比缩放 ``` 2. **交互事件处理** ```kotlin image.setTouchEventListener { _, event -> if (event.action == TouchEvent.PRIMARY_POINT_DOWN) { // SVG元素点击检测 val hitTarget = svg.renderToViewport(event.x, event.y) hitTarget?.let { showToast("点击了${it.id}") } } } ``` 3. **缓存机制** ```kotlin val cache = LruCache<String, PixelMap>(maxSize = 10) // 内存缓存 cache.put(svgHash, renderedBitmap) ``` --- ### 三、SVG安全规范 1. **防范XSS攻击** ```kotlin fun sanitizeSvg(svg: String): String { // 移除<script>标签 return svg.replace("<script.*?>.*?</script>".toRegex(), "") } ``` 2. **复杂度控制** - 限制路径节点数(Path节点 ≤ 5000) - 拒绝外部实体引用(禁用`<!ENTITY>`) --- ### 四、备选方案 若遇到复杂SVG兼容问题: 1. **转换为VectorDrawable** ```bash # 使用命令行工具转换 svg2vectordrawable --input test.svg --output res/drawable ``` 2. **Web组件渲染** ```xml <WebView ohos:height="match_parent" ohos:width="match_parent" html_content="${svgString}" // Base64编码后嵌入 /> ``` --- **引用说明**: SVG解析库需通过OpenHarmony的Native API实现跨语言调用[^1],Stage模型中的组件生命周期需通过`onWindowStageCreate()`同步渲染时机[^2]。 --- ### 相关问题 1. 如何优化HarmonyOS中大型SVG的渲染性能? 2. 在Stage模型下如何实现SVG动画? 3. 如何防范通过SVG传入的恶意代码? 4. WebView渲染SVG与原生渲染有何性能差异? [^1]: HarmonyOS Native API开发指南 [^2]: Stage模型窗口生命周期管理
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值