ProGuard配置
Android应用程序的常见模式是保留自定义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); }
我想这里的想法是说每当一个类定义一个可以被布局inflater调用的构造函数,然后保留它.但是,根据ProGuard文档,keepclasseswithmembernames限定符是keepclasseswithmembers和allowshrinking的简写,如果我理解正确的意思是:它被允许删除这些类,但如果它们被保留,不要混淆其成员名称(可能不是打破XML属性名称和类设置器之间的绑定.
但这是否意味着在缩小阶段(allowshrinking = true)仍会删除这些类,除非它们直接在代码中引用?确实这就是我们在我们的应用程序中使用的自定义小部件所发生的事情,我可以通过将规则设置为keepclasseswithmembers来解决问题,因为这将完全保留匹配的类(值得注意的是这是官方的ProGuard Android example也是.)
我误读了ProGuard文档,或者这是ADT项目向导中的错误?
解决方法
Android SDK中的配置(至少版本11)确实不完全正确.
ProGuard文档中的configuration for Android正确指定了“-keepclasseswithmembers”,而不是“-keepclasseswithmembernames”.