java - pcap4j - Android Proguard/R8 配置
问题描述
我在 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
但我要求一个“一般”规则,因为在这种情况下,该应用程序可能会使用上述其他类。
谢谢
解决方案
为给定库提供特定规则通常需要对库的工作方式有一些了解,特别是库在何处使用反射。在一个完美的世界中,库提供者将包括所需的规则,请参阅[库模块的开发注意事项]。(https://developer.android.com/studio/projects/android-library#Considerations)。
当 R8(或 Proguard)处理代码时,它将跟踪所有可从指定规则保留的类/方法/字段中访问的代码。这适用于除反射之外的所有代码。当使用反射时,反射的项目通常会出现,并且仍然具有它们的原始名称。因此,反映的项目通常需要保留规则。
请注意,在简单的情况下会处理反射,例如:
Class.forName("com.example.MyClass")
在这里,跟踪将跟踪类com.example.MyClass
,如果启用了混淆,类也可以重命名,然后也重写常量字符串。
推荐阅读
- asp.net-web-api - 查询字符串格式输入UserId和密码
- vb.net - 如何在 VB.Net 中将数据表列转换为字符串列表
- coldfusion - ColdFusion 计划任务是否有内置的请求超时?
- angular - 防止选择字段无限滚动(ng-select,角度)
- json - 有没有办法在弹性搜索服务的 http 正文中解析 IAM 用户凭证?
- mfc - Visual Studio 2019 对结构中的变量没有默认值提出警告
- python - 如何正确测试具有 REST API + Flask JWT 扩展的应用程序?
- c# - 无限路径路由到 ASP.NET Core 操作
- c# - 如何将一个类中的对象传递到另一个类的列表中?
- c# - 通过 JQuery 检测 iFrame SRC 更改