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
限定符是 and 的简写keepclasseswithmembers
,allowshrinking
如果我理解正确,这意味着:允许删除这些类,但如果保留它们,请不要混淆其成员名称(可能不会破坏之间的绑定) XML 属性名称和类设置器)。
但这是否意味着在收缩阶段(allowshrinking = true)仍将删除这些类,除非它们在代码中直接引用?事实上,这就是我们在应用程序中使用的自定义小部件所发生的情况,我可以通过将规则设置为 just 来解决问题,keepclasseswithmembers
因为这将完全保留匹配的类(值得注意的是,这是官方ProGuard Android例子也是如此)。
我是误读了 ProGuard 文档还是 ADT 项目向导中的错误?