【问题标题】:Proguard warnings despite kept classes尽管保持课程,但仍发出警告
【发布时间】:2016-04-05 14:50:10
【问题描述】:

我正在使用 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
...

【问题讨论】:

    标签: java android proguard


    【解决方案1】:

    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 处理中不存在。 在这种情况下,确实有必要忽略这些警告。

    【讨论】:

    • 我明白了。那我应该在编译外部库时使用-injars 和-libraryjars 吗?
    • 如果您为您的 Android 项目使用 Gradle 构建,它将根据项目依赖关系为您设置所有 -injars 和 -libraryjars。无需额外设置。
    • 嗯,有道理。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-21
    • 1970-01-01
    • 2011-07-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多