使用Eclipse SDK 3.7.1的Proguard 4.7:Proguard因java.io.IOException而失败 - (堆栈映射框中的未知验证类型[25])

时间:2012-01-16 08:44:42

标签: android eclipse proguard

更新:此问题在三星的SPen SDK的新版本中得到修复。

我正在尝试使用Eclipse 3.7.1创建一个已签名的APK,并在此过程中运行Proguard 4.7。 但是,我无法在包含三星的SPen SDK 1.5的项目上运行Proguard并出现以下错误:

[2012-01-16 14:16:45 - SDraw_Example1] Proguard returned with error code 1. See console
[2012-01-16 14:16:45 - SDraw_Example1] java.io.IOException: Can't read [C:\Work\Mobile\EclipseWorkspace\SDraw_Example1\libs\libspen.jar] (Can't process class [com/samsung/sdraw/CanvasView.class] (Unknown verification type [25] in stack map frame))
[2012-01-16 14:16:45 - SDraw_Example1]  at proguard.InputReader.readInput(InputReader.java:230)
[2012-01-16 14:16:45 - SDraw_Example1]  at proguard.InputReader.readInput(InputReader.java:200)
[2012-01-16 14:16:45 - SDraw_Example1]  at proguard.InputReader.readInput(InputReader.java:178)
[2012-01-16 14:16:45 - SDraw_Example1]  at proguard.InputReader.execute(InputReader.java:78)
[2012-01-16 14:16:45 - SDraw_Example1]  at proguard.ProGuard.readInput(ProGuard.java:196)
[2012-01-16 14:16:45 - SDraw_Example1]  at proguard.ProGuard.execute(ProGuard.java:78)
[2012-01-16 14:16:45 - SDraw_Example1]  at proguard.ProGuard.main(ProGuard.java:492)
[2012-01-16 14:16:45 - SDraw_Example1] Caused by: java.io.IOException: Can't process class [com/samsung/sdraw/CanvasView.class] (Unknown verification type [25] in stack map frame)
[2012-01-16 14:16:45 - SDraw_Example1]  at proguard.io.ClassReader.read(ClassReader.java:112)
[2012-01-16 14:16:45 - SDraw_Example1]  at proguard.io.FilteredDataEntryReader.read(FilteredDataEntryReader.java:87)
[2012-01-16 14:16:45 - SDraw_Example1]  at proguard.io.JarReader.read(JarReader.java:65)
[2012-01-16 14:16:45 - SDraw_Example1]  at proguard.io.DirectoryPump.readFiles(DirectoryPump.java:65)
[2012-01-16 14:16:45 - SDraw_Example1]  at proguard.io.DirectoryPump.pumpDataEntries(DirectoryPump.java:53)
[2012-01-16 14:16:45 - SDraw_Example1]  at proguard.InputReader.readInput(InputReader.java:226)
[2012-01-16 14:16:45 - SDraw_Example1]  ... 6 more
[2012-01-16 14:16:45 - SDraw_Example1] Caused by: java.lang.RuntimeException: Unknown verification type [25] in stack map frame
[2012-01-16 14:16:45 - SDraw_Example1]  at proguard.classfile.io.ProgramClassReader.createVerificationType(ProgramClassReader.java:890)
[2012-01-16 14:16:45 - SDraw_Example1]  at proguard.classfile.io.ProgramClassReader.visitFullFrame(ProgramClassReader.java:659)
[2012-01-16 14:16:45 - SDraw_Example1]  at proguard.classfile.attribute.preverification.FullFrame.accept(FullFrame.java:114)
[2012-01-16 14:16:45 - SDraw_Example1]  at proguard.classfile.io.ProgramClassReader.visitStackMapTableAttribute(ProgramClassReader.java:452)
[2012-01-16 14:16:45 - SDraw_Example1]  at proguard.classfile.attribute.preverification.StackMapTableAttribute.accept(StackMapTableAttribute.java:71)
[2012-01-16 14:16:45 - SDraw_Example1]  at proguard.classfile.io.ProgramClassReader.visitCodeAttribute(ProgramClassReader.java:422)
[2012-01-16 14:16:45 - SDraw_Example1]  at proguard.classfile.attribute.CodeAttribute.accept(CodeAttribute.java:101)
[2012-01-16 14:16:45 - SDraw_Example1]  at proguard.classfile.io.ProgramClassReader.visitProgramMethod(ProgramClassReader.java:200)
[2012-01-16 14:16:45 - SDraw_Example1]  at proguard.classfile.io.ProgramClassReader.visitProgramClass(ProgramClassReader.java:142)
[2012-01-16 14:16:45 - SDraw_Example1]  at proguard.classfile.ProgramClass.accept(ProgramClass.java:346)
[2012-01-16 14:16:45 - SDraw_Example1]  at proguard.io.ClassReader.read(ClassReader.java:91)
[2012-01-16 14:16:45 - SDraw_Example1]  ... 11 more

报告了Java 7的类似问题,但我的Java编译器合规性级别设置为1.6,我在“已安装的JRE”中检查了jre6。

您可以在Samsung Mobile网站上获取源代码以重现问题: http://innovator.samsungmobile.com/down/cnts/toolSDK.detail.view.do?platformId=1&cntsId=10210

我正在尝试导出上面Zip文件中包含的示例项目SDraw_Example1。

有关可能导致问题的原因以及如何解决问题的任何想法? 谢谢!

2 个答案:

答案 0 :(得分:1)

问题是由附加到SPen库(libspen.jar)中的方法的损坏的预验证信息(StackMapTable属性)引起的。该库似乎已经使用ProGuard本身进行了处理,但可能是预先验证错误配置,或者其他工具随后破坏了预验证信息。您可以修改ProGuard以忽略该属性,甚至再次验证库。我将在your thread的开发者论坛上通知三星。

答案 1 :(得分:1)

我遇到了同样的问题但是当我将输出类格式更改为1.6时它就消失了。 似乎spenlib.jar是用类格式1.6编译的,你的编译器设置为1.5,反之亦然。 我不知道为什么proguard抱怨它但它起作用了。