使用 yGuard 与服务提供商接口(interface)混合进行 Java 混淆

标签 java obfuscation yguard

我在使用 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/

相关文章:

javascript - 如何击败混淆的 javascript 代码的反混淆?

node.js - 在整个 Node 项目上使用 UglifyJs?

java - 在 Eclipse 中使用 yGuard 混淆库

java - "cascading" hibernate 实体监听器?

java - 使用 while 循环记分的问题 (Java)

javascript - 使 JS 代码不可读/重到 "hack"

java - Spring 启动:unable to open nested entry 'WEB-INF/lib-provided/ecj-3.12.3.jar'

ant - 如何使用 Ant 和 YGuard 混淆我的 Web 应用程序 project.war?

java - 什么设计模式正在分离变换转换器

java - 在 Java 中为 TrayIcon 更改 PopupMenu 的 LAF