pcap4j - Конфигурация Android Proguard / R8 - PullRequest
0 голосов
/ 17 марта 2019

Я использую pcap4j на Android, и все хорошо работает в 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 и сохранения функциональности без исключения throw *

Я пробовал тоже с приведенными ниже правилами, новсе еще вылетает:

-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

Но я прошу "общее" правило,потому что в этом случае приложение может использовать другие классы, подобные приведенным выше.

Спасибо

1 Ответ

1 голос
/ 18 марта 2019

Предоставление определенных правил для данной библиотеки обычно требует некоторого понимания того, как библиотека работает, и, в частности, где библиотека использует отражение. В мире префектов поставщик библиотеки будет включать необходимые правила, см. [Рекомендации по разработке библиотечных модулей]. (https://developer.android.com/studio/projects/android-library#Considerations).

Когда R8 (или Proguard) обрабатывает код, он будет отслеживать весь код, достижимый из классов / методов / полей, которые определены для сохранения в соответствии с данными правилами. Это хорошо работает для всего кода, кроме отражения. Когда используется отражение, обычно предполагается, что отраженные элементы будут присутствовать, и все еще будут иметь свои оригинальные имена. Поэтому для предметов, о которых идет речь, обычно требуется правило хранения.

Обратите внимание, что в простых случаях обрабатывается отражение, например ::

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

Здесь трассировка отследит класс com.example.MyClass, и если обфускация включена, класс также можно переименовать, а затем константную строку переписать.

...