proguard地狱 - 找不到引用的类

时间:2011-08-07 16:53:48

标签: android proguard

所以,我尝试发布一些软件,但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.
[ 

警告似乎与simpleframework有关,所以在我的proguard配置文件中我添加了以下内容:

-libraryjars pathtoprojecttolibs\simple-xml-2.4.jar

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

这没什么区别。

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

有什么想法吗?

9 个答案:

答案 0 :(得分:125)

代码中的

org.simpleframework.xml.stream.StreamReader引用javax.xml.stream.events.XMLEvent。后一类是Java运行时(rt.jar)的一部分,但不是Android运行时(android.jar)的一部分,因此ProGuard会警告某些内容可能会被破坏。如果您确定您的应用程序仍然有效,则可以指定

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

ProGuard地狱?

答案 1 :(得分:8)

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

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

original answer is here

答案 2 :(得分:5)

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

enter image description here

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

答案 3 :(得分:2)

您应该在Proguard配置中包含这个:

-dontskipnonpubliclibraryclasses

答案 4 :(得分:2)

My Magic键解决了我的搜索时间:将其添加到proguard-android.txt

-dontskipnonpubliclibraryclassmembers

答案 5 :(得分:0)

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

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

答案 6 :(得分:0)

我认为这是一个边缘案例,但在我的情况下,我必须彻底擦除我的Jenkins proguard上的构建文件夹,试图使用旧代码,而不再存在 - 只是以防任何人有同样的问题。

答案 7 :(得分:0)

在我的情况下,我没有改变任何事情,警告开始显示。问题出在gradle缓存中。检查我的其他answer。我与此分享,因为我花了2个小时才发现问题:]

答案 8 :(得分:0)

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

-dontwarn package.class.name.**

其中package.class.name是程序包名称,后面是jar文件的类名。

例如:

-dontwarn com.myexternalclass.utils.**