2018/4/6 Unity小记录

最近我们有个需求是需要重新编译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”就好了。

  [ Unity ]   [ Mono ]   [ Debain ]   [ Android ]
知识共享许可协议 本作品由小蝶惊鸿创作,采用知识共享署名 4.0 国际许可协议进行许可,转载时请保留本文署名及链接。