首页 文章

尽管上课,仍然会有警告

提问于
浏览
4

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

  • 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 仍然存在于已编译的类中(即使它真的需要's work is already finished - used during java compilation). And ProGuard tries to process it. ProGuard fails to find the missing classes because they were used only during annotation processing and are not present for ProGuard processing. In this case it'来忽略警告 .

相关问题