因工作需要,对Unity项目使用的文件进行编译,至于原因众所周知就是为了加解密代码,整个过程实施起来并不复杂,只是在一些流程上每个人操作过程可能不一样,网上的资料会给比较多的困扰。下面记录一下完整的过程,希望对大家有所帮助。
参考资料,感谢作者:
https://blog.csdn.net/u011312774/article/details/106543862
https://www.cnblogs.com/wuxun1997/p/13364183.html?utm_source=tuicool
https://blog.csdn.net/yangyangyang20092010/article/details/46350519
https://www.cnblogs.com/yaukey/p/compile_unity_mono_source.html
1、编译平台的选择,网上资料大多数是Linux或者对应虚拟机编译,我这边是因为虚拟机的版本和网络问题放弃,使用了Win10+MinGW+MSYS来编译。
MinGW,Minimalist GNU for Windows,windows最简化的GNU,就是一个C的编译工具集。同时,需要通过MSYS使用与编译相关的命令行,因此,需要同时安装MinGW和 MSYS。所以下面的步骤都只是针对该搭配组合
2、安装MinGW,下载对应的,我没用64位的,就32位也可以正常运行,这里重点提示一下,不要安装到带空格的目录或者中文目录,避免给自己带来无限的坑,如果经常使用命令行就知道,WINDOW下的空格目录害人不浅。
下载地址:
或者官网:
往下拉,看左边,我觉得sourceforge下载就挺好,因为其他很多配套资源也得去哪里下载,提前熟悉熟悉更方便。
MinGW我没找到离线的,在线安装也是比较慢的,只安装Basic包就行了 ,先选择,然后右列的全选,打上标记,之后再选菜单里面的Installation,在选择Apply,在线安装最大的坑就是不稳定,多试几次
如果实在不行就尝试使用命令行安装,用任务管理器把它kill掉,然后cmd或者powershell进入自己的安装目录,我是在D:\MinGW
然后执行命令:
mingw-get install gcc
mingw-get install g++
mingw-get install gdb
如果真的实在不行,那么就去官网去下载对应资源的离线包,就去sourceforge里面找资源了
路径一般是:MinGW/Extension/
缺少就去这个扩展包目录里找,一般找最新的,然后全部下载,坏处就是没整包下载,下完之后记得拷贝到D:\MinGW\var\cache\mingw-get\packages
也就是安装包的缓存目录,再执行对应的命令行就可以了。
如果顺利的话,其实过程还是比较容易,遇到的问题基本上按照上面的思路都可以解决。这样MinGW就安装完毕,把对应路径D:\MinGW\bin配置到环境变量里面,这一步安装就完成了。
可以测试一下,命令行输入 gcc -v,输出正确就OK了。
3. 安装 MSYS
鉴于在线安装实在太慢,所以建议先下载完毕然后离线安装msys
下载地址:
这里选择一个比较新的就行了,区别不大,我选的是截图里面的。
解压,然后拷贝到自己安装好的MinGW目录中,结构如下:
这样就完事了,可以测试一下,进入msys目录,找到,双击打开,可以使用Linux下命令行,比如where ls 等等,这里的where找到就是msys\bin里的
4、安装好上面的工具,下载JDK和NDK,JDK我这里用的是,NDK一定要使用r10e的版本,可以根据自己的系统来选择。官方下载地址(无需翻墙):32位 / 64位
这里需要提醒的一点是,要把解压好的ndk目录放到D:\MinGW\msys\home\xxx,路径,同时下一步下载的mono源码也是同理,意思是放到该账户的根目录。
5、可以进入正题了,下载使用Unity对应版本的libmono库,git地址:, 自行选择对应的版本就可以,有没有mbe的都无所谓,只是说不同版本下的mbe可以同时在编辑器和Player模式下使用,通过修改对应的配置,这里忽略了
因为要使用到git,可以用命令行或者github desktop,把资源clone下来,因为git默认是克隆的主干,也就是unity-master的,需要在本地进行分支切换,使用命令行操作
git branch -r 查看对应远程分支版本
git checkout -b <本地分支名字,一般保持和远程一致> origin/<远程分支名>,这样就可以更新远程分支的资源,同时切换到该分支了
git checkout <本地分支的名称> 切换到本地仓库
OK,到现在为止,我们的工具和资源就准备齐全,下面需要对编译脚本做一些修改。
6、要修改的内容并不多,建议简单理解一下,对应目录在mono\external\buildscripts里面,因为我们只编译安卓平台,主要是和
1)中添加ndk的环境变量,打开脚本,顶头位置添加一行 export ANDROID_NDK_ROOT=/home/xxxx/android-ndk-r10e
2)然后找到KRAIT_PATCH_PATH的设置,修改为KRAIT_PATCH_PATH="${CWD}/android_krait_signal_handler/build",在编译过程中会有git克隆资源,可以保证目录结构,当然你也可以提前clone下来,那么编译脚本会跳过克隆部分
3)修改文件 ,将 -fpic -g -funwind-tables \ 修改为 -fpic -O2 -funwind-tables \ 以便编译为 release 版本
4)修改文件 ,只保留 armv7的编译,注释掉armv5和armv6的选项
5)修改文件 ,将 -fpic -g \ 修改为 -fpic -O2
6)修改文件 ,将 elsif(lc $^O eq 'cygwin'的地方修改为elsif(lc $^O eq 'cygwin' or lc $^O eq 'msys'),意思就是加上msys的模式
7)修改 android_krait_signal_handler 编译脚本,如果已经启动过第一次编译并且失败或者主动 clone 过,那么这里有两种修改方式,第一是修改mono\android_krait_signal_handler\build目录中拷贝过来的,
修改方式同上,改为 elsif(lc $^O eq 'cygwin' or lc $^O eq 'msys')。
或者修改对应的文件,参照截图修改:
因为生成的目录为armeabi-v7a,看下面截图,所以需要修改中对应的路径,下面第一个截图是中的
以下为sh脚本中的,其实一对照就很明白了。
至此,按照以上的步骤,所有过程中的坑基本上都是经历过了,可以轻松愉快的输入命令行进行编译了。
8)执行./external/buildscripts/,根据电脑时间长短不一,我的电脑时间还是比较久,起码在10分钟以上
9)生成目录为builds\embedruntimes\android\armv7a和x86下
10)可以愉快的进行修改了,路径mono\metadata\,简单说一下,修改入口根据不同的mono版本,函数名字不同,mono_image_open_from_data_with_name或者mono_image_open_from_data_internal
修改时,做个name的判断,具体可以看网上的一些加密方式