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
and allowshrinking
,如果我理解正确的话,这意味着:允许删除这些类,但如果保留它们,请不要混淆其成员名称(可能是为了不破坏 XML 属性名称和类设置器之间的绑定)。
但这是否意味着这些类仍将在收缩阶段被删除(allowshrinking = true),除非在代码中直接引用它们?事实上,这就是我们在应用程序中使用的自定义小部件所发生的情况,我可以通过将规则设置为来解决这个问题keepclasseswithmembers
因为这将完全保留匹配的类(值得注意的是,这是官方的ProGuard Android 示例也是如此)。
我是否误读了 ProGuard 文档,或者这是 ADT 项目向导中的错误?
事实上,Android SDK(至少到版本 11)中的配置并不完全正确。
The 安卓配置ProGuard 文档中正确指定“-keepclasseswithmembers”,而不是“-keepclasseswithmembernames”。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)