Java pcap4j-Android Proguard/R8配置

Java pcap4j-Android Proguard/R8配置,java,android,kotlin,android-proguard,android-r8,Java,Android,Kotlin,Android Proguard,Android R8,我在Android上使用pcap4j,在调试构建中一切都很好。 但在发布版本中,激活Proguard/R8时会引发以下异常: java.lang.IllegalStateException: Unsupported target: class org.pcap4j.packet.IpV4Rfc1349Tos at org.pcap4j.packet.factory.PacketFactoryBinder.getPacketFactory(SourceFile:2)

我在Android上使用pcap4j,在调试构建中一切都很好。 但在发布版本中,激活Proguard/R8时会引发以下异常:

java.lang.IllegalStateException: Unsupported target: class org.pcap4j.packet.IpV4Rfc1349Tos
        at org.pcap4j.packet.factory.PacketFactoryBinder.getPacketFactory(SourceFile:2)
        at org.pcap4j.packet.factory.PacketFactories.getFactory(SourceFile:2)
        at org.pcap4j.packet.IpV4Packet$IpV4Header.<init>(SourceFile:6)
        at org.pcap4j.packet.IpV4Packet.<init>(SourceFile:2)
        at org.pcap4j.packet.IpV4Packet.newPacket(SourceFile:2)
        at org.pcap4j.packet.factory.StaticEtherTypePacketFactory.newInstance(SourceFile:10)
        at org.pcap4j.packet.factory.StaticEtherTypePacketFactory.newInstance(SourceFile:1)
        at org.pcap4j.packet.IpSelector.newPacket(SourceFile:8)
但根据上述规则,所有类都由收缩器保留,而不是优化

我的问题是如何编写更严格的规则来最大限度地收缩pcap4j,并在没有抛出异常的情况下保持功能

我也尝试过以下规则,但仍然失败:

-keepclassmembernames class org.pcap4j.packet.**
-keepclassmembers class org.pcap4j.packet.**
-keepnames class org.pcap4j.packet.**
因此,另一个解决方法是在这种情况下保留这两个类,一切正常:

-keep class org.pcap4j.packet.IpV4Packet
-keep class org.pcap4j.packet.IpV4Rfc1349Tos
但我要求的是一个“一般”规则,因为在这种情况下,应用程序可能会使用类似于上述的其他类


谢谢

为给定库提供特定规则通常需要了解库的工作方式,特别是库在何处使用反射。在一个完美的世界中,库提供者将包括所需的规则,请参阅[库模块的开发注意事项]。()

当R8(或Proguard)处理代码时,它将跟踪从指定由给定规则保留的类/方法/字段中可访问的所有代码。这适用于除反射之外的所有代码。当使用反射时,反射的项目通常会出现,并且仍然具有其原始名称。因此,所反映的项目通常需要保留规则

请注意,在简单情况下会处理反射,例如:

Class.forName(“com.example.MyClass”)

在这里,跟踪将跟踪类
com.example.MyClass
,如果启用了模糊处理,也可以重命名该类,然后重写常量字符串。

您也可以直接向GitHub上的库的维护人员询问
-keep class org.pcap4j.packet.IpV4Packet
-keep class org.pcap4j.packet.IpV4Rfc1349Tos