昨天刚好看了这篇文章:http://www.xuanyusong.com/archives/3553
问了下雨松MOMO,告诉我4.6后面的版本需要高版本才可以,可能是因为分支上的mono更新的是比较新的版本。所以我自己测试了下4.6.6以上应该都是可以的。
4.6.2以下估计是不行的,中间版本我并没有试过,所以建议大家直接用4.6.6以上的版本吧。
编译和以前基本一样,唯一不同的是打印日志的地方变得多了,以前是第二次编译只会打印有问题的地方,但现在老打印已经成功的日志。不过既然有以前的经验,现在又有雨松Mono的文章,估计大家自己看看都能看明白。
ok,编译成功后,直接测试,发现没问题,那么就写入加密代码。这里雨松提到可以被反编译破解掉加密代码。所以在研究如何让so不被简单的反编译。这个就交给他了,我就不继续研究了,因为毕竟我只是为了不让市面上的工具简单的破译我的代码,如果要先反编译so,然后研究怎么解密,估计大部分懒人都不会做吧。
第二个事情就是自动化,因为每次编译完都要处理比较麻烦,那么如何整合进去呢。
本来我打算干预编译流程,就是在代码编译完后,就运行加密代码,替换so,然后打包,但发现这样无法打包成功,原因是u3d在打包的时候会检测dll文件是否合法。也就是说我只能在打包完成后,对apk里面的文件进行替换。
经过研究,发现用winrar批处理是可以实现的。
代码如下:
set winrar=C:/Users/Administrator/Desktop/jiami/WinRAR/WinRAR.exe
set apk=%1
set newApk=%2
//解压apk中的dll
%winrar% x -ep %apk% assets\bin\Data\Managed\Assembly-CSharp.dll C:/Users/Administrator/Desktop/
rename C:\\Users\\Administrator\\Desktop\\Assembly-CSharp.dll Assembly-CSharp1.dll
//加密dll
C:\Users\Administrator\Desktop\jiami\Debug\jiami1.exe C:/Users/Administrator/Desktop/Assembly-CSharp1.dll C:/Users/Administrator/Desktop/Assembly-CSharp.dll
//删除apk中的dll
%winrar% d %apk% assets\bin\Data\Managed\Assembly-CSharp.dll
//删除apk中的so
%winrar% d %apk% lib\armeabi-v7a\libmono.so
//打包dll
%winrar% a %apk% -ep -apassets\bin\Data\Managed\ C:/Users/Administrator/Desktop/Assembly-CSharp.dll
//打包so
%winrar% a %apk% -ep -aplib\armeabi-v7a\ C:\Users\Administrator\Desktop\jiami\libmono.so
C:
cd C:\Users\Administrator\Desktop\jiami\Auto-sign
//重新签名
Sign.bat %apk% %newApk%
pause
代码很简单
记得将注释删掉,然后根据你自己的情况进行修改
在u3d中加入流程:
static bool isJiami = true;
[PostProcessBuild]
private static void afterjiami(BuildTarget target, string pathToBuildProject)
{
if(!isJiami)
{
return;
}
UnityEngine.Debug.Log (pathToBuildProject);
string exePath = "C:\\Users\\Administrator\\Desktop\\jiami\\jiami.bat";
Process p = new Process();
string str = pathToBuildProject.Replace (".apk", "jiame.apk");
ProcessStartInfo pi = new ProcessStartInfo(exePath, pathToBuildProject + " " + str);
p.StartInfo = pi;
p.StartInfo.FileName = exePath;
p.StartInfo.CreateNoWindow = false;
p.Start();
p.WaitForExit();
File.Delete (pathToBuildProject);
}
ps:签名工具自己去网上下载一个,希望大家碰到问题多多自己研究,成功后分享给别人