Proguard给了我很多警告并且失败了

Posted

技术标签:

【中文标题】Proguard给了我很多警告并且失败了【英文标题】:Proguard gives me a lot of warnings and fails 【发布时间】:2017-10-23 02:51:16 【问题描述】:

我收到了错误

错误:任务 ':app:transformClassesAndResourcesWithProguardForDebug' 执行失败。 作业失败,查看日志了解详情

我收到很多警告,例如

警告:es.usc.citius.hipster.util.examples.maze.MazeSearch$Result:找不到引用的类 java.awt.Point

这对我来说看起来很奇怪,因为在我的 proguard-rules 中我添加了这条规则

-keep public class es.usc.citius.hipster.**  *; 

[已编辑] 我也收到类似

的警告

警告:com.mypackage.android.dagger.modules.AppModule_ProvideAccelerometerSensorFactory: 找不到超类或接口 dagger.internal.Factory

我添加了匕首规则

-dontwarn dagger.internal.codegen.**
-keepclassmembers,allowobfuscation class * 
    @javax.inject.* *;
    @dagger.* *;
    <init>();


-keep class dagger.*  *; 
-keep class javax.inject.*  *; 
-keep class * extends dagger.internal.Binding
-keep class * extends dagger.internal.ModuleAdapter
-keep class * extends dagger.internal.StaticInjection

以及保存我的包裹的规则

-keep public class com.mypackage.android.**  *; 

在关于忽略警告的答案之后,我添加了这条规则

-dontwarn com.mypackage.android.**

proguard 现在不会失败。但是,我不确定这是否是最佳做法以及忽略这些警告后可以打破什么?

【问题讨论】:

proguard hell - can't find referenced class的可能重复 【参考方案1】:

库类es.usc.citius.hipster.util.examples.maze.MazeSearch 引用包java.awt.Point,它是JDK 的一部分,但不是Android JDK,它不包含此包。 你只是不能在 Android 环境中使用它。

【讨论】:

谢谢!我编辑了,我的问题。将不胜感激回答和澄清我的疑问。【参考方案2】:

更新

proguard 现在不会失败。但是,我不确定这是否是最好的 实践以及忽略这些警告后可以破坏什么?

Android 有自己的图形库(例如 android.graphics),请使用它而不是 Java AWT 类。

这是来自java.awt.Toolkit 的非常有用的评论:

警告:这是针对 AWT 加载本机库方式中的问题的临时解决方法。 AWT 包中的许多类都有一个本地方法 initIDs(),它初始化在其实现的本地部分中使用的 JNI 字段和方法 ID。由于这些 id 的使用和存储是由实现库完成的,因此这些方法的实现由特定的 AWT 实现(例如,“Toolkit”s/Peer)提供,例如 Motif、Microsoft Windows 或 Tiny。问题是这意味着本地库必须由 java.* 类加载,它们不一定知道要加载的库的名称。更好的方法是提供一个单独的库来定义 java.awt.* initID,并将相关符号导出到实现库。现在,我们知道它是由实现完成的,我们假设库的名称是“awt”。 -br。如果您更改 loadLibraries(),请将更改添加到 java.awt.image.ColorModel.loadLibraries()。不幸的是,类可以加载到依赖于 libawt 的 java.awt.image 中,并且无法直接调用 Toolkit.loadLibraries()。 -挂

原创

类 java.awt.Point

java.awt.* 类不是 Android 运行时的一部分。最好的解决方案是删除引用它们的类。

最简单的解决方案就是取消警告:

-dontwarn java.awt.**

【讨论】:

谢谢!我编辑了,我的问题。将不胜感激回答和澄清我的疑问。

以上是关于Proguard给了我很多警告并且失败了的主要内容,如果未能解决你的问题,请参考以下文章

PebbleFramework 给了我很多警告和错误

尽管阅读了常见问题解答,ProGuard 仍因“警告:类 [*] 意外包含类 [*]”而失败

使用 Proguard 混淆 ActionBarSherlock

如何使用 proguard 获取发布构建 apk 文件

原创解决Maven ProGuard不混淆局部变量的问题,以及如何使用混淆好的包

我可以使用 .pkl 文件,即使它给了我一个折旧警告?