unityunity图集打包在苹果模糊是如何指定类不做混淆

739 条评论分享收藏感谢收起赞同 1067 条评论分享收藏感谢收起关于代码混淆,怎么不混淆注解
[问题点数:20分]
本版专家分:0
结帖率 40%
CSDN今日推荐
本版专家分:196
本版专家分:0
本版专家分:0
本版专家分:192
本版专家分:0
匿名用户不能发表回复!|
其他相关推荐android引入unity-classes.jar之后进行混淆的问题解决
转载请注明出处:http://blog.csdn.net/jiguangcanhen/article/details/
------------------------------------------------------------------------------------------------------------------------------
本程序引入了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))
关于这个问题,网络上面说有很多的可能性,如果我的解决方案不能解决你的问题,那么你可以参考下面的连接:
对于我的问题呢,和上面的都无关,和混淆脚本没有什么关系。
为我提供问题问题思路的参考资料如下:
所以,根据上面那些参考把混淆脚本改啊改的,基本可以确定是ProGuard混淆器的问题了。
以前从来没关心过这个问题,打开sdk的tools文件夹里面看到里面有一个proguard的文件夹,这个就是我们混淆的时候,使用到的混淆器了。
比如我们的基本脚本
proguard-android.txt
就在这个文件夹的根目录中。
然后查询了一下,才知道,java使用的是一款开源的混淆器,ProGuard,官网地址参考文章末尾。这个网站是专门讨论这款混淆器的,上面有官方人员回答,大家有问题最好还是参考官方,或者到这个论坛上去提问。
解决方法就是:
找到proguard源码中proguard\src\proguard\classfile\ClassConstants.java类,然后修改ATTR_StackMapTable的值,将原来的的StackMapTable改为dummy.
public static final String ATTR_StackMapTable = "dummy";
然后重新ant打包proguard,使用新的proguard来混淆就不会出现上面的问题。
但是在sdk的tools目录下,是看不到proguard的源码的,那就无法修改之后再re-build了。
方法当然是大家到官方网站上面去下载了(官方网站参考文章末尾)。
当前最新的是5.1,那么就下载proguard5.0.zip之后,解压就可以了。
这个时候,需要注意的是,解压之后的proguard文件夹是缺少了几个文件的。
proguard-android.txt
proguard-android-optimize.txt
proguard-project.txt
没办法,这几个文件就只好自己手动从原来的sdk中copy进去了。不然的话,混淆的时候会报错,因为找不到proguard-android.txt文件。
之后,大家就可以参考下面的连接进行proguard的重新打包了。
ant的下载地址,参考文章末尾的官方网站。
然后把含有重新打包的proguard.jar的proguard文件夹覆盖之前sdk的tools文件夹中的就可以了。
还没有结束,下面也很重要!~
最初的时候,我并没有重新打包proguard.jar而是直接跟新了新版本的ProGuard来替换sdk的tools中的(因为我觉得可能新版本不会出现这个问题)
比如现在最新的5.1.
那么,在混淆的过程中会出现下面的问题:
[ 16:27:52 - youqu] Proguard returned with error code 1. See console
[ 16:27:52 - youqu] java.io.IOException: The same input jar [D:\adt-bundle-windows-x86_64-\test-workspace\youqu\libs\ShareSDK-QQ-2.4.2.jar] is specified twice.
[ 16:27:52 - youqu] at proguard.ConfigurationChecker.checkConflicts(ConfigurationChecker.java:216)
[ 16:27:52 - youqu] at proguard.ConfigurationChecker.check(ConfigurationChecker.java:83)
[ 16:27:52 - youqu] at proguard.ProGuard.execute(ProGuard.java:72)
[ 16:27:52 - youqu] at proguard.ProGuard.main(ProGuard.java:507)
对于这个问题,真的是不太理解,害的我把jar包各种删除,重新导入!~
参考下面的文章:
觉得,可能是因为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-/test-workspace/youqu/libs/unity-classes.jar com.unit
y3d.player.UnityPlayer
这个大家应该都看得懂,就是利用javap反编译一下这个jar包,如果能够正常运行的话,就说明你的jar包没有问题,如果不行的啊,就自己在具体解决吧。
提供一个已经重新打包好的ProGuard的下载地址:
最后贴出来我最后的混淆脚本文件,以作参考:
-optimizationpasses 2
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontpreverify
#-dontoptimize
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
-keepattributes InnerClasses,LineNumberTable
-libraryjars libs/AMap_3DMap_V2.3.0.jar
-libraryjars libs/Android_Location_V1.3.0.jar
-libraryjars libs/android-support-v4.jar
-libraryjars libs/gson-2.2.2.jar
-libraryjars libs/mframework.jar
-libraryjars libs/okhttp-2.0.0.jar
-libraryjars libs/okhttp-urlconnection-2.0.0.jar
-libraryjars libs/okio-1.0.0.jar
-libraryjars libs/retrofit-1.6.0.jar
-libraryjars libs/ShareSDK-Core-2.4.2.jar
-libraryjars libs/ShareSDK-QQ-2.4.2.jar
-libraryjars libs/ShareSDK-QZone-2.4.2.jar
-libraryjars libs/ShareSDK-SinaWeibo-2.4.2.jar
-libraryjars libs/ShareSDK-Wechat-2.4.2.jar
-libraryjars libs/ShareSDK-Wechat-Core-2.4.2.jar
-libraryjars libs/ShareSDK-Wechat-Moments-2.4.2.jar
-libraryjars libs/unity-classes.jar
-libraryjars libs/universal-image-loader-1.9.2-with-sources.jar
-keep class com.unity3d.player.**{*;}
-keep class org.fmod.**{*;}
-keep class com.amap.api.**{*;}
-keep class com.autonavi.amap.mapcore.**{*;}
-keep class retrofit.**{*;}
-keep class okio.**{*;}
-keep class com.squareup.okhttp.**{*;}
-keep class m.framework.**{*;}
-keep class com.squareup.okhttp.**{*;}
-keep class com.google.gson.**{*;}
-keep class com.amap.api.location.**{*;}
-keep class com.aps.**{*;}
-keep class android.support.**{*;}
-keep class com.nostra13.universalimageloader.**{*;}
-dontwarn com.unity3d.player.**
-dontwarn org.fmod.**
-dontwarn com.amap.api.**
-dontwarn com.autonavi.amap.mapcore.**
-dontwarn retrofit.**
-dontwarn okio.**
-dontwarn com.squareup.okhttp.**
-dontwarn m.framework.**
-dontwarn com.squareup.okhttp.**
-dontwarn com.google.gson.**
-dontwarn com.amap.api.location.**
-dontwarn com.aps.**
-dontwarn android.support.**
-dontwarn com.nostra13.universalimageloader.**
-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.app.View
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class * extends android.app.backup.BackupAgentHelper
-keep public class * extends android.preference.Preference
-keep public class com.android.vending.licensing.ILicensingService
-keep class android.net.http.SslError
-keep class android.webkit.**{*;}
-keep class cn.sharesdk.**{*;}
-keep class com.sina.**{*;}
-keep class m.framework.**{*;}
-keepclasseswithmembernames class * {
native &methods&;
-keepclasseswithmembers class * {
public &init&(android.content.Context, android.util.AttributeSet);
-keepclasseswithmembers class * {
public &init&(android.content.Context, android.util.AttributeSet, int);
-keepclassmembers class * extends android.app.Activity {
public void *(android.view.View);
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
-keep class **.R$* {
-keep class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator *;
上面还是的混淆脚本还是有些问题的。
因为在初始化Unity的Activity中,会提供一些供Unity调用的方法,不明白看这里:
但是在混淆的时候,可能会被混淆器认为是没有使用到的方法,(的确,android没有使用到,但是unity会调用啊)而被移除,那么unity想要调用的时候就会调用不到了。
所以,要添加下面的混淆脚本,避免这些方法被混淆或者移除。(混淆也是不允许的,因为在unity中不会知道我们混淆的名字是什么)
-keep class com.mingmu.youqu.main.MainActivity {
public void initialReady();
public void shareImage(java.lang.String);
public void goBusinessList(int);
public void styleRoomGoMain();
public int getTitleStatus();
public void hideOrShowTitleBar(int);
public void deletePeoplebtnClick(int);
public void changeAddNewPeopleCamera();
public void maskMain();
public void maskHair();
public void maskCloth();
}在运行的过程中,又遇到了问题,具体可以我的这个帖子:
也就是一条:对于第三方jar包,如果不混淆的话,那么你从第三方jar包集成而来的类也最好不好混淆。
-keep class yourclass$*{
}上面这个混淆脚本可以在混淆的时候忽略某个类中的内部类和匿名内部类。
还有一个关于Gson的问题:
之前对于数据结构的混淆规则定义如下:
-keep class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator *;
}这样,虽然,model的名字没有发生改变,但是里面的字段名成都已经改变了。
对于gson了解的人,都知道,这样Gson在解析的时候,肯定是会有问题的。
后台就修改成了下面这个样子:
-keep class * implements android.os.Parcelable {
}这样就可以解决这个问题了,很明显,脚本的意思就是对于实现了Parcelable接口的类,什么都不混淆(如果你是使用的Serialble的话,一样的写法)。
当然了,脚本写法布置这一张,*;就是图个省事,解决方式也不止这一种,你也可以通过给model的字段添加注解,这样就不怕字段被混淆了,具体的做法,如果想用,就自己去写吧。
资源地址:
ProGuard混淆器网址:
apache ant的网址:
Unity3D 把代码混淆过的代码返混淆回来
Android Studio:ProGuard 混淆配置
Android Studio集成极光推送(Jpush) 报错 java.lang.UnsatisfiedLinkError: cn.jpush.android.service.PushProtoco
Unity Android Plugin开发指南
Android 集成Unity工程出现的崩溃问题
没有更多推荐了,posts - 1022,&
comments - 143,&
trackbacks - 0
Unity自定义Debug日志文件,利用VS生成Dll文件并使用Dotfuscated进行混淆,避免被反编译。
1、打开VS,博主所用版本是Visual Studio 2013。
2、新建一个VC项目,选择类库,取名为JefferyChan,具体步骤如下图:
3、因为要调用Unity中的相关文件,所以这里要引入外部文件。首先在Unity的安装文件夹中找到UnityEngine.dll,我的路径是:D:\Program Files (x86)\Unity\Editor\Data\Managed&如下图所示:
4、将UnityEngine.dll引入到项目中,如下图:&打开项目,然后打开VS的视图-&解决方案管理器
5、项目文件下的引用上面单击鼠标右键,引用-&添加引用,引入外部文件,如下图所示:
6,编辑需要编译的C#类文件,博主这里写的是个自定义日志输出文件,具体代码如下:
using System.C
using UnityE
* 新建一个命名空间 用于保存自己定义的一些公用方法
namespace JefferyChan
* 新建一个JefferyLog类用于输出调试日志
public class JefferyLog
7、编译项目,生成dll文件,如下图所示:
8、找到生成的dll文件,文件路径为:&项目路径&-&bin-&Debug-&JefferyChan.dll,如下图所示:
9、此时的dll文件用Reflector打开,发现反编译出来的代码和原始的代码几乎是一样的,如下图所示:
10、使用Dotfuscated对生成的JefferyChan.dll文件进行混淆,如下图所示:
点击生成按钮,进行混淆。
11、再次反编译混淆后的代码,发现无法进行反编译,如下图所示:
Dotfuscated是VS自带的,它存在于VS的安装目录下:D:\Program Files (x86)\Microsoft Visual Studio 12.0\PreEmptive Solutions\Dotfuscator and Analytics Community Edition
如下图所示:
备注:&将项目属性 -& 应用程序 -& 目标框架:改为 .NET Framework 3.5或以下 。这一步很重要,因为Unity3D(当前的Unity3D版本是3.5版) 支持的 .Net 是3.5版。
如果选择的是4.0版会出现
Internal compiler error. See the console log for more information. output was:Unhandled Exception: System.TypeLoadException: Could not load type &System.Runtime.Versioning.
如下图所示:
Reflector下载链接:http://pan.baidu.com/s/1o6KH9xw。
阅读(...) 评论()关于Unity发布iOS平台代码混淆问题
之前在越狱手机里找到《永恒战士3》的程序发现是用Unity做的,拷出资源出来看的时候发现里面有游戏程序集,立马抽出来反编译了一下,发现里面的代码只有方法签名,没有方法体,还以为用什么高端混淆工具做的,后来问了Unity技术支持后了解到,发布iOS平台后,dll只会留着方法签名部分,具体实现都已经转成native
code,要破解比较困难,太好了,妈妈再也不用担心以后发布iOS平台代码被破解了!补充:要实现去掉方法体还需要设置一下,在Player Settings里Other Settings下,Stripping Level要选Strip ByteCode,或者更高的Stripping Level,但是精简了库之后会有些类不能用,具体可以到官网看查一下不同的Stripping
Level对应精简了哪些库。
Unity代码混淆2
Unity 加密解密那些事(转载)
Unity反编译-加密和混淆方式
Unity3D项目程序加密——对dll进行混淆
Unity3D 把代码混淆过的代码返混淆回来
Unity 与 OC 不得不说的故事。。
iOS添加垃圾代码工具,代码混淆工具,代码生成器,史上最好用的垃圾代码添加工具,自己开发的小工具,ChaosTool工具
Unity 代码混淆
Unity3D -- 避免代码被反编译
没有更多推荐了,

我要回帖

更多关于 unity打包未响应 的文章

 

随机推荐