1

我的未混淆代码有效..

通过 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)

我尝试了几个保持指令如下:

-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>;
}

如何配置 Proguard 以避免此异常?

4

1 回答 1

1

从 JNA 5.x 开始,Structure类字段由@FieldOrder注释标识。对于Timeval导致您的问题的结构,它的定义如下:

@Structure.FieldOrder({ "tv_sec", "tv_usec" })
class Timeval extends Structure {
    public NativeLong tv_sec; // seconds
    public int tv_usec; // microseconds
}

堆栈跟踪表明它正在public(正确地)找到字段,但没有找到注释声明的字段顺序。

这个问题表明Proguard会混淆注释,这很可能是问题的根源。

JNA 的常见问题解答建议使用以下语法。可能需要更广泛的通配符定义,而不是明确定义<fields>and <methods>

-dontwarn java.awt.*
-keep class com.sun.jna.* { *; }
-keepclassmembers class * extends com.sun.jna.* { public *; }

由于注释在 JNA 的 Structure 类中定义为,因此该问题@interface的答案建议的解决方案表明以下应该解决该问题:

# Annotated interfaces (including methods which are also kept in implementing classes)
-keep @com.sun.jna.Structure.FieldOrder interface * {
    *;
}

其他可能更广泛的解决方案:

  • -keepattributes Annotation
  • -keepattributes *Annotation*
于 2020-10-05T16:53:08.417 回答