本文主要是记录下如何编译mono android以及遇到的一些问题。
编译环境
虚拟机下 ubuntu 22.04.3-desktop-amd64
gcc version 11.4.0 (Ubuntu 11.4.0-1ubuntu1~22.04)
unity mono 版本 unity-2021.3-mbe
编译前准备
- 克隆mono仓库,初始化所有git submodules:
仓库地址:https://github.com/Unity-Technologies/mono/
克隆mono仓库到本地目录,github上克隆较慢,可以去gitee上找镜像源。记得切换分支为你需要编译的版本,我这里选择的是unity-2021.3-mbe。仓库下有很多子模块的依赖,可以修改mono目录下.gitmodules文件,修改里面的url地址替换成镜像源的地址。(我这边网络不行,我采用手动一个一个克隆),这里还需要注意下有些git submodules里面还会依赖submodules,要确保所有的submodules都初始化成功并且切换到对应的分支上 - 下载对应版本mono需要的Android NDK
打开
./external/buildscripts/build.pl
搜索ndkVersion
可以看到unity-2021.3-mbe
所需要的ndk的版本是r19c
,去下载ndk对应的版本,下载地址,下载完后解压到mono目录下的./external/buildscripts/artifacts/Stevedore
(如果没有artifacts目录请手动创建),将android-ndk-r19c
名字修改为android-ndk-linux
。 - 克隆android_krait_signal_handler仓库:
仓库地址:https://github.com/Unity-Technologies/krait-signal-handler
克隆android_krait_signal_handler到本地目录,克隆下载来的名字需要将krait-signal-handler
修改为android_krait_signal_handler
- ubuntu添加必备工具
autoconf automake libtool libtool-bin git cmake python
,不知道如何安装请自己查一下。
安装完所有工具后,先到usr/bin
目录下吧libtool
、libtoolize
这两个文件拷贝到mono目录下./external/buildscripts/artifacts/Stevedore/built-tools/bin/
(如果没有built-tools/bin目录请手动创建)。
目录结构:
unity mono这边的编译脚本有指定的路径结构,这里放出我的目录结构
|-- android_krait_signal_handler
|-- unityMono
| |-- mono
| | |-- external
| | | |-- buildscripts
| | | | |-- artifacts
| | | | | |-- Stevedore
| | | | | | |-- android-ndk-linux
| | | | | | |-- built-tools
mono文件夹对应的是mono仓库
android_krait_signal_handler文件夹对应的是krait-signal-handler仓库
android-ndk-linux文件夹对应的是Android NDK
buildtools文件夹对应工具
编译Android mono
cd ./unityMono/mono
./external/buildscripts/build_runtime_android.sh
如果编译前准备都做完了,此时应该是会编译成功。
如果有错误可以参考这个文章unity mono库编译笔记
我这边遇到了一个问题,记录下是如何解决的:
error:
arm-linux-androideabi/bin/ld: fatal error: a.out: Input/output error
clang: error: linker command failed with exit code 1 (use -v to see invocation)
configure1:6195: error: in `/mnt/hgfs/Share/unityMono/mono':
configure1:6197: error: C compiler cannot create executables
See `config.log' for more details
这个错误我在mono目录下的
./config.log
里面查看到的。Input/Output error 这个错误我查了下资料,引发这个错误的可能是链接器(Linker)在处理输出文件时遇到了磁盘I/O问题。
解决思路:
我一开始考虑是不是磁盘空间不足导致的,我只给我的虚拟磁盘分配了20G的空间容量,那我首先选择将磁盘扩容到了100G,并且重新分配磁盘分区。再次执行编译,发现还是这个错误。那么就不是磁盘空间导致的I/O错误。
ubuntu系统下如果路径过长会导致无法文件无法移动和复制,有可能是这个原因导致linker处理文件是出现I/O错误。我选择将mono的文件迁移到到系统桌面。再次执行编译,ok,成功编译!
Release问题:
修改fpic -g为fpic -O2 好像并不可行。找了一篇文章Ubuntu18.04下编译mono-unity-2019.2-mbe,按照文中的说法,编译后再选择用工具去剔除。