ProGuard混淆含oshi依赖的Maven胖Jar报UnsatisfiedLinkError如何解决
问题根源
UnsatisfiedLinkError是因为原生方法绑定的Java类/方法签名被ProGuard混淆后,和原生库的导出符号不匹配。你当前的保留规则只覆盖了oshi自身的部分代码,但oshi底层依赖的JNA(Java原生访问)库的类被混淆,报错栈中的com.sun.a.H就是原本com.sun.jna包下的类被混淆重命名后的结果,导致原生方法找不到对应的Java入口。
修复步骤
- 首先添加JNA相关包的全量保留规则,JNA类和原生方法强绑定,禁止混淆:
# 保留JNA核心及平台包所有类、方法、字段 -keep class com.sun.jna.** { *; } -keep class com.sun.jna.platform.** { *; } # 全局保留所有native方法不被重命名 -keepclasseswithmembernames class * { native <methods>; }
- 补充保留JNA用到的系统原生库资源,防止被ProGuard压缩删除:
-keepresourcefiles **/*.dll -keepresourcefiles **/*.so -keepresourcefiles **/*.dylib
- 替换你原有的oshi部分保留规则为全量保留,避免遗漏oshi内部非公开的调用类:
-keep class oshi.** { *; }
验证逻辑
重新打包后如果类名没有被混淆,报错栈里应该会显示com.sun.jna相关的类名而非com.sun.a这类混淆后的短命名,此时原生方法可以正常匹配到对应入口,错误即可解决。
内容的提问来源于stack exchange,提问作者kallada
相关产品推荐
相关产品推荐

