当前位置: 首页 > 面试题库 >

Proguard警告,尽管上课不停

赫连明诚
2023-03-14
问题内容

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



 类似资料:
  • 已经在proguard-rules.pro上尝试了 -keepattributes cunclosingmethod和-dontwarn innerclasses ,但没有成功:( 你们有什么提示吗? 分级文件(主要部分): java-version&&javac-version java version“1.7.0_71” java(TM)SE运行时环境(构建1.7.0_71-B14) java

  • 我的代码可以工作,但每次运行到第13行时,它都会在命令窗口上写:“警告:冒号运算符用作索引时需要整数操作数”。我的代码的相关部分如下所示: 为什么会出现此警告,我可以忽略它吗?

  • 警告:处理任务java.io.ioException时出现异常:java.lang.IllegalArgumentException:找不到[com/google/android/gms/internal/measure/zzkf](有1个已知超级类)和[com/google/android/gms/internal/measure/zzko](有1个已知超级类)的通用超级类 我的proguard

  • 我得到一个错误,当我试图访问我自己的管理员4.8.0在路由与我的浏览器。它在没有Laragon的情况下工作。 使用: 拉拉贡4.0。16(其中包含Adminer 4.6.3应用程序) PHP8.0。三, 我得到以下错误:

  • 云联壹云平台支持对宿主机、虚拟机、云账号等资源的相关指标进行监控告警,告警消息支持通过机器人、邮件、短信、飞书、钉钉、企业微信等通知渠道发送给用户。 告警策略 告警策略即针对监控指标设置阈值,当资源的指标超过阈值时,将会立即通过通知渠道向用户发送告警消息,使用户可以快速响应解决问题。 告警历史 告警历史显示系统中所有的触发告警以及恢复告警的告警策略和资源信息。 告警资源 告警资源即宿主机、云账号等

  • 我正在使用python处理一些图像,并尝试将一系列大小为961x509的图像转换为MP4电影文件。我已经这样做了,它正在工作,但我有一个相当恼人的问题,警告说这样的话: 警告:根:图像FFMPEG_WRITER警告:输入图像不能被macro_block_size=16整除,大小从(509L,961L)到(512L,976L),以确保与大多数编解码器和播放器的视频兼容性。若要防止调整大小,请使输入图