Обфускация Java с использованием yGuard с интерфейсом поставщика услуг в миксе

У меня проблемы с запутыванием библиотеки Java с помощью yGuard. Предполагается, что часть этой библиотеки является реализацией интерфейса поставщика услуг (SPI) и поэтому должна быть исключена из процесса запутывания. Не запутанная версия приложения, которое использует эту библиотеку, работает без проблем. Однако после процесса запутывания это не так.

Я подозреваю, что это из-за неправильной установки <shrink> элемент задачи ANT yGuard - он, вероятно, удаляет некоторые методы, поскольку они считаются неиспользованными. Я убедился, что пакет и классы исключены в фазе переименования обфускации (<rename>) так что это не должно быть причиной проблемы.

Я надеялся, что смогу избежать сжатия реализации 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"/>
        <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. Они могут быть вызваны через SPI с Jing.

Как я могу указать весь пакет, который нужно исключить из процесса запутывания (как переименовать, так и уменьшить) с помощью yGuard?

1 ответ

Решение

Внимательно прочитав документацию 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>

Это исключит сокращение и переименование общедоступного API определенного класса. Вам нужно только пропустить ту часть, которая позволяет реализовать реализацию вашего поставщика услуг.

Другие вопросы по тегам