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

时间:2017-05-23 08:44:01

标签: android proguard obfuscation

我收到了错误

  

错误:任务':app:transformClassesAndResourcesWithProguardForDebug'的执行失败。   作业失败,请参阅日志了解详情

我收到很多警告,比如

  

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

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

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

[EDITED] 我也收到像

这样的警告
  

警告: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现在没有失败。但是,我不确定这是否是最佳做法以及在忽略这些警告后可以打破什么?

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

<强>更新

  

而proguard现在并没有失败。但是,我不确定那是否是最好的   练习以及忽略这些警告后可以打破什么?

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

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

  

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

<强>原始

  

class java.awt.Point

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

最简单的解决方案就是抑制警告:

-dontwarn java.awt.**