HarmonyOS 鸿蒙Next中getStringSync函数在开启混淆后会报错,这个该如何解决
HarmonyOS 鸿蒙Next中getStringSync函数在开启混淆后会报错,这个该如何解决
在混淆配置文件obfuscation-rules.txt中添加:
-keep-file-name */resources/
-keep-resource-id *
加了这两个似乎没有用 依旧报Invalid resource ID: 0
我混淆后本地运行没问题 但是一发到三方库再下载就报错了
用官方文档推荐的 getstringByNameSync 组件定义的时候类型就是Resource 让用户去传资源名称显然不合适
*配置了 -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无效而报错。如果问题仍存在,请检查三方库的混淆配置是否覆盖了您的设置。