android引入unity-classes.jar之后进行混淆的问题解决

本程序引入了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

    public static final String ATTR_StackMapTable = "dummy";//"StackMapTable";

然后重新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

时间: 2024-09-30 18:31:17

android引入unity-classes.jar之后进行混淆的问题解决的相关文章

因为项目需要使用Unity提供的接口,所以需要将接口classes.jar引入

Unity for Android 比较特殊,Unity for IOS 打包是将XCODE工程直接交给开发者,开发者可以在工程 的基础上继续添加新的视图,最后由开发者自行打包生成IPA包,发布程序.而Unity for Android打包 直接生成APK包,等于说源代码开发者是看不到的,但是Unity的自身确实有些局限,针对Android平台我 们需要学习如何在Unity中调用Android的JAVA代码.本章我们的目标是使用Unity的脚本打开Activity. 首先我们创建一个普通的And

Android Studio导出Jar包并混淆

在Android Studio中,自带反编译查看class文件,如果没有混淆的话,class文件跟java文件基本没有区别了,为了保护,还是混淆的好. 网上看了不少资料,都是直接下载proguard额外jar,直接生成,觉得不方便,既然apk都能混淆,为什么不直接通过Android Studio来混淆jar包呢. 做法其实很简单,一个build文件,一个proguard文件就可以了. 首先要明白jar从哪里来,以前在Eclipse中是一个project设置为library,然后另外一个主proj

Android APK及导出JAR包的代码混淆

像Android开发基于java语言的,很容易被别人反编译出来,一下就相当于裸奔了,特别是用于商业用途的时候,防止反编译是必要的措施.而代码混淆是一种很好防止反编译的方式. 1.APK的代码混淆. 在eclipse的开发环境下,使用android SDK 自带的proguard混淆工具. 主要用到红线框中的两个文件. 在project.properties文件中,要指定混淆的文件.如图: 然后,详细的proguard-project.txt的写法如下: -dontwarn 是让指定包名不提示警告

android库工程jar打包和混淆

公司有个项目需要以库的形式提供给第三方使用,但是java代码又不想别人知道,还有资源文件也需要一起打包,很常见的需求,下面就是解决此事的过程. 1.直接将库工程提供给第三方,android库工程引用方式 被老板pass,代码客户都可以看到,不行. 2.将库工程TestLib的src导出成jar,把res目录直接发给第三方 失败.导出的jar依然是引用库工程的R文件(com.test.lib.R),但是资源提供给第三方后,生成的R为com.test.R,因此运行时找不到com.test.lib.R

Unity与Android交互-Unity接入高德地图实现定位以及搜索周边的功能(使用Android Studio)详细操作

刚进公司给安排的任务就是Unity接入高德地图,算是踩了不少坑总算做出来了,抽点时间写个博客记录一下 废话不多说 先上效果图 获取定位并根据手机朝向显示周边信息            使用的Unity版本为5.5,Androad Studio 2.3.1 接下来开始讲具体操作 首先是Androad Studio的基本配置 1.创建工程,空白的就行,反正也用不到界面布局 等待创建完成 2.新建库模块: 切换到Project视图 右击你的项目 新建一个库模块-用来负责与Unity交互 当然你也可以不

Android动态加载jar/dex

http://www.cnblogs.com/over140/archive/2011/11/23/2259367.html 前言 在目前的软硬件环境下,Native App与Web App在用户体验上有着明显的优势,但在实际项目中有些会因为业务的频繁变更而频繁的升级客户端,造成较差的用户体验,而这也恰恰是Web App的优势.本文对网上Android动态加载jar的资料进行梳理和实践在这里与大家一起分享,试图改善频繁升级这一弊病. 声明 欢迎转载,但请保留文章原始出处:) 博客园:http:/

android 导包 导入jar包,打包jar包,打包成library。 KanKanStyle

(1)项目导入JAR包: 1.在项目EC或MYec里,将外部jar包拷贝在个libs目录里面.老的项目没有lib目录,活着叫lib,会报错,要改成libs 2.右键点击项目,Bulid Path->Configure Build Path 3.在设置Libraies项,选择刚才的位置添加jar包. 3.在Order and Export项里,将外部jar包选中.(很多时候,可以免去) 4.clean项目后,重新编译,这时的apk包里应该是包含外部jar啦. 在MyEc或androidStudio

android防反编译技术初体验——混淆

这几天做项目要做混淆,所以搜集资料学习了下,这次主要记录混淆的步骤,如有需要改正和完善的地方,还麻烦能够指出,大家共同进步o(* ̄▽ ̄*)ブ 1.项目防反编译技术步骤: a) 加密. b) 混淆. c) 加壳(加固); 2.加密:对信息进行摘要计算,然后摘要值用私钥进行验签,重要数据使用rsa非对称加密: 3.混淆:Android Studio开发工具自身集成了Java语言的ProGuard技术,对java代码有压缩.优化.混淆.预检的功能,AcFlash项目的Android端使用了ProGua

Android Studio多渠道批量打包及代码混淆

一.批量打包 1.集成了友盟统计,并在AndroidManifest.xml中添加了如下代码 <meta-data android:name="UMENG_CHANNEL" android:value="${CHANNEL_VALUE}"/> 2.在app的build.gradle的android标签下添加如下代码: productFlavors { myapp {} _360 {} appchina {} hiapk {} } productFlavo