HarmonyOS 鸿蒙Next中getStringSync函数在开启混淆后会报错,这个该如何解决

HarmonyOS 鸿蒙Next中getStringSync函数在开启混淆后会报错,这个该如何解决 在混淆配置文件obfuscation-rules.txt中添加:
-keep-file-name */resources/
-keep-resource-id *

加了这两个似乎没有用 依旧报Invalid resource ID: 0

我混淆后本地运行没问题 但是一发到三方库再下载就报错了

用官方文档推荐的 getstringByNameSync 组件定义的时候类型就是Resource 让用户去传资源名称显然不合适

3 回复

*配置了 -keep-file-name /resources/ 和 -keep-resource-id * 但依然报错,可能是你的混淆规则未生效或覆盖范围不足。

验证一下混淆配置作用范围

// build-profile.json5

"arkOptions": {

  "obfuscation": {

    "ruleOptions": {

      "enable": true,

      "files": ["./obfuscation-rules.txt"]

    }

  }

}

添加更精确的保留规则,避免资源路径或ID被混淆:

# 保留所有资源文件路径及名称
-keep-file-name **/resources/**

# 保留资源ID生成逻辑相关的类和方法
-keep @Entry

-keep class * extends Resource { *; }

-keep public class * extends ResourceTable { *; }

混淆后通过 $r(‘app.string.xx’) 获取的 Resource 对象ID被修改,但本地运行正常,而三方库集成后失效。

改用 getStringByNameSync 通过资源名称获取值:

// 从Resource对象中提取资源名称
const resName = $r('app.string.xx').getName();
const value = this.context.resourceManager.getStringByNameSync(resName);

在混淆规则中明确保留资源名称字段:

-keep-class-member-names class * {  
  public static *Name;  
}

HAR包混淆后资源失效,要检查独立混淆配置

在HAR模块的 obfuscation-rules.txt 中添加:

 -keep-file-name **/resources/**
 -keep-resource-id *

更多关于HarmonyOS 鸿蒙Next中getStringSync函数在开启混淆后会报错,这个该如何解决的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在鸿蒙Next中,getStringSync函数在开启混淆后报错,通常是由于ProGuard混淆导致的方法名或资源引用丢失。解决方法是在混淆配置文件中添加相应规则,保留相关类或方法不被混淆。具体操作是在proguard-rules.pro文件中加入-keep指令,确保资源访问相关代码不被优化。

在混淆配置中,需要确保资源ID不被重命名。请尝试在obfuscation-rules.txt中添加以下规则:

-keep-resource-id **
-keepclassmembers class **.ResourceTable {
    *;
}

这可以防止资源ID被混淆,避免getStringSync因ID无效而报错。如果问题仍存在,请检查三方库的混淆配置是否覆盖了您的设置。

回到顶部