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
修飾子はkeepclasseswithmembers
andallowshrinking
の省略形です。これは、私が正しく理解している場合、これらのクラスを削除することは許可されていますが、保持されている場合は、メンバー名を難読化しないでください(おそらく、 XML属性名とクラスセッター)。
しかし、それは、コードで直接参照されていない限り、これらのクラスが縮小フェーズ(allowshrinking = true)中に削除されることを意味しませんか?確かに、それは私たちがアプリで使用しているカスタムウィジェットで起こったことであり、ルールを設定することで問題を修正できます。これは、一致するクラスを完全に保持するだけだからです(これが公式のProGuardAndroidkeepclasseswithmembers
であることに注意してください)。例もそうです)。
ProGuardドキュメントを読み間違えていますか、それともADTプロジェクトウィザードのバグですか?