2017-01-04 4 views
1

難読化ステップでクラス全体を保持する必要があるアノテーションを作成しました。Proguardの内部クラスのフィールドとメソッドを保持する方法(クラス自体だけでなく)

それから私はすべてを保つために、次のProGuardの設定を使用します。

@ProguardKeepEverything 
public class APublicModel { 
    private String aField; 
} 

しかし、今私が持っている:

-keep @com.my.project.annotations.ProguardKeepEverything class * { *; } 

だから、次のクラスとそのメンバー(税込名)が保持されます内部クラス:

@ProguardKeepEverything 
public class APublicModel { 
    private String aField; 

    public static class InnerPublicClass { 
     private String innerAField; 
    } 
} 

したがって、次のルールを追加します。

-keep @com.my.project.annotations.ProguardKeepEverything class *$* { *; } 

とも

-keep @com.my.project.annotations.ProguardKeepEverything class *$** { *; } 

をしようと試みた。しかし、今ではそれ自体のみ内部クラス(と名前)を保持しますが、そのフィールドやメソッドが難読化されています。内部クラスのメソッドとフィールドを難読化しないようにするにはどうすればいいですか(つまり、名前はそのままです)。

クラスが難読化されているかどうかは、seed.txtapktoolです。


次の質問だけでなく、そのメソッド、クラッセを維持する気に:

答えて

1

バイトコードの観点から、内部クラスは通常のクラスです。彼らは...$...の名前(リフレクションとコンパイラのためにInnerClassesの属性)しか持っていません。 ProGuardはそれらを別々に扱いません。したがって、追加ルールは注釈を持つ内部クラスにのみ一致します。この時点で私が見る最良の解決策は、メインルールを指定し、内部クラスに注釈を付けることです。

背景:ProGuardのルールのパターンは、一致する要素と結果として保持される要素を指定します(-keep-keepclassmembers、および-keepclasseswithmembersの間にわずかなバリエーションがあります)。したがって、「あるクラスが他のクラスを保持している場合は」を指定することはできません。これは非常にめったに必要ではなく、ルールはすでに複雑になる可能性がありますが、私はより一般的な拡張を検討しています。

関連する問題