彻底解决IL2CPP 开启Strip Engine Code选项后带来的崩溃问题

IL2CPP根据C#生成的Cpp代码行数巨大,达到百万行级别,进而引起iOS平台可执行文件超过60MB的问题。因此在适当的时候有必要对UnityEngine下的代码进行Strip。但是这样做容易带来如下的问题: 
ReportException: UnityLogError Could not produce class with ID XXX. 
This could be caused by a class being stripped from the build even though it is needed. 
Try disabling 'Strip Engine Code' in Player Settings. 
其中XXX代表被Strip掉但是资源所需要的YAML ClassID.

之所以会出现这样的问题,目前的猜测是Unity进行Code Strip时,只分析一下几个方面所用到的类:

C#代码:Assembly-CSharp.dll、firstpass.dll、各插件Dll.
Resources资源:BuildSettings里面的场景引用的资源和Resources文件夹下面的资源
link.xml:Assets文件夹下面开发者可创建一个link.xml作为Code Strip白名单。另外观察Jenkins打包日志可以发现Unity安装目录下playbackEngines文件夹内含Unity自己的一套link.xml白名单
这样来看上述Crash发生的原因就比较明确了,那些打入AssetBundle的文件使用了Unity的其他类,但是同时在以上三个分析范围之外,Unity会将其Strip掉;当从AssetBundle进行加载时,由于缺少对应的类造成Deserialize失败,进而引起崩溃。

了解以上原因后,解决方案就呼之欲出了。只需要得到资源所用到的所有Unity引擎类&#

### HybridCLR (华佗) 热更新原理及使用教程 #### 一、HybridCLR 的基本概念 HybridCLR 是 Unity 游戏开发中的一个重要工具,用于实现 C# DLL 文件的热更新功能。它通过将 IL2CPP 编译后的中间语言字节码转换为可动态加载的形式来支持运行时替换逻辑代码的功能[^1]。 #### 二、工作原理 HybridCLR 实现热更新的核心在于其能够解析并执行由 Mono 或 IL2CPP 编译器生成的中间表示形式(IL 字节码)。以下是其实现的关键点: - **DLL 动态加载**:在游戏运行过程中,可以动态加载外部编写的 HotUpdate.dll 并将其注入到当前应用环境中。 - **反射调用**:通过反射机制找到目标类及其方法,并完成初始化和启动过程。 - **兼容性处理**:为了适配不同平台特性,在 macOS 下会生成特定格式文件 `StandaloneMacXxx` 而 Windows 上则是 `StandaloneWindows64`[^3]。 #### 三、具体实施步骤说明如下: ##### (1)环境搭建与依赖安装 确保使用的版本匹配官方推荐组合如 Unity2021.3.6.f1, hub3.0.1 和对应插件版本号 v2.1.0/v2021-2.1.0 [^2] 。同时需下载最新稳定版源码并将必要组件拷贝至项目指定位置比如把 hybridclr/huatuo 复制进 il2cpp_plus/libi2cpp 中去。 ##### (2)制作热更 Dll 按照需求编写业务逻辑存放在单独工程里构建得到标准 .NET Framework 库即成为我们的待部署资源之一——HotUpdate.dll。 ##### (3)配置 Player Settings 调整 Build Setting 内部参数使之满足条件允许自定义脚本解释引擎存在;另外还需要开启 Strip Engine Code选项以便减少最终产物体积大小影响性能表现等方面考虑。 ##### (4)集成 HybridCLR 插件 利用菜单栏命令路径 "HybridCLR/Generate/All" 来触发一系列自动化流程从而准备好所需的元数据资料以及优化过的机器指令集合等等重要组成部分。完成后记得手动迁移这些成果物至合适存储区域 Assets/StreamingAssets/ 下面命名为 HotUpdate.dll.bytes 形式保存下来供后续读取加载之用。 ##### (5)实际运用场景模拟测试 当一切准备就绪之后就可以尝试进入正式环节了—让应用程序能够在不重启的情况下即时生效新的改动内容。主要依靠于预先设定好的接口函数作为切入点并通过 Reflection API 定位相应实例对象进而激活整个链条反应直至达成预期效果为止。 ```csharp // 示例代码展示如何通过反射方式获取类型并创建实例 Assembly assembly = Assembly.LoadFrom("path/to/your/HybridCLR_Assembly"); Type typeToInstantiate = assembly.GetType("Namespace.ClassName"); object instance = Activator.CreateInstance(typeToInstantiate); MethodInfo methodInfo = typeToInstantiate.GetMethod("MethodName"); methodInfo.Invoke(instance, null); // 如果有参数则传入相应的 arguments 数组即可 ``` 以上就是关于 HybridCLR 华佗热更新技术的一个较为全面介绍包括背后运作机理概述加上详尽的操作指南希望能够帮助开发者们更好地理解和掌握这项技能! ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值