2009-07-22 35 views
6

私はAntタスクを使用してProGuardでライブラリを難読化しています。ProGuardで難読化するときに内部クラスを公開する

彼らは、特定のアノテーション(@ApiAll)を持っているとき、私は特定のクラス名とそのメソッド名を維持していると私はのInnerClassesを保持する属性のことを要求しています:

<keepattribute name="InnerClasses" /> 
    <keep annotation="com.example.ApiAll"/> 
    <keepclassmembers annotation="com.example.ApiAll"> 
    <constructor access="public protected"/> 
    <field access="public protected"/> 
    <method access="public protected"/> 
    <constructor access="protected"/> 
    </keepclassmembers> 

私はマッピング出力をチェックしますファイル私は注釈を持っている私の内部クラスとそのメンバーが彼らの名前を曖昧にしていることがわかります。しかし、生成されたjarファイルを見るとクラスが見つかりません。

何か不足していますか?マッピングが、それがそうでないときにこのクラスを保持していると私に伝えているのはなぜですか?

答えて

20

適切な表記法を使用して内部クラスを保持するように指定する必要があります。 プロガード用語では、それは-keep class my.outer.Class$MyInnerClassを意味します。ここでのキーは、内部クラスと外部クラスのセパレータとしてドル記号($)を使用することです。

MyInnerClassが難読化されないように、これを行うには、-keepattributes InnerClassesも指定する必要があります。これらの2つの設定を合わせると、内部クラスをそのまま維持できます。

+0

Thanks Markus。これは私の問題を解決するのを助けた – Fenil

+0

これはyGuardと同じ問題の正解です – ygesher

0

オプションkeepclassmembersは、指定されたクラスメンバー(およびその名前)のみを保持します。

より一般的なオプションkeepが必要です。指定されたクラスのクラスメンバー(およびその名前)が保持されます。

Cfr。 ProGuard manual > Usage > Overview of Keep Options

関連する問題