我在使用 yGuard 混淆 Java 库时遇到问题。该库的一部分应该是 Service Provider Interface 的实现。 (SPI)等需要从混淆过程中排除。使用该库的应用程序的非混淆版本可以正常工作。但经过混淆处理后,情况并非如此。
我怀疑这是由于设置不当造成的 <shrink>
yGuard 的 ANT 任务的元素 - 它可能会删除一些方法,因为它们被认为是未使用的。我确保包和类被排除在混淆的重命名阶段( <rename>
),因此这不应该是问题的原因。
我曾希望通过指定我正在实现的主接口(interface)作为收缩引擎的入口点所需实现的唯一方法来避免 SPI 实现的收缩,但失败了。然后,该方法委托(delegate)给其他接口(interface)实现,因此我希望整个事情都能顺利进行。看看我下面有什么:
<shrink logfile="obfuscate_shrink_log.xml">
<property name="error-checking" value="pedantic"/>
<keep>
<method name="void main(java.lang.String[])" class="package.path.to.main.Class"/>
<method name="org.relaxng.datatype.DatatypeLibrary createDatatypeLibrary(java.lang.String)" class="package.path.to.my.implementation.of.DatatypeLibraryFactory"/>
<class classes="public"/>
</keep>
</shrink>
<rename mainclass="package.path.to.main.Class" logfile="obfuscate_rename_log.xml" replaceClassNameStrings="true">
<property name="error-checking" value="pedantic"/>
<keep>
<class name="package.path.to.my.implementation.of.DatatypeLibraryFactory"/>
<class name="package.path.to.my.implementation.of.DatatypeLibrary"/>
<class name="package.path.to.my.implementation.of.Datatype"/>
</keep>
</rename>
我正在实现一组 org.relaxng.datatype接口(interface)。它们可以通过 SPI 调用 Jing .
如何使用 yGuard 指定要从混淆过程(重命名和收缩)中排除的整个包?
最佳答案
仔细阅读 yGuard 的文档后,我意识到我做错了什么(好吧,没有错,我错过了什么)。如果您按照我在问题中所做的操作,将导致收缩引擎保留您指定的方法,但不会保留类的构造函数,这将导致 SPI 无法实例化您的实现。
需要完成以下工作:
<shrink logfile="obfuscate_shrink_log.xml">
<property name="error-checking" value="pedantic"/>
<keep>
<method name="void main(java.lang.String[])" class="package.path.to.main.Class"/>
<class name="package.path.to.my.implementation.of.DatatypeLibraryFactory" methods="public"/>
<class classes="public"/>
</keep>
</shrink>
<rename mainclass="package.path.to.main.Class" logfile="obfuscate_rename_log.xml" replaceClassNameStrings="true">
<property name="error-checking" value="pedantic"/>
<keep>
<class name="package.path.to.my.implementation.of.DatatypeLibraryFactory"/>
</keep>
</rename>
这将使特定类的公共(public) API 免于混淆、缩小和重命名。您只需省略使您的服务提供者实现能够被实例化的部分。
关于使用 yGuard 与服务提供商接口(interface)混合进行 Java 混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13031141/