本程序引入了unity3d的程序,那么自然就使用到了jar包unity-class.jar这个jar包。在混淆的时候出现下列问题:
首先第一个问题:
java.io.IOException: Can‘t read [unity-classes.jar] (Can‘t process class [com/unity3d/player/UnityPlayer.class] (Unknown verification type [191] in stack map frame))
关于这个问题,网络上面说有很多的可能性,如果我的解决方案不能解决你的问题,那么你可以参考下面的连接:
http://www.eoeandroid.com/thread-536303-1-1.html
http://blog.csdn.net/cupidove/article/details/8490719
http://blog.csdn.net/vrix/article/details/7100841
http://blog.csdn.net/vrix/article/details/7100944
对于我的问题呢,和上面的都无关,和混淆脚本没有什么关系。
为我提供问题问题思路的参考资料如下:
https://sourceforge.net/p/proguard/bugs/420/
http://glblong.blog.51cto.com/3058613/1435941
http://glblong.blog.51cto.com/3058613/1536516
http://stackoverflow.com/questions/23441152/proguard-with-unity3d-return-error-code-1
所以,根据上面那些参考把混淆脚本改啊改的,基本可以确定是ProGuard混淆器的问题了。
以前从来没关心过这个问题,打开sdk的tools文件夹里面看到里面有一个proguard的文件夹,这个就是我们混淆的时候,使用到的混淆器了。
比如我们的基本脚本
proguard-android.txt
就在这个文件夹的根目录中。
然后查询了一下,才知道,java使用的是一款开源的混淆器,ProGuard,官网地址参考文章末尾。https://sourceforge.net/p/proguard/bugs/420/这个网站是专门讨论这款混淆器的,上面有官方人员回答,大家有问题最好还是参考官方,或者到这个论坛上去提问。
解决方法就是:
找到proguard源码中proguard\src\proguard\classfile\ClassConstants.java类,然后修改ATTR_StackMapTable的值,将原来的的StackMapTable改为dummy.
1 |
|
然后重新ant打包proguard,使用新的proguard来混淆就不会出现上面的问题。
但是在sdk的tools目录下,是看不到proguard的源码的,那就无法修改之后再re-build了。
方法当然是大家到官方网站上面去下载了(官方网站参考文章末尾)。
当前最新的是5.1,那么就下载proguard5.0.zip之后,解压就可以了。
这个时候,需要注意的是,解压之后的proguard文件夹是缺少了几个文件的。
ant文件夹
proguard-android.txt
proguard-android-optimize.txt
proguard-project.txt
没办法,这几个文件就只好自己手动从原来的sdk中copy进去了。不然的话,混淆的时候会报错,因为找不到proguard-android.txt文件。
之后,大家就可以参考下面的连接进行proguard的重新打包了。
http://glblong.blog.51cto.com/3058613/1536516
ant的下载地址,参考文章末尾的官方网站。
然后把含有重新打包的proguard.jar的proguard文件夹覆盖之前sdk的tools文件夹中的就可以了。
还没有结束,下面也很重要!~
最初的时候,我并没有重新打包proguard.jar而是直接跟新了新版本的ProGuard来替换sdk的tools中的(因为我觉得可能新版本不会出现这个问题)
比如现在最新的5.1.
那么,在混淆的过程中会出现下面的问题:
[2014-12-08 16:27:52 - youqu] Proguard returned with error code 1. See console
[2014-12-08 16:27:52 - youqu] java.io.IOException: The same input jar [D:\adt-bundle-windows-x86_64-20140702\test-workspace\youqu\libs\ShareSDK-QQ-2.4.2.jar] is specified twice.
[2014-12-08 16:27:52 - youqu] at proguard.ConfigurationChecker.checkConflicts(ConfigurationChecker.java:216)
[2014-12-08 16:27:52 - youqu] at proguard.ConfigurationChecker.check(ConfigurationChecker.java:83)
[2014-12-08 16:27:52 - youqu] at proguard.ProGuard.execute(ProGuard.java:72)
[2014-12-08 16:27:52 - youqu] at proguard.ProGuard.main(ProGuard.java:507)
对于这个问题,真的是不太理解,害的我把jar包各种删除,重新导入!~
参考下面的文章:
http://www.cnblogs.com/huanciyuan/p/4065335.html
觉得,可能是因为ProGuard和Eclipse版本不兼容的原因。
于是只好替换旧一些的ProGuard并且顺便进行测试,测试结果如下:
对于5.0、5.1都会出现这个问题,但是4.11之下,包括4.11都不会出现。所以没版本我就又修改为4.11版本的。
直接替换了之后,就又返回到了上面的问题。
所以,上面的麻烦步骤是没有办法回避掉的。
另外就是,有一个老外还出现过,jar是因为损毁的问题,所以无法读取,所以,有必要的话,大家也测试一下自己的jar是否具有损毁的情况。
测试方法如下:
D:\>javap -c -private -verbose -classpath D://adt-bun
dle-windows-x86_64-20140702/test-workspace/youqu/libs/unity-classes.jar com.unit
y3d.player.UnityPlayer
这个大家应该都看得懂,就是利用javap反编译一下这个jar包,如果能够正常运行的话,就说明你的jar包没有问题,如果不行的啊,就自己在具体解决吧。
提供一个已经重新打包好的ProGuard的下载地址:http://download.csdn.net/detail/jiguangcanhen/8237021
资源地址:
ProGuard混淆器网址:http://proguard.sourceforge.net/
apache ant的网址:http://ant.apache.org/index.html