文:AdamBieber
前言:以前写过Unity加密apk的方法,但是那只是非常初级的,现在使用了不同的方法,首先先感谢别人提供的资料。
http://www.xuanyusong.com/archives/3553
http://www.luzexi.com/Unity3d/游戏架构/前端技术/2015/04/11/Unity3D-重新编译Mono加密DLL/
正文:
1:下载必要工具
mono-Unity
下载地址 https://github.com/Unity-Technologies/mono,根据Unity版本不同下载不同版本的mono-Unity,我下载的是5.1版本的mono
jdk(百度一搜就有,哪个版本都可以)
ndk(版本和下载的mono版本要对应)打开已经下载好的mono,mono-unity-5.1/external/buildscripts/build_runtime_android.sh 查看ndk版本
perl ${BUILDSCRIPTSDIR}/PrepareAndroidSDK.pl -ndk=r9 -env=envsetup.sh && source envsetup.sh
sdk 网上也很多
注:下载的都必须是mac版本的,不能和win版本通用,由于使用的Mac电脑进行编辑的,Window电脑我也试了,但是各种编译不通过,得需要安装Cygwin或者Linux虚拟机,各种配置也挺麻烦的,所以就在Mac电脑下进行编译了。
2:配置环境变量
ndk和sdk环境变量配置:
http://blog.csdn.net/zf135792468/article/details/11926995
3:配置mono编译需要的工具
mono需要autoconf automake libtool pkg-config这些工具。你最好还是去下载安装了。你可以用brew安装。brew install autoconf automake libtool pkg-config
执行:ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
然后执行:brew install autoconf automake libtool pkg-config
4:编译mono
1:从github下载下来对应的mono解压到本地,然后打开mac的终端,cd到mono的目录
2.把打包脚本拖入终端中(注意脚本的路径),然后就开始耐心等待吧。估计5分钟左右就OK了。
3.打包脚本分两种, 一个是 arm的,还有一个是x86,执行build_runtime_android.sh 就可以了, 它会自动调用
build_runtime_android_x86.sh。
借用下雨松MOMO的图
4.打包脚本我们需要改一下,因为下载下来的脚本直接运行打的是debug版本,效果就是打出来的.so比unity自带的大很多。我们要改成release版本
如下图所示,左边是x86,右边是arm。把CFLAGS里的-g改成-O2 (O0 ,O1,O2,OS,O3分了好几个压缩档次,我觉得O2就可以了)然后在LDFLAGS里加上-Wl,--gc-sections \ 就行了
再次借用:
5.然后在下面把这两句代码注释掉,不然编译的时间就要增加了。
#clean_build “$CCFLAGS_ARMv5_CPU” “$LDFLAGS_ARMv5″ “$OUTDIR/armv5″
#clean_build “$CCFLAGS_ARMv6_VFP” “$LDFLAGS_ARMv5″ “$OUTDIR/armv6_vfp”
在打mono.so前记得改一下解密算法。因为在测试所以解密和加密算法我们就写简单一点。如下图所示,mono/metadata/image.c里面找到mono_image_open_from_data_width_name 。 因为我只会对自己写的c#编译后的dll加密,所以这里判断一下是否是我们自己的dll,解密算法很简单就是让字节下标为1的字节-1。
OK 然后开始编译mono吧。arm 和x86 两个大概 5 分钟左右就能编译完成。
对应会会放在mono根目录build的文件夹里。然后回到生成的adnroid工程中,把libmono.so 放在桌面上,等Unity导出完Android项目之后就会再次使用到他
6.回到Unity中,随便创建一个脚本,放在Editor文件夹下
[MenuItem("Tools/Build Google Project")] static public void BuildAssetBundles() { string path = EditorUtility.SaveFolderPanel("请选择路径", "", ""); if (string.IsNullOrEmpty(BuildPipeline.BuildPlayer(GetBuildScenes(), path, BuildTarget.Android, BuildOptions.AcceptExternalModificationsToPlayer))) { encryptDll(path); } } static private void encryptDll(string path) { //DLL在android工程中对应的位置 string inpath = path + "/" + PlayerSettings.productName + "/assets/bin/Data/Managed/Assembly-CSharp.dll"; if (File.Exists(inpath)) { //先读取没有加密的dll byte[] bytes = File.ReadAllBytes(inpath); //字节偏移 DLL就加密了。 bytes[0] += 1; //在写到原本的位置上 File.WriteAllBytes(inpath, bytes); } }
7:然后在Unity中选择Tools/Build Google Project,这样导出Android项目之后dll脚本文件是已经加密过的,把桌面上的libmono.so替换Android项目中的libmono.so文件,然后用Eclipse打包成apk就可以了。
转载请标明出处
版权声明:本文为博主原创文章,未经博主允许不得转载。