对于没有升级到 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. Spring注解@Resource和@Autowired的区别

    @Resource和@Autowired都是用来做bean的依赖注入的,两者都可以写在字段和setter方法上. java为我们提供了 javax.annotation.Resource这个注解. s ...

  2. UVA 580 Critical Mass

    https://vjudge.net/problem/UVA-580 题意:一堆U和L,用n个排成一排,问至少有3个U放在一起的方案数 f[i] 表示 至少有3个U放在一起的方案数 g[i] 表示没有 ...

  3. 数学:Burnside引理与Pólya定理

    这个计数定理在考虑对称的计数中非常有用 先给出这个定理的描述,虽然看不太懂: 在一个置换群G={a1,a2,a3……ak}中,把每个置换都写成不相交循环的乘积. 设C1(ak)是在置换ak的作用下不动 ...

  4. jQuery日历签到插件

    插件比较简单,先来看DEMO吧,http://codepen.io/jonechen/pen/bZWdXq: CSS部分: *{margin:0;padding:0;font:14px/1.8 &qu ...

  5. 第八周 yukun 20155335

  6. SCU 1029 Humble Numbers (打表处理)

    题目链接 题意:素因子中只有2 3 5 7的数称为谦逊的数,1也是谦逊的数,题目中已经给出了前20个谦逊的数.给定数字n,按格式输出第n个谦逊的数. 题解:打表即可,注意打表的技巧就行了. ps:这道 ...

  7. Remmarguts' Date(POJ2449+最短路+A*算法)

    题目链接:http://poj.org/problem?id=2449 题目: 题意:求有向图两点间的k短路. 思路:最短路+A*算法 代码实现如下: #include <set> #in ...

  8. poj 2387 Til the Cows Come Home(dijkstra算法)

    题目链接:http://poj.org/problem?id=2387 题目大意:起点一定是1,终点给出,然后求出1到所给点的最短路径. 注意的是先输入边,在输入的顶点数,不要弄反哦~~~ #incl ...

  9. Android跳转到拨打电话的页面

    在Android6.0之后,拨打电话需要用户授予动态权限,项目中有此需求,有一种简单的方法,直接携带电话号码跳转到系统拨打电话的页面,很多应用也是这么做的,这样可以减轻工作量 代码如下: Androi ...

  10. Android中TextView设置字体

    最近项目中出现把字体设置成宋体,微软雅黑,黑体,楷体等的需求; 度娘发现Android系统默认支持三种字体,分别为:“sans”, “serif”, “monospace",除此之外还可以使 ...