Eclipse proguard 代码混淆 微信第三方库 Can\'t process class (Unknown verification type [95] in stack map frame)

来源:互联网 发布:如何让linux系统上网 编辑:程序博客网 时间:2024/05/22 16:50
今天编译一个android的Eclipse项目,不开启代码混淆能成功导出apk包,开启代码混淆后报错:

[2016-12-26 23:45:51 - test] Proguard returned with error code 1. See console
[2016-12-26 23:45:51 - test] java.io.IOException: Can't read [D:\xxx\test\code\android\libs\libammsdk.jar] (Can't process class [com/tencent/wxop/stat/al.class] (Unknown verification type [95] in stack map frame))
[2016-12-26 23:45:51 - test] at proguard.InputReader.readInput(InputReader.java:230)
[2016-12-26 23:45:51 - test] at proguard.InputReader.readInput(InputReader.java:200)
[2016-12-26 23:45:51 - test] at proguard.InputReader.readInput(InputReader.java:178)
[2016-12-26 23:45:51 - test] at proguard.InputReader.execute(InputReader.java:78)
[2016-12-26 23:45:51 - test] at proguard.ProGuard.readInput(ProGuard.java:196)
[2016-12-26 23:45:51 - test] at proguard.ProGuard.execute(ProGuard.java:78)
[2016-12-26 23:45:51 - test] at proguard.ProGuard.main(ProGuard.java:492)
[2016-12-26 23:45:51 - test] Caused by: java.io.IOException: Can't process class [com/tencent/wxop/stat/al.class] (Unknown verification type [95] in stack map frame)
[2016-12-26 23:45:51 - test] at proguard.io.ClassReader.read(ClassReader.java:112)
[2016-12-26 23:45:51 - test] at proguard.io.FilteredDataEntryReader.read(FilteredDataEntryReader.java:87)
[2016-12-26 23:45:51 - test] at proguard.io.JarReader.read(JarReader.java:65)
[2016-12-26 23:45:51 - test] at proguard.io.DirectoryPump.readFiles(DirectoryPump.java:65)
[2016-12-26 23:45:51 - test] at proguard.io.DirectoryPump.pumpDataEntries(DirectoryPump.java:53)
[2016-12-26 23:45:51 - test] at proguard.InputReader.readInput(InputReader.java:226)
[2016-12-26 23:45:51 - test] ... 6 more
[2016-12-26 23:45:51 - test] Caused by: java.lang.RuntimeException: Unknown verification type [95] in stack map frame
[2016-12-26 23:45:51 - test] at proguard.classfile.io.ProgramClassReader.createVerificationType(ProgramClassReader.java:890)
[2016-12-26 23:45:51 - test] at proguard.classfile.io.ProgramClassReader.visitFullFrame(ProgramClassReader.java:659)
[2016-12-26 23:45:51 - test] at proguard.classfile.attribute.preverification.FullFrame.accept(FullFrame.java:114)
[2016-12-26 23:45:51 - test] at proguard.classfile.io.ProgramClassReader.visitStackMapTableAttribute(ProgramClassReader.java:452)
[2016-12-26 23:45:51 - test] at proguard.classfile.attribute.preverification.StackMapTableAttribute.accept(StackMapTableAttribute.java:71)
[2016-12-26 23:45:51 - test] at proguard.classfile.io.ProgramClassReader.visitCodeAttribute(ProgramClassReader.java:422)
[2016-12-26 23:45:51 - test] at proguard.classfile.attribute.CodeAttribute.accept(CodeAttribute.java:101)
[2016-12-26 23:45:51 - test] at proguard.classfile.io.ProgramClassReader.visitProgramMethod(ProgramClassReader.java:200)
[2016-12-26 23:45:51 - test] at proguard.classfile.io.ProgramClassReader.visitProgramClass(ProgramClassReader.java:142)
[2016-12-26 23:45:51 - test] at proguard.classfile.ProgramClass.accept(ProgramClass.java:346)
[2016-12-26 23:45:51 - test] at proguard.io.ClassReader.read(ClassReader.java:91)
[2016-12-26 23:45:51 - test] ... 11 more


在网上查了很久资料,proguard-project.txt等文件都是正确配置的:
-libraryjars libs/libammsdk.jar
.....
-dontwarn com.tencent.**
-keep class com.tencent.** {*;}
事实上我能确定项目绝对没问题:因为这个项目是很久以前的,当时发版本有代码混淆,而且没任何问题,之后项目完全没有任何改动。而我最近电脑重装系统,Eclipse开发环境和sdk目录是重新弄的,所以肯定是开发环境的问题。
网上查了资料后,能判断是proguard版本的问题,于是我下载了proguard5.3,用5.3中的lib文件夹中的proguard.jar等三个jar文件替换掉
sdk\tools\proguard\lib
下的三个jar文件,结果报另外的错:

The same input jar is specified twice

然后根据http://blog.csdn.net/ylbf_dev/article/details/50448727的解释,把proguard-project.txt中的-libraryjars依次注释掉,这个新问题是解决了,但之前的那个问题又出现了,看来还是行不通。
后来还下载过较老的版本proguard4.11替换lib文件夹中的三个jar文件,问题依然存在!
再后来找到这个帖子:http://bbs.csdn.net/topics/390659813?page=1,是这样说的:

这个问题一般都是jar包内部做了较为高级的防破解或者有问题导致的,我们需要弱化proguard对引用第三方jar包的检查,当然也有可能是proguard不够新导致。以下是弱化检查的办法。
首先下载最新版本的proguard文件,找到~/src/proguard/classfile中的ClassConstants.java,修改174行附近的ATTR_StackMapTable值为“dummy”,保存。
在linux环境下运行~/build下的build.sh文件(mac下可运行),重新生成在lib下的三个jar包proguard.jar,proguardgui.jar,retrace.jar,将这三个包替换到你的安卓sdk下的,tools的proguard的lib下,~/<eclipse folder="">/sdk/tools/proguard/lib

在CSDN上下载了一个热心网友上传的,基于proguard4.11的修改编译后的版本,替换sdk\tools\proguard\lib目录下proguard.jar等三个文件后,终于成功export代码混淆版本了!

0 0
原创粉丝点击