Proguard 4.7 с Eclipse SDK 3.7.1: сбой Proguard с java.io.IOException - (неизвестный тип проверки [25] во фрейме карты стека)

Обновление: эта проблема исправлена ​​в новых версиях Samsung SPen SDK.

Я пытаюсь создать подписанный APK с Eclipse 3.7.1, используя Proguard 4.7 как часть процесса. Однако я не могу запустить Proguard в проектах, которые включают Samsung SPen SDK 1.5, и получаю следующие ошибки:

[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, и я проверил jre6 в «Установленных JRE».

Вы можете получить исходный код для воспроизведения проблемы на веб-сайте Samsung Mobile здесь: http://innovator.samsungmobile.com/down/cnts/toolSDK.detail.view.do?platformId=1&cntsId=10210

Я пытаюсь экспортировать пример проекта SDraw_Example1, включенный в приведенный выше Zip-файл.

Любая идея о том, что может быть причиной проблемы и как ее исправить? Спасибо!


person Pooks    schedule 16.01.2012    source источник


Ответы (2)


Проблема вызвана поврежденной информацией предварительной проверки (атрибут StackMapTable), прикрепленной к методу в библиотеке SPen (libspen.jar). Похоже, что библиотека была обработана с помощью самого ProGuard, но, возможно, предварительная проверка была неправильно настроена или другой инструмент впоследствии испортил информацию о предварительной проверке. Вы можете изменить ProGuard так, чтобы он игнорировал этот атрибут и даже повторно выполнял предварительную проверку библиотеки. Я уведомлю Samsung в вашей теме на форуме их разработчиков.

person Eric Lafortune    schedule 16.01.2012
comment
Спасибо Эрик! Я просмотрел документацию Proguard, но не могу понять, как игнорировать атрибут StackMapTable, чтобы снова предварительно проверить библиотеку. Я пробовал это, но я просто снова получаю исходную ошибку, и Proguard не выдает никаких результатов. C:\Android\android-sdk\tools\proguard\lib>java -jar proguard.jar -injars libspen.jar -outjars libspen_rePG.jar -dontshrink -dontoptimize -dontobfuscate - person Pooks; 17.01.2012
comment
Нашел эту ветку sourceforge.net/tracker/, так что, наверное, я необходимо изменить исходный код Proguard и перестроить его. Я начал делать это, но столкнулся с различными проблемами. Существуют ли какие-либо справочные ресурсы по повторной сборке Proguard? - person Pooks; 17.01.2012
comment
Мне удалось пересобрать Proguard и снова выполнить предварительную проверку библиотеки, но те же ошибки возникают и с новой библиотекой (хотя неизвестный тип проверки теперь [37] вместо [25]). Поскольку мне это все равно абсолютно не нужно, я думаю, что просто брошу библиотеку, пока она не будет исправлена... - person Pooks; 18.01.2012

Я столкнулся с той же проблемой, но она исчезла, когда я изменил формат выходного класса на 1.6. кажется, что spenlib.jar скомпилирован с форматом класса 1.6, а ваш компилятор настроен на 1.5 или наоборот. Я понятия не имею, почему proguard жалуется на это, но это сработало.

person behumble    schedule 08.12.2012