1

yGuardでJavaライブラリを難読化するのに問題があります。このライブラリの一部は、サービスプロバイダーインターフェイス(SPI)の実装であると想定されているため、難読化プロセスから除外する必要があります。このライブラリを使用する難読化されていないバージョンのアプリケーションは、問題なく動作します。ただし、難読化プロセスの後は、そうではありません。

<shrink>これは、yGuardのANTタスクの要素が不適切に設定されていることが原因であると思われます。未使用と見なされるため、一部のメソッドが削除される可能性があります。パッケージとクラスが難読化の名前変更フェーズ()内で除外されていることを確認した<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インターフェースを実装しています。これらは、 Jingを使用してSPIを介して呼び出すことができます。

yGuardを使用して、難読化プロセス(名前の変更と縮小の両方)から除外するパッケージ全体を指定するにはどうすればよいですか?

4

1 に答える 1

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 が難読化の縮小と名前変更から除外されます。サービス プロバイダーの実装をインスタンス化できるようにする部分だけを除外する必要があります。

于 2012-10-24T07:31:50.407 に答える