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