8

AndroidアプリケーションのProGuard構成の一般的なパターンは、カスタムViewクラスを保持することです。これは、カスタムクラスが、アプリケーションコードではなくレイアウトXMLからのみ参照される可能性があるためです。

したがって、プロジェクトの作成時に、ADTはこれらのルールをプロジェクトのproguard.cfgに追加します。

-keepclasseswithmembernames class * {
   public <init>(android.content.Context, android.util.AttributeSet);
}

-keepclasseswithmembernames class * {
   public <init>(android.content.Context, android.util.AttributeSet, int);
}

ここでの考え方は、クラスがレイアウトインフレーターによって呼び出される可能性のあるコンストラクターを定義するときはいつでも、それを保持するということだと思います。ただし、ProGuardのドキュメントによると、keepclasseswithmembernames修飾子はkeepclasseswithmembersandallowshrinkingの省略形です。これは、私が正しく理解している場合、これらのクラスを削除することは許可されていますが、保持されている場合は、メンバー名を難読化しないでください(おそらく、 XML属性名とクラスセッター)。

しかし、それは、コードで直接参照されていない限り、これらのクラスが縮小フェーズ(allowshrinking = true)中に削除されることを意味しませんか?確かに、それは私たちがアプリで使用しているカスタムウィジェットで起こったことであり、ルールを設定することで問題を修正できます。これは、一致するクラスを完全に保持するだけだからです(これが公式のProGuardAndroidkeepclasseswithmembersであることに注意してください)。もそうです)。

ProGuardドキュメントを読み間違えていますか、それともADTプロジェクトウィザードのバグですか?

4

2 に答える 2

7

実際、Android SDKの構成(少なくともバージョン11まで)は完全には正しくありません。

ProGuardドキュメントのAndroidの構成では、「-keepclasseswithmembers」ではなく「-keepclasseswithmembers」が正しく指定されています。

于 2011-04-26T22:03:17.107 に答える
0

Antと統合されたプロガードを最初に試したとき、クリックハンドラーでランタイムエラーが発生してアプリがクラッシュし続けました。(私は常にこれらをXMLで設定します)。私は何か間違ったことをしているに違いないと思ったので、何がうまくいかなかったので、行を追加しました

-dontshrink

proguard.cfgの上部にあります。

おそらくこれは最適ではありませんが、実行時エラーを停止しました!

補遺

実際、usage.txtを見てこれを確認しました。クリックハンドラーは、dontshrinkオプションを追加する前はそこにリストされていましたが、追加した後は、予想どおり、usage.txtが空でした。

于 2011-04-26T21:07:47.650 に答える