java.io.IOException:在Maven构建的Android项目中运行ProGuard时无法处理类

时间:2013-09-14 03:50:11

标签: android itext proguard bouncycastle spongycastle

我使用名为iText的库将新信息写入现有PDF。为了加密PDF,iText(适用于Android)使用名为SpongyCastle的库,这是一个BouncyCastle的Android端口。不幸的是,iText和Spongycastle都包含大量的方法(15k +)。在Android中,您可以使用的方法数量有一个硬限制(64k)。幸运的是,iText在Spongycastle jar中没有使用很多类。

我能够解压缩Spongycastle jar并删除iText不使用的所有类并重新压缩文件。

一切都很有效,直到我在maven构建中运行proguard以生成最终的apk。我得到了以下对我没有意义的IOException。

非常感谢您帮助解决此错误。

提前谢谢你。我还包括了引用bouncycastle的proguard.cfg部分。

-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

1 个答案:

答案 0 :(得分:3)

问题是你的重新打包的jar包含*.class个文件,这些文件没有以正确的魔术字节开头,这样的文件应该以它开头,即0xCAFEBABE,参见this wikipedia article

它还命名了有问题的文件:

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

命名方案表明这确实不是*.class文件,而是由某些Mac zip程序添加的元文件。 Proguard不知道这样的Mac特定的东西,因此,跌倒。

因此,当您重新压缩文件时,您必须注意不要添加此类Mac特定内容。这可以通过例如使用Java SDK jar实用程序或非Mac zip实用程序。