代码热更新
leanclr-unity 提供 热更新程序集(hot update assembly) 工作流:在 Player 构建前将指定程序集从构建列表中过滤掉,使其完全不参与 LeanAOT 与主包编译,运行时通过 Assembly.Load 加载新版本 DLL。
LeanCLR 的主要目标仍是发布期替换 IL2CPP、缩小包体与降低内存,热更能力轻量于 HybridCLR 的差分混合执行等完整方案;下载、版本校验与资源管线仍需自行实现。
热更新程序集 ≠ 延迟加载程序集。二者不要混用同一程序集,也不要把热更程序集配进 lazyLoadedAssemblyNames。对比见 概念辨析 与下表。
与延迟加载的对比
| 热更新程序集 | 延迟加载程序集 | |
|---|---|---|
| 配置 | hotUpdateSettings.hotUpdateAssemblyNames | leanAOTSettings.lazyLoadedAssemblyNames |
| 构建参与 | 构建前过滤,不参与 LeanAOT / 主包编译 | 完整参与构建与 LeanAOT |
| AOT | 不可能(未进入构建,无 AOT 代码) | 可以(由 aot.xml / PGO 决定) |
| 运行时 DLL | 可加载新版本(热更下发) | 必须与构建期 ManagedStripped 字节完全一致,不得改动 |
| 典型用途 | 逻辑热更新 | 同版本按需加载、减小 metadata |
相同点
- 构建时都不会写入
global-metadata.dat - 运行时均可通过
Assembly.Load加载 - 程序集中的
MonoBehaviour、ScriptableObject等可挂到 Prefab / Scene,打入 AssetBundle 后,在加载 AssetBundle 并实例化时可正确还原(须先Assembly.Load对应程序集)
项目设置
配置位于 LeanCLR Settings → Hot Update(hotUpdateSettings,类 HotUpdateSettings):
| 字段 | 说明 |
|---|---|
hotUpdateAssemblyNames | 热更新程序集短名列表(无 .dll 后缀) |
示例:
HotUpdate
HotUpdateLogic
保存 ProjectSettings/LeanCLR.asset 后重新发布 Player。
构建时 FilterHotUpdateAssembly(IFilterBuildAssemblies)会在管线早期将上述程序集从待构建列表中移除,因此:
- 不会进入 LeanAOT,无需在
aot.xml中写aot="0"; - 不会产生包内 AOT 原生代码,热更后不存在 IL 与 AOT 不匹配问题;
- 与
lazyLoadedAssemblyNames互斥:同一程序集不能出现在两个列表中,否则构建报错。
编译热更新 DLL
热更程序集不参与 Player 构建,需单独编译 DLL 再下发。在 Unity 菜单选择:
LeanCLR → CompileDllActiveTarget
该命令对当前 Active Build Target 调用 PlayerBuildInterface.CompilePlayerScripts,将编译结果输出到:
Library/LeanCLR/CompileDlls/{buildTarget}/
- Development 开关跟随 Editor → Development Build(
EditorUserBuildSettings.development) - 输出包含
hotUpdateAssemblyNames中的程序集(以及工程内其它玩家脚本程序集) - 从该目录取出热更程序集 DLL,按你们的 CDN / 分包流程分发;运行时
Assembly.Load加载
完整说明与和 ManagedStripped 的区别见 Unity 构建 — 编译托管 DLL。
发布 WebGL 热更包前,请将 Build Settings 中的 Active Target 切到 WebGL,再执行 CompileDllActiveTarget,确保编译选项与目标平台一致。
推荐配置清单
- 热更程序集仅列在
hotUpdateAssemblyNames,未列入lazyLoadedAssemblyNames - 主包代码在热更 DLL 加载前不直接引用热更程序集类型(避免链接期强依赖)
- 已实现下载、
Assembly.Load、失败重试与版本校验 - 热更 DLL 使用 CompileDllActiveTarget 编译(
Library/LeanCLR/CompileDlls/{target}/),且与主包 Unity 版本、目标平台一致 - WebGL / 小游戏已评估异步加载与内存(当前 LeanCLR 单线程)