java.io.IOException: не удается обработать класс при запуске ProGuard в сборке Maven проекта Android

Я использую библиотеку iText для записи новой информации в существующие PDF-файлы. Для шифрования PDF-файлов iText (для Android) использует библиотеку SpongyCastle, которая является портом BouncyCastle для Android. К сожалению, и iText, и Spongycastle содержат очень большое количество методов (15k +). В Android существует жесткое ограничение на количество методов, которые вы можете использовать (64 КБ). К счастью, iText не использует много классов в банке Spongycastle.

Мне удалось разархивировать банку Spongycastle и удалить все классы, которые iText не использует, и повторно заархивировать файл.

Все работает отлично, пока я не запустил proguard в сборке maven для создания финального apk. Я получаю следующее исключение IOException, которое для меня не имеет смысла.

Мы будем очень признательны за вашу помощь в разрешении этой ошибки.

Заранее спасибо. Я также включил часть proguard.cfg, которая ссылается на bouncycastle.

-keep class org.bouncycastle.crypto.** {*;}




[DEBUG] Reading program jar [.m2/repository/com/madgag/sc-light-jdk15on/1.47.0.2/sc-light-jdk15on-1.47.0.2-reduced.jar] (filtered)
[INFO] Warning: class [spongycastleseriouslyreduced/org/spongycastle/asn1/ASN1InputStream.class] unexpectedly contains class [org.spongycastle.asn1.ASN1InputStream]
[INFO] Warning: class [spongycastleseriouslyreduced/org/spongycastle/asn1/DEROutputStream.class] unexpectedly contains class [org.spongycastle.asn1.DEROutputStream]
[INFO] Warning: class [spongycastleseriouslyreduced/org/spongycastle/crypto/BlockCipher.class] unexpectedly contains class [org.spongycastle.crypto.BlockCipher]
[INFO] java.io.IOException: Can't read [.m2/repository/com/madgag/sc-light-jdk15on/1.47.0.2/sc-light-jdk15on-1.47.0.2-reduced.jar(;;;;!META-INF/maven/**,!META-INF/MANIFEST.MF)] (Can't process class [__MACOSX/spongycastleseriouslyreduced/org/spongycastle/crypto/._BlockCipher.class] (Invalid magic number [51607] in class))
[INFO]  at proguard.InputReader.readInput(InputReader.java:230)
[INFO]  at proguard.InputReader.readInput(InputReader.java:200)
[INFO]  at proguard.InputReader.readInput(InputReader.java:178)
[INFO]  at proguard.InputReader.execute(InputReader.java:78)
[INFO]  at proguard.ProGuard.readInput(ProGuard.java:196)
[INFO]  at proguard.ProGuard.execute(ProGuard.java:78)
[INFO]  at proguard.ProGuard.main(ProGuard.java:492)
[INFO] Caused by: java.io.IOException: Can't process class [__MACOSX/spongycastleseriouslyreduced/org/spongycastle/crypto/._BlockCipher.class] (Invalid magic number [51607] in class)
[INFO]  at proguard.io.ClassReader.read(ClassReader.java:112)
[INFO]  at proguard.io.FilteredDataEntryReader.read(FilteredDataEntryReader.java:87)
[INFO]  at proguard.io.FilteredDataEntryReader.read(FilteredDataEntryReader.java:87)
[INFO]  at proguard.io.JarReader.read(JarReader.java:65)
[INFO]  at proguard.io.DirectoryPump.readFiles(DirectoryPump.java:65)
[INFO]  at proguard.io.DirectoryPump.pumpDataEntries(DirectoryPump.java:53)
[INFO]  at proguard.InputReader.readInput(InputReader.java:226)
[INFO]  ... 6 more
[INFO] Caused by: java.lang.UnsupportedOperationException: Invalid magic number [51607] in class
[INFO]  at proguard.classfile.util.ClassUtil.checkMagicNumber(ClassUtil.java:47)
[INFO]  at proguard.classfile.io.ProgramClassReader.visitProgramClass(ProgramClassReader.java:79)
[INFO]  at proguard.classfile.ProgramClass.accept(ProgramClass.java:346)
[INFO]  at proguard.io.ClassReader.read(ClassReader.java:91)
[INFO]  ... 12 more

person Matt Wear    schedule 14.09.2013    source источник


Ответы (1)


Проблема в том, что ваш повторно упакованный jar содержит *.class файлы, которые не начинаются с правильных магических байтов, с которых, как ожидается, должен начинаться такой файл, то есть 0xCAFEBABE, см. эта статья в Википедии.

Он также называет файл, о котором идет речь:

__MACOSX/spongycastleseriouslyreduced/org/spongycastle/crypto/._BlockCipher.class

Схема именования указывает, что это действительно не *.class файл, а метафайл, добавленный какой-то программой Zip для Mac. Proguard не знает таких специфических для Mac вещей и, следовательно, падает.

Таким образом, когда вы повторно архивируете файл, вы должны позаботиться о том, чтобы не добавлять такие специфичные для Mac вещи. Это можно сделать, например, с помощью утилиты jar Java SDK или утилиты zip, отличной от Mac.

person mkl    schedule 14.09.2013
comment
Да, я вернулся, чтобы ответить на свой вопрос, и это действительно была проблема. Спасибо за вдумчивый ответ. - person Matt Wear; 15.09.2013