【问题标题】:proguard hell - can't find referenced classproguard hell - 找不到引用的类
【发布时间】:2011-10-21 21:36:26
【问题描述】:

所以,我尝试发布一些软件,但 Proguard 让我头疼。

当我尝试使用 proguard 导出时,我收到很多警告,即“找不到引用的类”

例如:

[2011-08-07 17:44:37 - GAME] Warning: org.simpleframework.xml.stream.StreamReader: can't find referenced class javax.xml.stream.events.XMLEvent
[2011-08-07 17:44:37 - GAME] Warning: there were 52 unresolved references to classes or interfaces.
[2011-08-07 17:44:37 - GAME]          You may need to specify additional library jars (using '-libraryjars'),
[2011-08-07 17:44:37 - GAME]          or perhaps the '-dontskipnonpubliclibraryclasses' option.
[2011-08-07 17:44:37 - GAME] java.io.IOException: Please correct the above warnings first.
[ 

警告似乎与简单框架有关,因此在我的 proguard 配置文件中,我添加了以下内容:

-libraryjars pathtoprojecttolibs\simple-xml-2.4.jar

pathtoprojecttolibs 是我的项目引用的 jar 的路径。

这没什么区别。

如果 simpleframework 引用 javax,我可以告诉 proguard 也忽略这个吗??

有什么想法吗?

【问题讨论】:

  • 你使用proguard只是为了做treeshaking吗?如果是这样,您是否在不使用文件的情况下检查了文件大小?当 proguard 抛出一些使用反射访问的东西时,你可能会遇到非常奇怪的错误,例如,在它破坏运行时你不会找到它,所以真的,真的确定你需要它。
  • 我真的只是用它来尝试保护被划伤的代码吗?你觉得值得吗?
  • @ListenToRick Proguard 非常好,如果它使用正确的配置运行并且您的结果应用程序测试正确。我很确定谷歌甚至推荐使用它。 Google 提供了很多关于在 Android 应用中使用 Proguard 的指南/示例。
  • Proguard 是一个很好的工具,但谷歌推荐它可能至少和其他任何东西一样,因为 dex 格式的大小限制相当奇怪。 (见code.google.com/p/android/issues/detail?id=7147
  • @alun,这不是原因。我们这些不希望我们的应用程序进行反向工程的人,或者那些使用许可来“尝试”防止盗版的人应该使用诸如此类的混淆工具,以使其更难成为黑客。使您的应用程序占用更少的空间对最终用户来说也是一个好处,而且这些工具还进行了优化......还有另一个好处。

标签: android proguard


【解决方案1】:

您的代码中的org.simpleframework.xml.stream.StreamReader 指的是javax.xml.stream.events.XMLEvent。后一个类是 Java 运行时 (rt.jar) 的一部分,但不是 Android 运行时 (android.jar) 的一部分,因此 ProGuard 会发出警告,表示某些内容可能已损坏。如果您确定您的应用程序仍然可以正常工作,您可以指定

-dontwarn javax.xml.stream.events.**

ProGuard 地狱?

【讨论】:

  • 这并没有为我解决问题,但是 -dontwarn javax.xml.**
  • 添加 -libraryjars <java.home>/lib/rt.jar 为我解决了这个问题。
  • 我收到了关于例如 javax.xml.stream.XMLInputFactory 的其他警告,所以我使用了-dontwarn javax.xml.stream.**
  • 如何设置-dontwarn 唱GUI?
  • 奇怪的是,我在 2018 年仍然遇到这个问题,我不确定我错过了什么,但是这个解决方案在 2018 年仍然适用,没有一些缺点吗?
【解决方案2】:

就我而言,根本原因是here。那些你可以跳过的警告:

-dontwarn org.simpleframework.xml.stream.**

original answer is here

【讨论】:

    【解决方案3】:

    出现此错误是因为您使用的库依赖于其他未真正使用的库,但 Proguard 正在寻找它们。
    -dontwarn 行添加到 Android 项目中的 proguard-rules.pro 文件中以禁用此警告。

    您可以在错误的堆栈跟踪中找到需要添加到 proguard-rules.pro 的依赖项。

    【讨论】:

      【解决方案4】:

      你应该在你的 Proguard 配置中加入这个:

      -dontskipnonpubliclibraryclasses
      

      【讨论】:

      • 嗯,当时对我有用...~4 年前...从那以后情况可能发生了变化 :) 似乎至少对其他 2 人有效。
      • 默认的proguard-android.txt已经有这一行了。
      • @Ultimecia 提交是从 2013 年开始的,这篇文章是在 2011 年发表的
      【解决方案5】:

      解决了我数小时搜索的神奇钥匙:将此添加到 progruard-android.txt

      -dontskipnonpubliclibraryclassmembers
      

      【讨论】:

        【解决方案6】:

        嗯。阅读该警告,您尝试使用的库似乎依赖于 javax.xml.stream.events。我认为命名空间实际上根本不包含在 android 中。 (见Package Index)。

        尝试在不使用 proguard 的情况下将其部署到模拟器,看看它是否有效。如果该警告是准确的,我的猜测是不会。

        【讨论】:

        • 嗨,如果它在没有proguard的模拟器中工作,这意味着警告不准确?我试图弄清楚为什么我有这些类似的警告。我不想只是压制警告。
        【解决方案7】:

        我认为这是一个边缘案例,但在我的情况下,我必须完全擦除我的 Jenkins proguard 上的构建文件夹,尝试使用不再存在的旧代码 - 以防万一有人遇到同样的问题。

        【讨论】:

          【解决方案8】:

          在我的情况下,我没有更改任何内容并且警告开始显示。问题在于损坏的 gradle 缓存。检查我的另一个answer。我分享这个是因为我花了 2 个小时才找到问题:]

          【讨论】:

            【解决方案9】:

            将此行添加到 gradle 脚本目录中的 proguard-rules.pro 文件中:

            -dontwarn package.class.name.**
            

            其中package.class.name是包名加上jar文件的类名。

            例如:

            -dontwarn com.myexternalclass.utils.**
            

            【讨论】:

              猜你喜欢
              • 2012-09-16
              • 2014-06-23
              • 2012-10-13
              • 2013-09-09
              • 1970-01-01
              • 1970-01-01
              • 2012-09-28
              • 2013-05-14
              • 1970-01-01
              相关资源
              最近更新 更多