我正在Android上使用pcap4j,并且在Debug Build上一切正常。 但是在发布版本中,激活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)
作为解决方法,如果我添加以下规则,则可以正常工作:
-keep class org.pcap4j.packet.**
但根据上述规则,所有类均由收缩器保留且未优化
我的问题是如何编写更严格的规则以最大程度地缩小pcap4j并保持功能而不会引发异常
我也尝试过以下规则,但仍然崩溃:
-keepclassmembernames class org.pcap4j.packet.**
-keepclassmembers class org.pcap4j.packet.**
-keepnames class org.pcap4j.packet.**
所以另一种解决方法是在这种情况下保留这2个类,然后一切正常:
-keep class org.pcap4j.packet.IpV4Packet
-keep class org.pcap4j.packet.IpV4Rfc1349Tos
但是我要一个“通用”规则,因为在这种情况下,该应用程序可能会使用上述类似的其他类。
谢谢
答案 0 :(得分:1)
为给定的库提供特定规则通常需要对库的工作原理,特别是库在何处使用反射的一些见解。在一个完美的世界中,图书馆提供者将包括所需的规则,请参阅[图书馆模块的开发注意事项]。(https://developer.android.com/studio/projects/android-library#Considerations)。
当R8(或Proguard)处理代码时,它将跟踪从指定的给定规则保留的类/方法/字段可访问的所有代码。这对除反射以外的所有代码都适用。使用反射时,通常希望反射的项目存在,并且仍具有其原始名称。因此,反映出来的项目通常需要遵守规则。
请注意,在简单情况下,可以处理反射,例如:
Class.forName("com.example.MyClass")
此处跟踪将跟踪类com.example.MyClass
,如果启用混淆,则也可以重命名该类,然后也可以重写常量字符串。