目录
正文
上图是AB包清单
PatchElement类是每一行数据,第一篇文章有讲
private void GetDownloadList(PatchManifest target)
{
_patcher.DownloadList.Clear();
// 临时下载列表
List<PatchElement> downloadList = new List<PatchElement>(1000);
string style = PatchHelper.GetPackStyle();
MotionLog.Log(ELogLevel.Log, $"style is {style}");
// 准备下载列表
foreach (var pair in target.Elements)
{
PatchElement webElement = pair.Value;
PatchElement localElement;
if (_patcher.SandboxPatchManifest.Elements.TryGetValue(webElement.Name, out localElement))
{
//SandboxPatchManifest版本中 有该资源(即之前的版本更新时下载过该文件)
}
else if (_patcher.AppPatchManifest.Elements.TryGetValue(webElement.Name, out localElement))
{
//AppPatchManifest版本中 有该资源(即之前的版本更新中没有下载过该文件,但在apk/iap包中有该资源)
}
if (localElement == null
|| (style == PATCH_STYLE.INGAME && !_patcher.DownloadInGame && localElement.Tag == PATCH_STYLE.INGAME)
|| (localElement.MD5 != webElement.MD5 && (style == PATCH_STYLE.NORMAL || localElement.Tag == PATCH_STYLE.BUILDIN)))
{
//判断下载中断和意外退出造成的更新文件损坏等情况放到下一个流程,避免这里检查每个文件造成app假死
downloadList.Add(webElement);
}
}
// 如果下载列表为空
if(downloadList.Count == 0)
{
_patcher.Switch(EPatchStates.DownloadWebPatchManifest.ToString());
}
else
{
// 最后添加到正式下载列表里
_patcher.DownloadList.AddRange(downloadList);
downloadList.Clear();
// 发现新更新文件后,挂起流程系统
int totalDownloadCount = _patcher.DownloadList.Count;
long totalDownloadSizeKB = 0;
foreach (var element in _patcher.DownloadList)
{
totalDownloadSizeKB += element.SizeKB;
}
PatchEventDispatcher.SendFoundUpdateFilesMsg(totalDownloadCount, totalDownloadSizeKB);
}
}
重点看foreach循环遍历每一行数据
该AB包数据是否加入列表要经过下面几个筛选
判断persistentDataPath沙盒目录是否存在该AB包,如果存在证明之前下载过,无需加入下载列表。
判断StreamingAsset目录中是否存在该AB包,如果存在证明打包时该AB包已经在包体里,无需加入下载列表。
如果该AB包的下载类型是游戏内下载,或者叫边玩边下,那么不需要在游戏启动热更时下载,无需加入下载列表
经过上面3个筛选,最终生成了下载列表,下载列表生成后,通常来说需要在UI上显示,告知用户需要下载的文件数量和大小,如果你的项目需要用户点击确认下载,则通过方法或者事件系统告知UI下载数量和下载大小。