最近我们有个需求是需要重新编译Github上Unity提供的Mono,重新生成一个新的Android版的libmono.so。在花了很长时间来研究尝试以及踩了数不清的坑之后,终于成功编译出libmono.so。这里打算记录分享一下,供自己以后有需要的时候查看以及有缘的读者们参考少绕弯路。
废话不多说,我们先看看当前编译的相关环境:
操作系统:Debian-8.10.0-i386
Unity Mono版本:Unity 5.6
首先我们需要先把操作系统安装好,并且下载好要编译的Mono版本(废话),然后上传到需要准备编译的目录(这里默认的编译目录为:"/mono"中,各位读者可根据需要在下文中自行修改)。
如果Debian源没有配置好的还需要额外配置(配置好的请直接跳过),具体操作就是用打开“/etc/apt/sources.list”,把里面的内容清空,然后贴上以下配置:
deb http://mirrors.163.com/debian/ jessie main non-free contrib deb http://mirrors.163.com/debian/ jessie-updates main non-free contrib deb http://mirrors.163.com/debian/ jessie-backports main non-free contrib deb-src http://mirrors.163.com/debian/ jessie main non-free contrib deb-src http://mirrors.163.com/debian/ jessie-updates main non-free contrib deb-src http://mirrors.163.com/debian/ jessie-backports main non-free contrib deb http://mirrors.163.com/debian-security/ jessie/updates main non-free contrib deb-src http://mirrors.163.com/debian-security/ jessie/updates main non-free contrib
保存退出后执行“apt-get update”刷新缓存即可。
然后执行以下命令来对mono-unity解压并配置好需要编译的环境:
cd /mono/
unzip /mono/mono-unity-5.6.zip apt-get install -y git make autoconf libtool automake bison pkg-config echo 'export ANDROID_NDK_ROOT=/mono/ndk-10e' >> ~/.bashrc source ~/.bashrc
然后拷贝“build_runtime_android.sh”到mono-unity目录中,并赋予执行权限:
cp mono-unity-5.6/external/buildscripts/build_runtime_android.sh /mono/mono-unity-5.6/ chmod a+x /mono/mono-unity-5.6/build_runtime_android.sh
然后打开“/mono/mono-unity-5.6/build_runtime_android.sh”:
(1)、找到“KRAIT_PATCH_PATH="${CWD}/../../android_krait_signal_handler/build"”(56行左右),将它改为 “KRAIT_PATCH_PATH="${CWD}/android_krait_signal_handler/build"”(去掉那两个“../”)【必要操作】。
(2)、找到第153~158行,这里可以根据需要注释掉不需要生成的arm架构【可选操作】
(3)、找到“-fpic -g -funwind-tables \”(73行左右),将它改为“-fpic -O2 -funwind-tables \”(具体可查阅https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html)【可选操作】
折腾完上面这些配置之后,就可以执行命令:
cd /mono/mono-unity-5.6
/mono/mono-unity-5.6/build_runtime_android.sh
系统此时会自动的下载Android NDK并开始编译Mono,然后就抛Error并停止编译了。这时候是可以发现“/mono/mono-unity-5.6”会多了个“android_krait_signal_handler”目录。我们打开“/mono/mono-unity-5.6/android_krait_signal_handler/build/build.pl”:
(1)、把“#!/usr/bin/env perl -w”(第1行)改成“#!/usr/bin/perl -w”【必要操作】
(2)、把“PrepareAndroidSDK::GetAndroidSDK(undef, undef, "r13b");”(第10行)改成“PrepareAndroidSDK::GetAndroidSDK(undef, undef, "r10e");”【可选操作】
再次执行编译命令:
cd /mono/mono-unity-5.6 /mono/mono-unity-5.6/build_runtime_android.sh
编译十几(到几十)分钟之后,就会在“builds/embedruntimes/android”目录中生成相应架构的libmomo.so
至此,整个编译流程就完成了。后面如果改了什么东西想重新再编译的话直接执行“build_runtime_android.sh”就好了。