Android,ProGuard和keepclasseswithmembernames

ProGuard配置Android应用程序的常见模式是保留自定义View类,因为它们可能仅从布局XML而不是应用程序代码引用。

在项目创建时,ADT因此将这些规则添加到项目的proguard.cfg中:

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

我想这里的想法是说每当一个类定义一个可以被布局inflater调用的构造函数,然后保留它。 但是,根据ProGuard文档, keepclasseswithmembernames限定符是keepclasseswithmembersallowshrinking简写,如果我理解正确的意思是:它被允许删除这些类,但如果它们被保留,不要混淆其成员名称(可能不是打破XML属性名称和类设置器之间的绑定。

但这是否意味着在缩小阶段(allowshrinking = true)仍会删除这些类,除非它们直接在代码中引用? 确实这就是我们在我们的应用程序中使用的自定义小部件所发生的事情,我可以通过将规则设置为keepclasseswithmembers来解决问题,因为这将完全保留匹配的类(值得注意的是这就是官方的ProGuard Android示例也是如此)。

我误读了ProGuard文档,或者这是ADT项目向导中的错误?

Android SDK中的配置(至少版本11)确实不完全正确。

ProGuard文档中的Android配置正确指定“-keepclasseswithmembers”,而不是“-keepclasseswithmembernames”。

当我第一次尝试使用Ant的集成proguard时,我的应用程序一直在点击处理程序上出现运行时错误。 (我总是用XML设置它们)。 我以为我一定做错了什么,弄不出什么,所以补充了这条线

 -dontshrink 

在proguard.cfg的顶部。

也许这不是最佳的,但它可以阻止运行时错误!

附录

事实上,我通过查看usage.txt检查了这一点。 在我添加dontshrink选项之前列出了clickhandlers,在我添加之后,usage.txt是空的,如预期的那样。