Java 使用progaurd混淆JNA结构时getFieldOrder()中出现异常
我的未混淆代码可以正常工作 当运行Proguard模糊处理时——只需1次优化 我得到以下错误:Java 使用progaurd混淆JNA结构时getFieldOrder()中出现异常,java,proguard,jna,oshi,Java,Proguard,Jna,Oshi,我的未混淆代码可以正常工作 当运行Proguard模糊处理时——只需1次优化 我得到以下错误: Exception in thread "main" java.lang.Error: Structure.getFieldOrder() on class com.sun.jna.platform.mac.SystemB$Timeval does not provide enough names [0] ([]) to match declared fields [2] ([tv
Exception in thread "main" java.lang.Error: Structure.getFieldOrder() on class com.sun.jna.platform.mac.SystemB$Timeval does not provide enough names [0] ([]) to match declared fields [2] ([tv_sec, tv_usec])
at com.sun.jna.Structure.getFields(Unknown Source)
at com.sun.jna.Structure.deriveLayout(Unknown Source)
at com.sun.jna.Structure.calculateSize(Unknown Source)
at com.sun.jna.Structure.allocateMemory(Unknown Source)
at com.sun.jna.Structure.ensureAllocated(Unknown Source)
at com.sun.jna.Structure.ensureAllocated(Unknown Source)
at com.sun.jna.Structure.getPointer(Unknown Source)
at oshi.util.platform.mac.SysctlUtil.sysctl(Unknown Source)
at oshi.software.os.mac.MacOperatingSystem.<clinit>(Unknown Source)
at oshi.SystemInfo.createOperatingSystem(Unknown Source)
at oshi.util.Memoizer$1.get(Unknown Source)
at oshi.SystemInfo.getOperatingSystem(Unknown Source)
线程“main”java.lang.Error中的异常:com.sun.jna.platform.mac.SystemB$Timeval上的Structure.getFieldOrder()未提供足够的名称[0]([])来匹配声明的字段[2]([tv_sec,tv_usec])
位于com.sun.jna.Structure.getFields(未知源)
位于com.sun.jna.Structure.deriveLayout(未知源)
位于com.sun.jna.Structure.calculateSize(未知源)
位于com.sun.jna.Structure.allocateMemory(未知源)
位于com.sun.jna.Structure.com(未知源)
位于com.sun.jna.Structure.com(未知源)
位于com.sun.jna.Structure.getPointer(未知源)
位于oshi.util.platform.mac.SysctlUtil.sysctl(未知源)
在oshi.software.os.mac.MacOperatingSystem。(来源不明)
在oshi.SystemInfo.createOperatingSystem(未知源)
在oshi.util.Memoizer$1.get(未知来源)
在oshi.SystemInfo.getOperatingSystem(未知来源)
我尝试了以下几种保持指令:
-keep class com.sun.** { *; }
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
-keep class com.sun.jna.**{ *; }
-keep class * implements com.sun.jna.**{ *; }
-keep class oshi.**{ *; }
-keep class * implements oshi.**{ *; }
-keepclassmembers class * extends com.sun.jna.** {
<fields>;
<methods>;
}
-keepclassmembers class * extends oshi.** {
<fields>;
<methods>;
}
-keep class com.sun.*{*;}
-keepclassmembers枚举*{
公共静态**[]值();
公共静态**valueOf(java.lang.String);
}
-保持类com.sun.jna.*{*;}
-keep类*实现com.sun.jna.*{*;}
-保持职业安全卫生。**{*;}
-keep类*实现oshi.*{*;}
-keepclassmembers类*扩展com.sun.jna.*{
;
;
}
-keepclassmembers类*扩展oshi。**{
;
;
}
如何配置Proguard以避免此异常?从JNA 5.x开始,用
@FieldOrder
注释标识结构
类字段。对于导致问题的Timeval
结构,其定义如下:
@Structure.FieldOrder({“tv_-sec”,“tv_-usec”})
类Timeval扩展了结构{
公共国家电视节目_sec;//秒
public int tv_usec;//微秒
}
堆栈跟踪表明它正在查找public
字段(正确),但没有找到注释声明的字段顺序
指示Proguard将混淆注释,这可能是问题的根源
建议使用以下语法。可能需要更广泛的通配符定义,而不是明确定义
和
由于注释在JNA的Structure类中定义为@接口
,因此答案建议的解决方案可以解决以下问题:
# Annotated interfaces (including methods which are also kept in implementing classes)
-keep @com.sun.jna.Structure.FieldOrder interface * {
*;
}
更广泛地说,其他可能有效的解决方案:
-keepattributes注释
-keepattributes*注释*
# Annotated interfaces (including methods which are also kept in implementing classes)
-keep @com.sun.jna.Structure.FieldOrder interface * {
*;
}