尽管保留了 Proguard 警告 类
Proguard warnings despite kept classes
我正在使用 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
...
ProGuard 中有许多警告,含义各不相同。这个特别的:
Warning:A: can't find referenced class B
意味着当 ProGuard 正在处理 class A 时它遇到了对 class B 的引用。但是 class B 没有作为源包含在内(-injars class_path
)或者作为图书馆 (-libraryjars class_path
).
首先请注意,对于此特定警告,在标准 Android 构建链的情况下,添加 -keep
规则将无济于事。 ProGuard 可传递地保留引用代码。
出现此警告的原因有多种。通常一个库 X 可以包含使用另一个库 Y 的代码。并且 X 可选地使用 Y - 只有当 Y 出现在 class 路径上时,X 才不会强制存在 Y。这样 ProGuard 就无法找到 classes 来自 Y。
要消除警告,您必须将 Y 添加为依赖项或忽略相关警告。
ButterKnife 的情况略有不同。 Butterknife 使用注释处理。它在一个依赖项中同时包含库和注释处理器(最新版本 7.0.1)。所以 class butterknife.internal.ButterKnifeProcessor
仍然存在于编译的 classes 中(即使它的工作已经完成 - 在 java 编译期间使用)。 ProGuard 会尝试处理它。 ProGuard 无法找到缺失的 classes,因为它们仅在注释处理期间使用,并且不存在于 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
...
ProGuard 中有许多警告,含义各不相同。这个特别的:
Warning:A: can't find referenced class B
意味着当 ProGuard 正在处理 class A 时它遇到了对 class B 的引用。但是 class B 没有作为源包含在内(-injars class_path
)或者作为图书馆 (-libraryjars class_path
).
首先请注意,对于此特定警告,在标准 Android 构建链的情况下,添加 -keep
规则将无济于事。 ProGuard 可传递地保留引用代码。
出现此警告的原因有多种。通常一个库 X 可以包含使用另一个库 Y 的代码。并且 X 可选地使用 Y - 只有当 Y 出现在 class 路径上时,X 才不会强制存在 Y。这样 ProGuard 就无法找到 classes 来自 Y。 要消除警告,您必须将 Y 添加为依赖项或忽略相关警告。
ButterKnife 的情况略有不同。 Butterknife 使用注释处理。它在一个依赖项中同时包含库和注释处理器(最新版本 7.0.1)。所以 class butterknife.internal.ButterKnifeProcessor
仍然存在于编译的 classes 中(即使它的工作已经完成 - 在 java 编译期间使用)。 ProGuard 会尝试处理它。 ProGuard 无法找到缺失的 classes,因为它们仅在注释处理期间使用,并且不存在于 ProGuard 处理中。
在这种情况下,确实有必要忽略警告。