Unity3D安卓导出包加密学习–加密Assembly-CSharp.dll
Unity3D安卓导出包加密学习—-编译mono
http://blog.csdn.net/grimraider/article/details/51193224
加密:
主要是用的Unity的PostProcessBuild功能,自己随便写个带PostProcessBuild的公有静态方法就行【public static void funcName(BuildTarget target, string path2BuildProject)】,在导出(注意是导出,不是直接生成apk)Android工程后自动修改Assembly-CSharp.dll,PostProcessBuild模块随便放哪都行,
PostProcessBuild后的参数代表执行顺序,下面的代码先执行OnPostProcessBuild再执行OnPostProcessBuild2
http://docs.unity3d.com/ScriptReference/Callbacks.PostProcessBuildAttribute.html
例如:
[PostProcessBuild(10)]
public static void OnPostProcessBuild(BuildTarget target, string path2BuildProject)
{
Debug.Log("OnPostProcessBuild: " + target.ToString() + ", " + path2BuildProject);
// 这里放加密代码
encryptDll(path2BuildProject);
}
[PostProcessBuild(20)]
public static void OnPostProcessBuild2(BuildTarget target, string path2BuildProject)
{
Debug.Log("OnPostProcessBuild2: " + target.ToString() + ", " + path2BuildProject);
}
static void encryptDll(string path)
{
//DLL在android工程中对应的位置
string inpath = path + "/" + PlayerSettings.productName + "/assets/bin/Data/Managed/Assembly-CSharp.dll";
if (File.Exists(inpath))
{
byte[] bytes = File.ReadAllBytes(inpath);
// 加密代码
File.WriteAllBytes(inpath, lTemp.ToArray());
}
}
解密:
修改mono工程下的./mono/metadata/image.c
函数
mono_image_open_from_data_with_name (char *data, guint32 data_len, gboolean need_copy, MonoImageOpenStatus *status, gboolean refonly, const char *name)
{
if (strstr(name, "Assembly-CSharp.dll"))
{
// 解密功能块
}
.......
MonoCLIImageInfo *iinfo;
.......
}
编译好新的mono库之后,拷贝libmono.so到(原来的记得保留一份)
(windows)Unity安装根目录\Editor\Data\PlaybackEngines\androidplayer\release\libs\armeabi-v7a
这样每次unity导出的时候就可以自动替换解密库了。
接下来是用ant打包
环境:windows7,apache-ant,android-sdk,android-ndk
在导出的安装工程目录下,执行命令
android update project –path .
会自动在安卓工程下生成ant打包需要的build.xml(可以直接使用)
执行命令
ant
开始打包
记得下载android-sdk的build_tools包,要不会报错找不到aapt等
build_tools下载地址http://dl-ssl.google.com/android/repository/build-tools_r22-windows.zip
其他下载
http://www.cnblogs.com/rayray/p/4238416.html
http://www.oschina.net/question/1539302_227672
拼接byte[]串
List<byte> lTemp = new List<byte>();
lTemp.AddRange(bBig);
lTemp.AddRange(bSmall);
lTemp.ToArray();
参考:
雨松http://www.xuanyusong.com/archives/3553
雨松http://www.xuanyusong.com/archives/3571
ant打包http://www.cnblogs.com/yaozhongxiao/p/3523061.html