Java 使用progaurd混淆JNA结构时getFieldOrder()中出现异常

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

我的未混淆代码可以正常工作

当运行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_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 * {
    *;
}