尽管上课,仍然会有警告

时间:2016-04-05 14:50:11

标签: java android proguard

我正在使用Proguard缩小我的代码。我的策略是启用它,然后按照警告来保留它抱怨的任何内容。如果有外部库,我会尝试遵循作者提供的Proguard说明。许多说明都包含-dontwarn标志。如果我禁用-dontwarn标志,我会收到警告。如果我们通过-keep标志保留大多数课程,为什么还会出现警告? 例如:

-keep class javax.** { *; }

# for butterknife
-keep class butterknife.** { *; }
-dontwarn butterknife.internal.**
-keep class **$$ViewBinder { *; }

-keepclasseswithmembernames class * {
    @butterknife.* <fields>;
}

-keepclasseswithmembernames class * {
    @butterknife.* <methods>;
}

Warning:butterknife.internal.ButterKnifeProcessor: can't find referenced class javax.annotation.processing.AbstractProcessor
Warning:butterknife.internal.ButterKnifeProcessor: can't find referenced class javax.annotation.processing.ProcessingEnvironment
Warning:butterknife.internal.ButterKnifeProcessor: can't find referenced class javax.lang.model.element.TypeElement
Warning:butterknife.internal.ButterKnifeProcessor: can't find referenced class javax.lang.model.element.Element
Warning:butterknife.internal.ButterKnifeProcessor: can't find referenced class javax.annotation.processing.Filer
Warning:butterknife.internal.ButterKnifeProcessor: can't find referenced class javax.tools.JavaFileObject
...

1 个答案:

答案 0 :(得分:7)

ProGuard中有许多警告意味着不同的事情。这个特别的一个:

Warning:A: can't find referenced class B

意味着当ProGuard处理A类时,它遇到了对B类的引用。但是B类没有包含在源(-injars class_path)或库(-libraryjars class_path)中。

首先请注意,对于此特定警告,如果标准Android构建链添加-keep规则将无济于事。 ProGuard可传递地保留引用代码。

此警告可能由于多种原因而发生。库X通常可以包含使用另一个库Y的代码.X可选地使用Y - 只有当类路径中存在Y时,X才会强制存在Y.这样ProGuard就无法从Y中找到类。 要消除警告,您必须添加Y作为依赖项或忽略相关警告。

在ButterKnife的情况下,情况略有不同。 Butterknife使用注释处理。它在一个依赖项中包含库和注释处理器(最新版本7.0.1)。所以类butterknife.internal.ButterKnifeProcessor仍然存在于已编译的类中(即使它的工作已经完成 - 在java编译期间使用)。 ProGuard尝试处理它。 ProGuard无法找到缺失的类,因为它们仅在注释处理期间使用,并且不适用于ProGuard处理。 在这种情况下,确实有必要忽略警告。