对于没有升级到 Unity5.4的用户,发布安卓版本都会有对 C# 脚本进行加密的需求,我们项目在裸奔了很长时间后,决定开始做这件事。

  网上查看了很多资料,我很希望直接在 windows 下编译而不去安装虚拟机在 linux 或者在 mac 下安装,大概预计猜测就是 Cygwin, MinGW, MSYS 之类。最终 这篇博客 给我了很大的帮助,最终在继续踩坑和摸索下,完成了编译。

  这里只总结下编译的过程,这里是重点,至于加密方法很多,各自选择吧,不在此赘述。

  • 下载 Unity-mono 源码

    • 我们使用的 5.3,经过查看官方的 Release Note,发布时间,以及 Unity-Mono 的 Commit 日志,发现 Unity Mono 5.3 分支的最后一次提交与 Unity5.3.7p4 保持一致。
  • 准备编译环境:MinGW + MSYS
    • 下载 MinGW-w64 并安装。(注:原生 MinGW 已经很久不维护,而 MinGW-w64 则一致更新很快,且工具集很全。但是:原生的 MingW 也可以下载和安装,有很多人抱怨自带的下载安装程序下载很慢,如果选择了的这个,为了节省时间,建议直接勾选所有的选项全部下载,否则自己不明白用途到了后期编译会不断出现缺少工具的问题。)
    • 下载安装 MSYS,这个只能通过下载原生的 MinGW 安装程序,然后只选择安装 MSYS,而不安装 MinGW。如果不使用 MinGW-w64 那么直接按照上一条所说,下载安装 MinGW 的全部内容即可,如果缺少任何工具,前往 https://sourceforge.net/projects/mingw/files/MSYS/ 自行下载即可,直接覆盖到 msys/1.0/ 下。
    • 以上所有安装路径最好不要出现空格。(或者理解为绝对不要出现空格)
    • 当你第一次通过安装 MinGW 安装 MSYS 时,安装程序会自动配置 MSYS 需要的 MinGW 所在路径,在 msys/1.0/etc/fstab 文件中:
      # Win32_Path        Mount_Point
      #---------------    -----------
      D:/mingw              /mingw

      将 Win32_Path 下的 MinGW 安装路径替换为你本地的 MinGW 安装路径即可。如果不修改到编译最后会因环境变量的问题出错,出现形如:Can't exec "cpp": No such file or directory at ./genmdesc.pl line 53. 的错误,这是 cpp 这个环境变量定义的编译器文件路径最终没有找到可执行文件。

    • 为了方便编译,我整理好了一个 MinGW-W64+MSYS 的环境包,点击下载。下载解压后,记住需要修改 mingw-w64/x64/posix-seh/mingw64/msys/1.0/etc/fstab 中 mingw-w64 路径为:$(InstallDir)/mingw-w64/x64/posix-seh/mingw64,$(InstallDir) 为你安装的根目录,不要直接 copy。修改完毕双击 $(InstallDir)/mingw-w64/x64/posix-seh/mingw64/msys/1.0/msys.bat 即可开始使用编译环境。注:旁边的 "MSYS" 和 "MSYS-norxvt" 两个文件是指向 msys.bat 的快捷方式。
    • 由于后面编译 Mono 需要一个 Zip 解压程序,以上安装包均不包含,自行前往 https://sourceforge.net/projects/mingw/files/MSYS/Extension/zip/zip-3.0-1/ 进行 下载,然后解压缩直接覆盖到 $(InstallDir)/mingw-w64/x64/posix-seh/mingw64/msys/1.0/ 即可。
  • 下载 NDK r10e
    • 32 或者 64 位均可,你可以根据自己的系统来选择。官方下载地址(无需FQ):32位 / 64位
  • 下载 Zip
    • 整个编译过程会用到 zip 命令,而默认的 MinGW+MSYS 环境中没有,可以在这里下载,然后解压缩覆盖到到 $(InstallDir)/mingw-w64/x64/posix-seh/mingw64/msys/1.0/ 下。
  • 修改 Mono 编译脚本,位于 Mono 源码目录下 external/buildscripts/:
    • 修改文件 build_runtime_android.sh,在文件脚本最最开始处(line:6)添加 "export ANDROID_NDK_ROOT=/$(NdkRoot)",$(NdkRoot) 为你本地的 Ardroid NDK 安装根目录。
    • 修改文件 build_runtime_android.sh,将 KRAIT_PATCH_PATH="${CWD}/../../android_krait_signal_handler/build" 修改为:KRAIT_PATCH_PATH="${CWD}/android_krait_signal_handler/build"。(这个项目在编译时会动态 clone,应该被 clone 到源码根目录,如果不修改会 clone 到源码的上两级目录)。
    • 修改文件 build_runtime_android.sh,将 -fpic -g -funwind-tables \ 修改为 -fpic -O2 -funwind-tables \ 以便编译为 release 版本。
    • 修改文件 build_runtime_android.sh,只保留 armv7的编译,注释掉 armv5, armv6,形如:#clean_build "$CCFLAGS_ARMv5_CPU" "$LDFLAGS_ARMv5" "$OUTDIR/armv5",#clean_build "$CCFLAGS_ARMv6_VFP" "$LDFLAGS_ARMv5" "$OUTDIR/armv6_vfp"。
    • 修改文件 build_runtime_android_x86.sh,将 -fpic -g \ 修改为 -fpic -O2 \ 。
    • 修改文件 PrepareAndroidSDK.pm,将 elsif(lc $^O eq 'cygwin') 修改为:elsif(lc $^O eq 'cygwin' or lc $^O eq 'msys')。
  • 修改 android_krait_signal_handler 编译脚本
    • 如果已经启动过第一次编译并且失败或者主动 clone 过 android_krait_signal_handler 项目并存放于 Mono 源码根目录下,则修改其编译脚本。
    • 修改 $(CloneDir)/PrepareAndroidSDK.pm,将 elsif(lc $^O eq 'cygwin') 修改为:elsif(lc $^O eq 'cygwin' or lc $^O eq 'msys'),$(CloneDir)为该项目的 clone 本地目录。
  • 开始尝试编译
    • 开始编译,启动 MSYS 命令行,切换到 Mono 源码根目录,运行 ./external/buildscripts/build_runtime_android.sh,启动编译.
    • 如果未处理过 android_krait_signal_handler,那么编译脚本会先 clone 此项目,并且失败,如果启动了 clone 并且失败,那么请参照上一条 “修改 android_krait_signal_handler 编译脚本” 进行修改后重新编译。
    • 等待命令行的各种检查,编译,输出,最后成功,会同时编译 armv7 和 x86 两个结果,分别在目录:$(MonoSrcDir)/builds/embedruntimes/android/ 下的 armv7a 和 x86 两个目录,文件为:libmono.so。

  至此,按照以上的步骤,所有的编译过程会顺利完成。其中一些步骤都是经过反复实验出错修改最后发现的,并不是一帆风顺。如果新手第一次编译建议严格按照以上步骤进行,等编译顺利通过后再自行修改参数进行自定义。如果按照以上步骤却编译失败,那么以上记录可能有遗漏的地方,请告知。

  Have Fun! :)

【参考引用】

  1. http://www.cnblogs.com/lixiang-share/p/5978107.html
  2. http://www.xuanyusong.com/archives/3553

Windows 下使用 mingw+msys 交叉编译 Android Unity Mono的更多相关文章

  1. 开源项目:windows下使用MinGW+msys编译ffmpeg

    本文参考了网络上的不少文章,但由于版本环境的问题参考文章并不能直接指导编译,本文吸收多方经验,并在自己多次编译实验的基础上写成,欢迎转载,请注名出处.    FFmpeg是在Linux平台下开发的,但 ...

  2. windows 下使用 MinGW + msys 编译 ffmpeg

    本文参考了网络上的不少文章,但由于版本环境的问题参考文章并不能直接指导编译,本文吸收多方经验,并在自己多次编译实验的基础上写成,欢迎转载,请注名出处.    FFmpeg是在Linux平台下开发的,但 ...

  3. Windows下将ImageMagick移植到Android平台

    Windows下将ImageMagick移植到Android平台 原文链接  http://www.pedant.cn/2014/06/18/imagemagick-ported-android/ I ...

  4. 手把手教你在Windows下使用MinGW编译libav(参考libx264的编入)

    转自:http://www.th7.cn/Program/cp/201407/242762.shtml 手把手教你在Windows下使用MinGW编译libav libav是在Linux下使用纯c语言 ...

  5. 在Linux下使用MinGW静态交叉编译带有zlib的libcurl(包括交叉编译openssl,即--cross-compile-prefix=i686-w64-mingw32- mingw)

    在Linux下使用MinGW静态交叉编译带有zlib的libcurl libcurl是一个跨平台的.易用的.强大的网络库.在大部分Linux发行版中都有编译好的二进制包可供使用,Mac系统更是将其作为 ...

  6. 在Windows下使用MinGW静态编译Assimp

    使用MinGW静态编译Assimp 到了5月份了,没有写一篇日志,于是自己从知识库里面拿出一篇文章充数吧.这次将要解说怎样在Windows下使用MinGW静态编译Assimp. Assimp是眼下比較 ...

  7. windows下使用mingw和msvc静态编译Qt5.15.xx

    windows下使用mingw和msvc静态编译Qt5.15.xx 下载并安装相关依赖软件 Python version 2.7 https://www.python.org/downloads/ ( ...

  8. windows 下使用 mingw编译器 调试时 无法跟进源码

    windows 下使用 mingw编译器 调试时 无法跟进源码 最近在公司使用QT 开发,官方在线下载的 安装的QT mingw 都是没有debug版本的 由于没有debug版本动态库 所以你调试的时 ...

  9. windows下使用mingw和msys编译GOTOBLAS和OpenBLAS

    在windows下利用msys编译openBLAS若遇到错误提示: gcc: CreateProcess : No such file or directory 问题原因参考:http://www.c ...

随机推荐

  1. COGS1882 [国家集训队2011]单选错位

    ★   输入文件:nt2011_exp.in   输出文件:nt2011_exp.out   简单对比时间限制:1 s   内存限制:512 MB [试题来源] 2011中国国家集训队命题答辩 [问题 ...

  2. 【BZOJ】4530: [Bjoi2014]大融合

    [题意]给定n个点的树,从无到有加边,过程中动态询问当前图某条边两端连通点数的乘积,n<=10^5. [算法]线段树合并+并查集 (||LCT(LCT维护子树信息 LCT维护子树信息(+启发式合 ...

  3. Html5学习2(Html表格、Html列表、Html5新元素、Canvas (坐标、路径、画圆、文本、渐变、图像))

    Html表格 1.表格中的表头:<th></th>.其中表头部分字体加粗,颜色深绿色 <h4>水平标题:</h4> <table border=& ...

  4. python基础===函数的几个要点

    函数 可接受任意数量参数的函数 位置参数   和  关键字参数 为了能让一个函数接受任意数量的位置参数,可以使用一个*参数. def avg(first, *r): return (first + s ...

  5. python基础===进程,线程,协程的区别(转)

    本文转自:http://blog.csdn.net/hairetz/article/details/16119911 进程拥有自己独立的堆和栈,既不共享堆,亦不共享栈,进程由操作系统调度. 线程拥有自 ...

  6. 《LINUX3.0内核源代码分析》第二章:中断和异常 【转】

    转自:http://blog.chinaunix.net/uid-25845340-id-2982887.html 摘要:第二章主要讲述linux如何处理ARM cortex A9多核处理器的中断.异 ...

  7. OPENSOLARIS source

    http://blog.csdn.net/nemo2011/article/details/8543220 http://fxr.watson.org/fxr/source/?v=OPENSOLARI ...

  8. 【LOJbeta round1】ZQC的手办

    NOI2012-超级钢琴的升级版. 用线段树维护最小值及其出现位置,接下来就跟超级钢琴一个做法了. #include<bits/stdc++.h> #define N 500010 #de ...

  9. pycaffe做识别时通道转换问题

    转自---------------------  作者:Peanut_范  来源:CSDN  原文:https://blog.csdn.net/u013841196/article/details/7 ...

  10. 经典卷积网络模型 — LeNet模型笔记

    LeNet-5包含于输入层在内的8层深度卷积神经网络.其中卷积层可以使得原信号特征增强,并且降低噪音.而池化层利用图像相关性原理,对图像进行子采样,可以减少参数个数,减少模型的过拟合程度,同时也可以保 ...