-1

我在 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.**

因此,另一种解决方法是在这种情况下保留这两个类,一切都会正常:

-keep class org.pcap4j.packet.IpV4Packet
-keep class org.pcap4j.packet.IpV4Rfc1349Tos

但我要求一个“一般”规则,因为在这种情况下,该应用程序可能会使用上述其他类。

谢谢

4

1 回答 1

1

为给定库提供特定规则通常需要对库的工作方式有一些了解,特别是库在何处使用反射。在一个完美的世界中,库提供者将包括所需的规则,请参阅[库模块的开发注意事项]。(https://developer.android.com/studio/projects/android-library#Considerations)。

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

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

  Class.forName("com.example.MyClass")

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

于 2019-03-18T08:21:30.717 回答