您的位置:首页 > 移动开发 > Unity3D

Unity Android加密dll

2015-11-14 18:08 537 查看

前言:

以前写过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环境变量配置:

/article/10845331.html

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就可以了。

转载请标明出处Unity
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: