8

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 的简写keepclasseswithmembersallowshrinking如果我理解正确,这意味着:允许删除这些类,但如果保留它们,请不要混淆其成员名称(可能不会破坏之间的绑定) XML 属性名称和类设置器)。

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

我是误读了 ProGuard 文档还是 ADT 项目向导中的错误?

4

2 回答 2

7

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

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

于 2011-04-26T22:03:17.107 回答
0

当我第一次尝试使用 Ant 集成 proguard 时,我的应用程序不断因点击处理程序上的运行时错误而崩溃。(我总是在 XML 中设置这些)。我以为我一定做错了什么,无法弄清楚是什么,所以添加了行

-dontshrink

在 proguard.cfg 的顶部。

也许这不是最佳的,但它停止了运行时错误!

附录

事实上,我通过查看usage.txt 进行了检查。在我添加 dontshrink 选项之前,点击处理程序已在其中列出,在我添加它之后,usage.txt 正如预期的那样为空。

于 2011-04-26T21:07:47.650 回答