2012-03-17 6 views
2

私はこれをカバーする応答を見逃してしまった場合は申し訳ありませんが、私は似たものを見つけることについて勤勉に努力しました。Proguard keepclassmembersはクラスを保持します

私はProguardの動作に本当に混乱しています。私が間違ったドキュメントを読んでいるのか、動作が間違っているのか疑問です。

クラスが保持されている場合、注釈付きのフィールドとメンバーをクラス内に保持したいと考えています。

-keepclassmembers class com.mycompany.** { 
    @com.mycompany.** 
    public com.mycompany.** *; 
    @com.mycompany.** 
    public void *(com.mycompany.**); 
} 

(この設定はGUIで構築されたが、私は、私はそれをやっているか見て考えていた)ProGuardのドキュメントが

-keepclassmembers [、修飾子を、言う:だから私はそうのようなkeepclassmembersを使用しました...] class_specification

保存するクラスメンバをクラスが保持されている場合に指定します。たとえば、すべてのシリアル化フィールドと、Serializableインターフェイスを実装するクラスのメソッドを保持することができます。

いいね。しかし、私は出力に期待しないクラスを取得しています。 -whyareyoukeeping class com.company.MyServiceImpl

com.mycompany.MyServiceImpl 
    is invoked by com.mycompany.MyServiceImpl: void handleEvent(com.mycompany.MyEvent) (34:35) 
    is kept by a directive in the configuration. 

handleEventだけので、クラス全体を維持する正当な理由ではないようですが、それが唯一の私は考えることができると思うのですMyServiceImpl内の別のメソッドを呼び出します。

keepclassmembersは、「そのクラスが保持されているだけでなく」指定されたメンバーを含むクラスに「keep」を強制的に表示するのはなぜですか?しかし、より直接的に、Proguardが既に他のルールを介して保管しているクラスで、公開注釈付きイベントリスナーを保持する方法はありますか?

+0

私は次のように実行可能なものになりました。 -keepclassmembers、allowobfuscationクラスcom.mycompany。** {@ com.mycompany。** ; } -keepclassmembers、allowshrinking、allowoptimization、allowobfuscationクラスcom.mycompany。** {@ com.mycompany。** ; } 「許可」修飾語は魔法のソースだと思いますが、その組み合わせは困惑しています。それは指令全体を元に戻すようです。 これは、将来何人かの人に数時間を節約できるアイデアを提供したいと考えています。 – Justin

答えて

3

初期設定と解釈が正しいように見えます。私は単純な例で試してみるとうまくいきます。注釈付きのフィールドとメソッドは、そのクラスがすでに保持されている場合に保持されます。もちろん、これらの注釈付きメソッドには、より多くのクラスでドラッグするコードが含まれる場合があります。

-whyareyoukeepingの出力は、ストーリーの半分しか伝えませんが、この場合はあまり役に立ちません。 -printseedsがヒントを提供しているかどうかを調べることができます。

'許可'修飾子を使用して実行可能な設定はあまり意味がないようです。私はそれをあまり信用しません。

まだバグがあると思われる場合は、ProGuard bug trackerに報告してください。問題の再現が可能な場合があります。

+0

私がコメントとして投稿した「働く」構成は、結局他の問題を引き起こしました。私は健全性チェックに感謝します。最終的に私は最適化のステップに戻りました。私はこれを後で再訪するチャンスを持っていますし、私は確かに元気な再生レシピがあるところは何でも報告します。 – Justin

関連する問題