编译Unity使用的libmono.so

因工作需要,对Unity项目使用的libmono.so文件进行编译,至于原因众所周知就是为了加解密代码,整个过程实施起来并不复杂,只是在一些流程上每个人操作过程可能不一样,网上的资料会给比较多的困扰。下面记录一下完整的过程,希望对大家有所帮助。

参考资料,感谢作者:

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,下载对应的mingw-get-setup.exe,我没用64位的,就32位也可以正常运行,这里重点提示一下,不要安装到带空格的目录或者中文目录,避免给自己带来无限的坑,如果经常使用命令行就知道,WINDOW下的空格目录害人不浅。

下载地址:https://sourceforge.net/projects/mingw/files/

 

 

 

或者官网:http://www.mingw.org/ 

往下拉,看左边,我觉得sourceforge下载就挺好,因为其他很多配套资源也得去哪里下载,提前熟悉熟悉更方便。

 

 

MinGW我没找到离线的,在线安装也是比较慢的,只安装Basic包就行了 ,先选择,然后右列的全选,打上标记,之后再选菜单里面的Installation,在选择Apply,在线安装最大的坑就是不稳定,多试几次

 

 

 

 

 

 如果实在不行就尝试使用命令行安装,用任务管理器把它kill掉,然后cmd或者powershell进入自己的安装目录,我是在D:\MinGW

然后执行命令:

mingw-get install gcc
mingw-get install g++
mingw-get install gdb
如果真的实在不行,那么就去官网去下载对应资源的离线包,就去sourceforge里面找资源了
路径一般是:https://sourceforge.net/projects/mingw/files/MinGW/Extension/
缺少就去这个扩展包目录里找,一般找最新的,然后全部下载,坏处就是没整包下载,下完之后记得拷贝到D:\MinGW\var\cache\mingw-get\packages
也就是安装包的缓存目录,再执行对应的命令行就可以了。
如果顺利的话,其实过程还是比较容易,遇到的问题基本上按照上面的思路都可以解决。这样MinGW就安装完毕,把对应路径D:\MinGW\bin配置到环境变量里面,这一步安装就完成了。
可以测试一下,命令行输入 gcc -v,输出正确就OK了。

3. 安装 MSYS

鉴于在线安装实在太慢,所以建议先下载完毕然后离线安装msys

下载地址: http://sourceforge.net/projects/mingwbuilds/files/external-binary-packages/  

这里选择一个比较新的就行了,区别不大,我选的是截图里面的。

 

解压,然后拷贝到自己安装好的MinGW目录中,结构如下:

 

 

 这样就完事了,可以测试一下,进入msys目录,找到msys.bat,双击打开,可以使用Linux下命令行,比如where ls 等等,这里的where找到就是msys\bin里的

 

4、安装好上面的工具,下载JDK和NDK,JDK我这里用的是1.8,NDK一定要使用r10e的版本,可以根据自己的系统来选择。官方下载地址(无需FQ):32位 / 64位

这里需要提醒的一点是,要把解压好的ndk目录放到D:\MinGW\msys\home\xxx,路径,同时下一步下载的mono源码也是同理,意思是放到该账户的根目录。

5、可以进入正题了,下载使用Unity对应版本的libmono库,git地址:https://github.com/Unity-Technologies/mono, 自行选择对应的版本就可以,有没有mbe的都无所谓,只是说不同版本下的mbe可以同时在编辑器和Player模式下使用,通过修改对应的配置,这里忽略了

因为要使用到git,可以用命令行或者github desktop,把资源clone下来,因为git默认是克隆的主干,也就是unity-master的,需要在本地进行分支切换,使用命令行操作

 

git branch -r  查看对应远程分支版本

git checkout -b <本地分支名字,一般保持和远程一致> origin/<远程分支名>,这样就可以更新远程分支的资源,同时切换到该分支了

git checkout  <本地分支的名称>   切换到本地仓库

OK,到现在为止,我们的工具和资源就准备齐全,下面需要对编译脚本做一些修改。

6、要修改的内容并不多,建议简单理解一下,对应目录在mono\external\buildscripts里面,因为我们只编译安卓平台,主要是build_runtime_android.sh和build_runtime_android_x86.sh

1)build_runtime_android.sh中添加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)修改文件 build_runtime_android.sh,将 -fpic -g -funwind-tables \ 修改为 -fpic -O2 -funwind-tables \ 以便编译为 release 版本

4)修改文件 build_runtime_android.sh,只保留 armv7的编译,注释掉armv5和armv6的选项

5)修改文件 build_runtime_android_x86.sh,将 -fpic -g \ 修改为 -fpic -O2

6)修改文件 PrepareAndroidSDK.pm,将 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目录中拷贝过来的PrepareAndroidSDK.pm,

修改方式同上,改为 elsif(lc $^O eq 'cygwin' or lc $^O eq 'msys')。

或者修改对应的build.pl文件,参照截图修改:

 

 

 因为build.pl生成的目录为armeabi-v7a,看下面截图,所以需要修改build_runtime_android.sh中对应的路径,下面第一个截图是build.pl中的

 

 以下为sh脚本中的,其实一对照就很明白了。

 

至此,按照以上的步骤,所有过程中的坑基本上都是经历过了,可以轻松愉快的输入命令行进行编译了。

8)运行msys.bat中,命令行中 cd 到对应的mono目录,执行./external/buildscripts/build_runtime_android.sh,编译过程根据电脑时间长短不一,我的电脑时间还是比较久,起码在10分钟以上

9)生成目录为builds\embedruntimes\android\armv7a和x86下

 

10)可以愉快的进行修改了,路径mono\metadata\image.c,简单说一下,修改入口根据不同的mono版本,函数名字不同,mono_image_open_from_data_with_name或者mono_image_open_from_data_internal

修改时,做个name的判断,具体可以看网上的一些加密方式

posted @ 2020-11-11 12:36  K1_大大  阅读(1091)  评论(2编辑  收藏  举报