Unity Android 热更新包管理:AssetBundle 缓存一致性避坑
## Unity Android 热更新:AssetBundle 缓存一致性问题
Unity Android 热更新:AssetBundle 缓存一致性的问题,常见表象不是崩溃,而是更新后资源仍是旧的、部分机型正常部分机型花屏,或者补丁下完了但角色资源没刷新。很多团队第一反应是 CDN 缓存,实际上更常见的是本地版本索引、依赖资源和清缓存顺序没对齐。
## 方案
先统一远端 manifest 与本地缓存索引;再把资源依赖和版本号绑定;最后补一层失败回滚与缓存清理策略。这个顺序可以先止住最致命的新旧资源混读。进一步落地时,要把主 bundle、依赖 bundle 和本地索引一起视作一个版本整体,而不是分散处理。只要其中一层没跟上,客户端就很容易读到半新半旧的资源。
如果团队已经有热更新后台,建议顺手补一层最近一次成功版本、最近一次失败版本和回滚目标版本的记录。这样线上一旦出现更新后资源错乱,不需要先删全缓存再碰运气,而是可以直接落回上一版稳定资源,缩短事故时间。
## 示例代码
1. 版本校验
public bool NeedUpdate(string localHash, string remoteHash)
{
return !string.Equals(localHash, remoteHash, StringComparison.OrdinalIgnoreCase);
}
2. 排查命令
adb shell run-as com.example.game ls files/bundles
adb logcat -d | grep -i AssetBundle
3. 清理策略
public void ClearBundleCache(string bundleName)
{
Caching.ClearAllCachedVersions(bundleName);
}
## 注意点
先盯三类:一是远端 manifest 更新了但本地索引没落盘;二是依赖 bundle 版本变了主 bundle 没同步;三是失败回滚只回滚主资源没回滚依赖资源。热更新最怕的不是没更新,而是更新成半套。
## 报错与排查
1. 资源没刷新
先核对 manifest hash、bundle 名和本地缓存版本。别直接删全缓存,先证明到底是拉取错、依赖错还是读取错。
adb logcat -d | grep -i cache
2. 更新后花屏或缺图
先看依赖 bundle 有没有一起升级,再看资源格式和目标机型 GPU 支持,不要把所有锅都甩给美术资源。
public bool IsBundleReady(Dictionary versions, string bundle, string expectedHash)
{
return versions.TryGetValue(bundle, out var hash) && hash == expectedHash;
}
## 可运行片段
1. 状态对象
public record BundleState(string Name, string Hash, bool Ready);
2. 演示入口
public void PrintBundleState()
{
Debug.Log(new BundleState("characters", "abc123", true));
}
3. 验证命令
adb shell run-as com.example.game ls files/bundles
adb logcat -d | grep -i AssetBundle
## 结论
Unity Android 热更新:AssetBundle 缓存一致性这类问题,真正要收紧的是版本索引、依赖关系和回滚顺序。只要这三层对齐,热更新里的绝大多数鬼问题都会直接少一半。
