Java 尽管保留了类,但仍会发出Proguard警告

Java 尽管保留了类,但仍会发出Proguard警告,java,android,proguard,Java,Android,Proguard,我正在使用Proguard压缩我的代码。我的策略是启用它,然后按照警告保留它抱怨的任何内容。如果有外部库,我会尝试遵循作者提供的Proguard说明。许多指令包括-dontwarn标志。如果禁用-dontwarn标志,将收到警告。如果我们通过-keep标志保留大多数类,为什么还会出现警告? 例如: -保留类javax.*{*;} #黄油刀 -保持类butterknife.*{*;} -dontwarn butterknife,内部** -保持类**$$ViewBinder{*;} -KeepCl

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

-保留类javax.*{*;}
#黄油刀
-保持类butterknife.*{*;}
-dontwarn butterknife,内部**
-保持类**$$ViewBinder{*;}
-KeepClassSwithMemberNames类*{
@黄油刀*;
}
-KeepClassSwithMemberNames类*{
@黄油刀*;
}
警告:butterknife.internal.ButterKnifeProcessor:找不到引用的类javax.annotation.processing.AbstractProcessor
警告:butterknife.internal.ButterKnifeProcessor:找不到引用的类javax.annotation.processing.ProcessingEnvironment
警告:butterknife.internal.ButterKnifeProcessor:找不到引用的类javax.lang.model.element.TypeElement
警告:butterknife.internal.ButterKnifeProcessor:找不到引用的类javax.lang.model.element.element
警告:butterknife.internal.ButterKnifeProcessor:找不到引用的类javax.annotation.processing.Filer
警告:butterknife.internal.ButterKnifeProcessor:找不到引用的类javax.tools.JavaFileObject
...

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

我明白了。那么,在编译外部库时,我应该使用
-injars
-libraryjars
吗?如果您在Android项目中使用Gradle build,它将根据项目依赖关系为您设置所有
-injars
-libraryjars
。不需要额外的设置。啊,有道理。谢谢
Warning:A: can't find referenced class B