Unity mono源码编译

导语 由于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

解释

  1. 设置错误处理set -e 命令确保脚本在遇到错误时立即退出。

  2. 定义变量

    • PROJECT_DIR:当前项目的根目录。
    • BUILD_DIR:构建目录。
    • OUTPUT_DIR:输出目录。
    • APK_NAME:生成的 APK 文件名。
  3. Unity 安装路径UNITY_PATH 变量设置为 Unity 编辑器的安装路径。

  4. 项目路径PROJECT_PATH 变量设置为 Unity 项目的路径。

  5. 输出路径OUTPUT_PATH 变量设置为生成的 APK 文件的路径。

  6. 构建日志文件路径LOG_FILE 变量设置为构建日志文件的路径。

  7. 构建目标BUILD_TARGET 变量设置为 Android。

  8. 构建脚本路径BUILD_SCRIPT 变量设置为 Unity 项目中的构建脚本路径。

  9. 创建输出目录mkdir -p $OUTPUT_DIR 命令创建输出目录。

  10. 执行 Unity 构建命令:调用 Unity 的命令行接口来执行构建操作。

  11. 检查构建结果:检查构建命令的退出状态码,如果构建成功则输出 “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 方法执行构建,并获取构建报告。

  • 检查构建结果

    • 如果构建成功,输出构建成功的信息和生成文件的大小。
    • 如果构建失败,输出错误信息。

使用说明

  1. 设置 Unity 安装路径:在 build_runtime_android.sh 脚本中,将 UNITY_PATH 变量设置为你的 Unity 编辑器的安装路径。

  2. 设置项目路径:将 PROJECT_PATH 变量设置为你的 Unity 项目的路径。

  3. 设置输出路径:将 OUTPUT_PATH 变量设置为你希望生成的 APK 文件的路径。

  4. 设置构建脚本路径:确保 BUILD_SCRIPT 变量指向你的 Unity 项目中的构建脚本路径。

  5. 设置场景路径:在 BuildScript.cs 中,将 buildPlayerOptions.scenes 数组中的路径替换为你项目中的实际场景路径。

  6. 运行 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 源码。

前提条件

  1. 操作系统:确保你使用的是支持的操作系统(例如,Linux 或 macOS)。
  2. 依赖项:安装必要的依赖项,如 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

注意事项

  1. Android NDK 版本:确保使用与 Unity 兼容的 Android NDK 版本。不同版本的 NDK 可能会导致编译错误。

  2. CMake 版本:确保使用最新版本的 CMake,以避免兼容性问题。

  3. 依赖项:确保所有必要的依赖项都已安装,包括编译工具链、库和头文件。

  4. 权限:在某些系统上,你可能需要使用 sudo 来执行某些命令,特别是安装步骤。

  5. 调试:如果遇到编译错误,可以查看生成的日志文件或在 CMake 配置中启用详细输出以获取更多调试信息。

参考资源

通过这些步骤和注意事项,你应该能够成功编译 Unity 的 Mono 源码。如果你遇到任何问题,请参考官方文档

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你一身傲骨怎能输

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值