编译UNITY的MONO模块记录
起因
接收到一个UNITY文件处理的任务(c#逻辑代码存放的Assembly-CSharp.dll可热更等需求)
需要重新编译UNITY的mono模块 用于安卓环境下对DLL的定制处理
上网查阅了一些资料,经过多次尝试,得出以下编译成功的环境
ubuntu 16 32位(32位推荐 似乎脚本在X64处理有些问题)
gcc 4.8以上
glib 2.0 以上
我采用的虚拟机安装unbuntu 32位系统
准备
1 首先 sudo apt-get udpdate 刷新更新源

2 然后批量安装自己所需要的软件
sudo apt-get install autoconf automake bison build-essential gettext git libglib2.0 libtool* perl
3 配置NDK的环境,配置步骤 因为在错误的尝试中,MONO脚本会下载NDK到默认位置 所以我直接使用该文件路径 /home/userXXX/android-ndk_auto-r10e (userXXX是自己的用户名)
在终端输入sudo gedit ~/.bashrc。打开环境变量配置文件。
填写环境变量
NDK_ROOT=/home/userXXX/android-ndk_auto-r10e
NDK=$NDK_ROOT
ANDROID_NDK_ROOT=$NDK_ROOT
export NDK_ROOT NDK ANDROID_NDK_ROOT
所需要的文件安装
我们需要预先准备NDK 和 mono-unity的源码文件夹(我尝试过mono-unity5.6 /mono-unity2018.3/ mono-unity2017.4三个版本)
根据自己UNITY版本选择不同的mono源码版本
NDK选择r10e版本 因为是x86版本32位系统所以也选择x86版本的NDK 自己解压/home/userXXX/android-ndk_auto-r10e 或者待会执行MONO编译脚本 自行下载
源码文件夹之前最好再多出两个文件夹进行放置 路径类似于 /rootpath/1/2/mono-unity-code
因为mono源码脚本向上两个文件夹建立一个编译NDK的文件目录
1 下载的mono-unity文件夹中。找到build_runtime_android.sh文件。具体位置在\mono-unity-code\external\buildscripts文件夹中。把他放在\mono-unity-code\根目录中。
2 打开 build_runtime_android.sh文件。在15行perl ${BUILDSCRIPTSDIR}/PrepareAndroidSDK.pl -ndk=r10e -env=envsetup.sh && source envsetup.sh中。 -ndk=r10e描述的是所需ndk版本。
3 修改build_runtime_android.sh文件内容:
在文件第6行的export ANDROID_PLATFORM=android-9下面添加export ANDROID_NDK_ROOT=/home/userXXX/android-ndk_auto-r10e 。为防止不必要的错误,手动指定ndk目录。
如果出现无法找到 envsetuo.sh文件的错误。则需要手动指定envsetuo.sh文件所在目录。第15行perl ${BUILDSCRIPTSDIR}/PrepareAndroidSDK.pl -ndk=r10e -env=envsetup.sh && source envsetup.sh末端的``source中直接指定文件目录
source xxxx\xxxx\mono-unity-code\envsetup.sh
在文件第74行:-fpic -g -funwind-tables \中。把-g改为-O2(O0,O1,O2,O3分为好几个压缩档次)。通过更改这个可以编译出release版本。会比debug版本体积更小。
4 修改build_runtime_android_x86.sh文件内容:
在\mono-unity-code\external\buildscripts文件夹中找到:build_runtime_android_x86.sh文件。打开准备修改。
同build_runtime_android.sh的修改一样。在第6行下面添加NDK目录:export ANDROID_NDK_ROOT=/home/userXXX/android-ndk_auto-r10e
修改第71行:-fpic -g\。去掉-g改为-fpic \。为了防止x86下的手机进入游戏卡顿的情况。
检查编译所需环境是否合格。
1 方法一:打开终端。cd 到mono-unity-code目录中,使用管理员权限执行autogen.sh文件。命令为:sudo ./autogen.sh。这是个批处理文件,帮我们检查编译mono-unity所需要的环境。如果出现缺失库的错误,那么根据错误进行相应修改和安装。这个文件会帮你执行configure,make,make clean,make distclean等命令。
方法二:在终端中cd到mono-unity目录中。使用管理员权限执行sudo ./configure --prefix=/usr/bin命令。也是检查编译环境是否合格,如何没有合格,会报错。如果合格,则会他提示你执行make指令。到了这步,说明你的环境大致安装完成了。
开始第一次编译。管理员身份执行复制在mono-unity-code根目录下的build_runtime_android.sh文件,命令为:sudo ./ build_runtime_android.sh。不要使用"sudo sh build_runtime_android.sh "去执行。第一次编译通常情况下都会碰到/usr/bin/env: perl -w: No such file or directory的错误。没关系。这次编译只是为了下载krait-signal-handler依赖文件。
2 打开刚才下载的krait-signal-handler文件夹。找到里面的build.pl文件。修改第一行#!/usr/bin/env perl -w为#!/usr/bin/perl -w
3 用/mono-unity-code/external/buildscripts/目录下的PrepareAndroidSDK.pm替换/krait-signal-handler/目录下的PrepareAndroidSDK.pm。
4 修改/krait-signal-handler/文件夹下文件build.pl 该文件NDK版本号有错误

5 修改/krait-signal-handler/jni/文件夹下文件Application.mk .修改安卓版本号为9 修改工具链版本 4.8 (我没有使用clang)

编译
1 在mono-unity-code根目录下,再次编译,管理员身份执行复制在mono-unity-code根目录下的build_runtime_android.sh文件,命令为:sudo ./ build_runtime_android.sh
2 不出意外的话 应该就会编译成功了

unity 老版本mono 编译务必使用X86 linux
windows编译unity mono , 使用VS2010 可以避免很多不必要的麻烦
打开Visual Studio Command Prompt(2010)
进入mono-unity-4.5\msvc目录
执行msbuild.exe mono.sln /p:Configuration=Release_eglib
https://github.com/xxtea/xxtea-c
参考
https://blog.csdn.net/huutu/article/details/50829828
https://blog.csdn.net/kitok/article/details/72472142
https://www.cnblogs.com/lijiajia/p/7822571.html
https://blog.csdn.net/KiTok/article/details/71404711?locationNum=6&fps=1
https://blog.csdn.net/kitok/article/details/72472142
https://blog.csdn.net/qq_27772057/article/details/51945700
编译UNITY的MONO模块记录的更多相关文章
- Linux下编译安装Apache及模块
Apache是时下最流行的Webserver软件之中的一个,支持多平台,可高速搭建web服务,并且稳定可靠.并可通过简单的API扩充.就能够集成PHP/Python等语言解释器. 文章这里解说怎样在l ...
- linux内核裁剪及编译可加载模块
一:linux内核裁剪: 1:编译内核源码: 今天的重点内容是内核驱动的编写,在编写驱动之前首先的了解linux内核源码,linux主要是由五个子系统组成:进程调度,内存管理,文件系统,网络接口以及进 ...
- Unity AssetBundle 踩坑记录
Unity AssetBundle 踩坑记录 editor 下选择什么平台的 ab 加载 Material doesn't have a color property '_Color' UnityEd ...
- webdriver高级应用- 使用日志模块记录测试过程中的信息
在自动化脚本执行过程中,使用Python的日志模块记录在测试用例执行过程中一些重要信息或者错误日志等,用于监控和后续调试脚本. 在pycharm下新建工程,并创建Log.py.Logger.conf以 ...
- 【01】Nginx:编译安装/动态添加模块
写在前面的话 说起 Nginx,别说运维,就是很多开发人员也很熟悉,毕竟如今已经 2019 年了,Apache 更多的要么成为了历史,要么成为了历史残留. 我们在提及 Nginx 的时候,一直在强调他 ...
- Linux操作系统内核编译之NTFS文件系统模块支持案例
Linux操作系统内核编译之NTFS文件系统模块支持案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.内核编译概述 单内核体系设计.但充分借鉴了微内核设计体系的优点,为内核引 ...
- 开源框架---通过Bazel编译使用tensorflow c++ API 记录
开源框架---通过Bazel编译使用tensorflow c++ API 记录 tensorflow python API,在python中借用pip安装tensorflow,真的很方便,几句指令就完 ...
- Unity游戏Mono内存管理及泄漏
UWA工具 https://yq.aliyun.com/articles/435553 Unity游戏Mono内存管理及泄漏 https://wetest.qq.com/lab/view/135.ht ...
- Unity加载模块深度解析(纹理篇)
在游戏和VR项目的研发过程中,加载模块所带来的效率开销和内存占用(即“加载效率”.“场景切换速度”等)经常是开发团队非常头疼的问题,它不仅包括资源的加载耗时,同时也包含场景物件的实例化和资源卸载等.在 ...
随机推荐
- Http User Agent Example
Browser User Agent Safari Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_1 like Mac OS X) AppleWebKit/603. ...
- PP.io的三个阶段,“强中心”——“弱中心”——“去中心”
什么是PP.io? PP.io是我和Bill发起的存储项目,目的在于为开发者提供一个去中心化的存储和分发平台,能做到更便宜,更高速,更隐私. 当然做去中心化存储的项目也有好几个,FileCoin,Si ...
- windows shell命令相关
一 系统自带的命令 1 创建文件夹 mkdir 文件夹名 2 强制删除文件夹 rd/s/q 文件夹名 3 强制删除文件 del/f/s/q 文件名 4 移动文件到文件夹 move 文件名 文件夹名 二 ...
- Vue非父子组件之间的传值
1.新建一个js文件 然后引入vue 实例化vue 最后暴露这个实例:实例化Vue对象的时候名称要小写,大写控制台报错,我也不知道什么原因: 2.在要广播的地方引入刚才定义的实例: 3通过VueEm ...
- 深入理解Servlet原理
Servlet介绍: 1. 如何返回一个网页: a. 静态网页 >新闻页.百度百科 >服务器保存一份HTML,直接返回给浏览器即可 b. 动态网页 >淘宝.QQ空间.微博 >服 ...
- nginx gunicorn 部署flask,带参数链接不可用的现象(笔记)
微信小程序后台,开启 gunicorn之后屏幕会输出打印结果,一旦关闭shell 带参数链接不可用,只有开启shell才能使用, 一针见血 : 注释掉所有print语句,关闭shell 带参数的链接 ...
- Centos Tomcat监控
1.Window环境下jdk的bin目录中提供jvisualvm.exe工具,但是linux环境中的jdk未提供. 用window下的jvisualvm远程监控linux环境下的tomcat 两种连接 ...
- leetcode48
根据题目寻找规律,使用临时变量记录被替换的数据. class Solution { public: void rotate(vector<vector<int>>& m ...
- leetcode169
public class Solution { public int MajorityElement(int[] nums) { Dictionary<int, int> dic = ne ...
- ecs主机被破解后下载的执行文件的脚本
#!/bin/bashchmod 777 xiaochattr 777 haha/etc/init.d/iptables stop;service iptables stop;SuSEfirewall ...