导语 由于Unity官方附带的mono是debug版,将编译器优化级别调整到-O2,对快速提高手游的运行速度,提高关卡的加载速度,效果显著
获取Unity对应版本的mono源码
编译Windows版
打开mono源码根目录/msvc/mono.sln(以Unity4对应mono源码为例,使用Visual Studio 2010打开),选择Release_egli选项,编译,可获得对应dll:mono源码根目录/builds/embedruntimes/win32/mono.dll,覆盖拷贝到 Unity引擎目录/Editor/Data/Mono/EmbedRuntime/mono.dll 即可
build_runtime_android.sh 脚本
Mono 源码目录下的 external/buildscripts/build_runtime_android.sh
脚本是用于构建 Android 平台的项目的脚本。这个脚本通常包含一些用于设置环境变量、配置构建选项和调用构建工具的命令。以下是一个典型的 build_runtime_android.sh
脚本的示例内容:
#!/bin/bash
# 设置错误处理
set -e
# 定义一些变量
PROJECT_DIR=$(pwd)
BUILD_DIR="$PROJECT_DIR/build"
OUTPUT_DIR="$BUILD_DIR/output"
APK_NAME="MyApp.apk"
# Unity 安装路径
UNITY_PATH="/path/to/your/Unity/Editor/Unity"
# 项目路径
PROJECT_PATH="$PROJECT_DIR/UnityProject"
# 输出 APK 文件路径
OUTPUT_PATH="$OUTPUT_DIR/$APK_NAME"
# 构建日志文件路径
LOG_FILE="$BUILD_DIR/build.log"
# 构建目标
BUILD_TARGET="Android"
# 构建脚本路径
BUILD_SCRIPT="Assets/Editor/BuildScript.cs"
# 创建输出目录
mkdir -p $OUTPUT_DIR
# 执行 Unity 构建命令
$UNITY_PATH -quit -batchmode -projectPath $PROJECT_PATH -executeMethod BuildScript.BuildAndroid -logFile $LOG_FILE -buildTarget $BUILD_TARGET -outputPath $OUTPUT_PATH
# 检查构建结果
if [ $? -eq 0 ]; then
echo "Build succeeded"
else
echo "Build failed"
cat $LOG_FILE
exit 1
fi
解释
-
设置错误处理:
set -e
命令确保脚本在遇到错误时立即退出。 -
定义变量:
PROJECT_DIR
:当前项目的根目录。BUILD_DIR
:构建目录。OUTPUT_DIR
:输出目录。APK_NAME
:生成的 APK 文件名。
-
Unity 安装路径:
UNITY_PATH
变量设置为 Unity 编辑器的安装路径。 -
项目路径:
PROJECT_PATH
变量设置为 Unity 项目的路径。 -
输出路径:
OUTPUT_PATH
变量设置为生成的 APK 文件的路径。 -
构建日志文件路径:
LOG_FILE
变量设置为构建日志文件的路径。 -
构建目标:
BUILD_TARGET
变量设置为 Android。 -
构建脚本路径:
BUILD_SCRIPT
变量设置为 Unity 项目中的构建脚本路径。 -
创建输出目录:
mkdir -p $OUTPUT_DIR
命令创建输出目录。 -
执行 Unity 构建命令:调用 Unity 的命令行接口来执行构建操作。
-
检查构建结果:检查构建命令的退出状态码,如果构建成功则输出 “Build succeeded”,否则输出 “Build failed” 并显示构建日志。
Unity C# 构建脚本
为了使上述 Shell 脚本正常工作,你还需要在 Unity 项目中创建一个 C# 构建脚本。以下是一个示例:
using UnityEditor;
using UnityEngine;
using UnityEditor.Build.Reporting;
public class BuildScript
{
public static void BuildAndroid()
{
// 获取命令行参数中的输出路径
string[] args = System.Environment.GetCommandLineArgs();
string outputPath = "";
for (int i = 0; i < args.Length; i++)
{
if (args[i] == "-outputPath" && i + 1 < args.Length)
{
outputPath = args[i + 1];
break;
}
}
if (string.IsNullOrEmpty(outputPath))
{
Debug.LogError("Output path not specified");
return;
}
// 构建选项
BuildPlayerOptions buildPlayerOptions = new BuildPlayerOptions();
buildPlayerOptions.scenes = new[] { "Assets/Scenes/MainScene.unity" }; // 替换为你的场景路径
buildPlayerOptions.locationPathName = outputPath;
buildPlayerOptions.target = BuildTarget.Android;
buildPlayerOptions.options = BuildOptions.None;
// 执行构建
BuildReport report = BuildPipeline.BuildPlayer(buildPlayerOptions);
BuildSummary summary = report.summary;
// 检查构建结果
if (summary.result == BuildResult.Succeeded)
{
Debug.Log("Build succeeded: " + summary.totalSize + " bytes");
}
if (summary.result == BuildResult.Failed)
{
Debug.LogError("Build failed");
}
}
}
解释
-
获取命令行参数:脚本通过
System.Environment.GetCommandLineArgs()
获取命令行参数,并解析出输出路径。 -
检查输出路径:如果没有指定输出路径,脚本会输出错误信息并返回。
-
构建选项:
scenes
:指定要包含在构建中的场景列表。你需要将其替换为你项目中的实际场景路径。locationPathName
:指定生成的 APK 文件的路径。target
:设置构建目标为 Android。options
:设置构建选项,这里使用BuildOptions.None
表示不使用额外的构建选项。
-
执行构建:使用
BuildPipeline.BuildPlayer
方法执行构建,并获取构建报告。 -
检查构建结果:
- 如果构建成功,输出构建成功的信息和生成文件的大小。
- 如果构建失败,输出错误信息。
使用说明
-
设置 Unity 安装路径:在
build_runtime_android.sh
脚本中,将UNITY_PATH
变量设置为你的 Unity 编辑器的安装路径。 -
设置项目路径:将
PROJECT_PATH
变量设置为你的 Unity 项目的路径。 -
设置输出路径:将
OUTPUT_PATH
变量设置为你希望生成的 APK 文件的路径。 -
设置构建脚本路径:确保
BUILD_SCRIPT
变量指向你的 Unity 项目中的构建脚本路径。 -
设置场景路径:在
BuildScript.cs
中,将buildPlayerOptions.scenes
数组中的路径替换为你项目中的实际场景路径。 -
运行 Shell 脚本:在终端中运行
build_runtime_android.sh
脚本来执行构建操作。
chmod +x build_runtime_android.sh
./build_runtime_android.sh
注意事项
- 确保 Unity 项目中已经配置好 Android 构建设置,包括签名、包名等。
- 确保 Unity 编辑器的版本与项目兼容。
- 确保在执行构建脚本之前,所有需要的场景和资源都已保存并准备好。
通过这种方式,你可以使用 Mono 源码目录下的 external/buildscripts/build_runtime_android.sh
脚本来自动化构建 Android 平台的 Unity 项目。
编译安卓版
打开mono源码目录/external/buildscripts/build_runtime_android.sh 进行编译修改
由于一般是不用armv5、armv6的版本,可都删掉,保留armv7,提高编译速度
cd到mono源码根目录,然后把build_runtime_android.sh拖到终端里,执行就好
将编译获得的结果:/build/libs/armeabi-v7a/libmono.so 覆盖拷贝到 Unity引擎目录/Editor/Data/Mono/PlaybackEngines/AndroidPlayer/development/libs/armeabi-v7a/libmono.so 和 Unity引擎目录/Editor/Data/Mono/PlaybackEngines/AndroidPlayer/release/libs/armeabi-v7a/libmono.so 即可
Unity mono源码编译流程
编译 Unity 的 Mono 源码是一个复杂的过程,涉及多个步骤和依赖项。以下是一个简要的指南,帮助你开始编译 Unity 的 Mono 源码。
前提条件
- 操作系统:确保你使用的是支持的操作系统(例如,Linux 或 macOS)。
- 依赖项:安装必要的依赖项,如 Git、CMake、Python、JDK 等。
步骤
1. 克隆 Mono 源码
首先,克隆 Mono 源码仓库。你可以从 Unity 的官方仓库或其他可信的来源获取源码。
git clone https://github.com/Unity-Technologies/mono.git
cd mono
2. 初始化子模块
Mono 源码仓库可能包含子模块。你需要初始化和更新这些子模块。
git submodule update --init --recursive
3. 安装依赖项
根据你的操作系统,安装必要的依赖项。以下是一些常见的依赖项:
-
Linux:
sudo apt-get update sudo apt-get install -y autoconf libtool automake build-essential cmake python3
-
macOS:
brew install autoconf libtool automake cmake python3
4. 配置构建环境
在构建之前,你需要配置构建环境。Mono 使用 autogen.sh
脚本来生成配置文件。
./autogen.sh
5. 编译 Mono
运行 make
命令来编译 Mono 源码。
make
6. 安装 Mono
编译完成后,你可以选择安装 Mono。
sudo make install
编译 Unity 的 Mono Runtime
如果你需要编译 Unity 的 Mono Runtime,可能需要一些额外的步骤和配置。以下是一个示例脚本 build_runtime_android.sh
,用于编译 Android 平台的 Mono Runtime。
build_runtime_android.sh
#!/bin/bash
# 设置错误处理
set -e
# 定义一些变量
MONO_SOURCE_DIR=$(pwd)
BUILD_DIR="$MONO_SOURCE_DIR/build"
OUTPUT_DIR="$BUILD_DIR/output"
ANDROID_NDK_PATH="/path/to/your/android-ndk"
# 创建构建目录
mkdir -p $BUILD_DIR
cd $BUILD_DIR
# 配置构建环境
cmake -DANDROID_NDK=$ANDROID_NDK_PATH -DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK_PATH/build/cmake/android.toolchain.cmake -DANDROID_ABI=armeabi-v7a -DANDROID_PLATFORM=android-21 ..
# 编译 Mono Runtime
make
# 安装到输出目录
make install DESTDIR=$OUTPUT_DIR
# 检查构建结果
if [ $? -eq 0 ]; then
echo "Build succeeded"
else
echo "Build failed"
exit 1
fi
解释
- 设置错误处理:
set -e
命令确保脚本在遇到错误时立即退出。 - 定义变量:定义一些必要的路径和目录。
- 创建构建目录:创建并切换到构建目录。
- 配置构建环境:使用 CMake 配置构建环境,指定 Android NDK 路径和其他构建选项。
- 编译 Mono Runtime:运行
make
命令编译 Mono Runtime。 - 安装到输出目录:将编译结果安装到指定的输出目录。
- 检查构建结果:检查构建命令的退出状态码,如果构建成功则输出 “Build succeeded”,否则输出 “Build failed” 并退出。
注意事项
- Android NDK:确保你已经安装了 Android NDK,并将
ANDROID_NDK_PATH
变量设置为正确的路径。 - 依赖项:确保所有必要的依赖项都已安装。
- 权限:在某些系统上,你可能需要使用
sudo
来执行某些命令。
通过这些步骤,你应该能够成功编译 Unity 的 Mono 源码。如果你遇到任何问题,请参考官方文档或社区资源以获取更多帮助。
当然,以下是继续的内容,进一步详细说明编译 Unity 的 Mono 源码的步骤和注意事项。
详细步骤
1. 设置环境变量
在编译之前,确保设置了必要的环境变量。以下是一些常见的环境变量:
export ANDROID_NDK_PATH=/path/to/your/android-ndk
export PATH=$ANDROID_NDK_PATH/toolchains/llvm/prebuilt/linux-x86_64/bin:$PATH
2. 配置 CMake 构建
使用 CMake 配置构建环境。以下是一个示例命令,用于配置 Android 平台的构建:
cmake -DANDROID_NDK=$ANDROID_NDK_PATH \
-DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK_PATH/build/cmake/android.toolchain.cmake \
-DANDROID_ABI=armeabi-v7a \
-DANDROID_PLATFORM=android-21 \
-DCMAKE_BUILD_TYPE=Release \
-Bbuild -H.
-DANDROID_NDK
:指定 Android NDK 的路径。-DCMAKE_TOOLCHAIN_FILE
:指定 CMake 工具链文件。-DANDROID_ABI
:指定目标 ABI(例如armeabi-v7a
)。-DANDROID_PLATFORM
:指定目标 Android 平台版本。-DCMAKE_BUILD_TYPE
:指定构建类型(例如Release
)。-Bbuild
:指定构建目录。-H.
:指定源代码目录。
3. 编译 Mono Runtime
在配置完成后,运行 make
命令来编译 Mono Runtime:
cd build
make -j$(nproc)
-j$(nproc)
:使用所有可用的 CPU 核心进行并行编译,以加快编译速度。
4. 安装编译结果
编译完成后,可以将编译结果安装到指定的输出目录:
make install DESTDIR=$OUTPUT_DIR
DESTDIR
:指定安装目录。
示例脚本
以下是一个完整的示例脚本 build_runtime_android.sh
,用于自动化上述步骤:
#!/bin/bash
# 设置错误处理
set -e
# 定义一些变量
MONO_SOURCE_DIR=$(pwd)
BUILD_DIR="$MONO_SOURCE_DIR/build"
OUTPUT_DIR="$BUILD_DIR/output"
ANDROID_NDK_PATH="/path/to/your/android-ndk"
# 设置环境变量
export PATH=$ANDROID_NDK_PATH/toolchains/llvm/prebuilt/linux-x86_64/bin:$PATH
# 创建构建目录
mkdir -p $BUILD_DIR
cd $BUILD_DIR
# 配置构建环境
cmake -DANDROID_NDK=$ANDROID_NDK_PATH \
-DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK_PATH/build/cmake/android.toolchain.cmake \
-DANDROID_ABI=armeabi-v7a \
-DANDROID_PLATFORM=android-21 \
-DCMAKE_BUILD_TYPE=Release \
-B$BUILD_DIR -H$MONO_SOURCE_DIR
# 编译 Mono Runtime
make -j$(nproc)
# 安装到输出目录
make install DESTDIR=$OUTPUT_DIR
# 检查构建结果
if [ $? -eq 0 ]; then
echo "Build succeeded"
else
echo "Build failed"
exit 1
fi
注意事项
-
Android NDK 版本:确保使用与 Unity 兼容的 Android NDK 版本。不同版本的 NDK 可能会导致编译错误。
-
CMake 版本:确保使用最新版本的 CMake,以避免兼容性问题。
-
依赖项:确保所有必要的依赖项都已安装,包括编译工具链、库和头文件。
-
权限:在某些系统上,你可能需要使用
sudo
来执行某些命令,特别是安装步骤。 -
调试:如果遇到编译错误,可以查看生成的日志文件或在 CMake 配置中启用详细输出以获取更多调试信息。
参考资源
通过这些步骤和注意事项,你应该能够成功编译 Unity 的 Mono 源码。如果你遇到任何问题,请参考官方文档