浅谈 热更(二)

1.小版本更新 首先获取 设备内存容量;

2.设置服务器获取验证证书回掉。

ServicePointManager.ServerCertificateValidationCallback = MyRemoteCertificateValidationCallback;

3.加载读取本地资源更新目录下版本文件,获取版本号,服务器资源地址,生成Md5 码;如果该目录下没有版本文件,则说明是第一次安装 没有更新过。此时需要读取本地配置的版本文件和MD5文件

4.删除包名下的dll 文件

5.如果不是第一次安装更新 则删除更新资源目录,如果是第一次安装更新 则创建 资源更新木录和标记文件(第一次更新);这里判断是不是第一次安装更新 可以通过标志文件和是否存在资源目录下有版本文件来判断。

6.通过版本文件中 服务器地址链接 MD5 文件并写入临时目录

/// <summary>
/// 加载版本文件
/// </summary>
/// <returns></returns>
[NoToLuaAttribute]
public void loadVer()
{
//EditorTool.ClearLog();
try
{
ServicePointManager.ServerCertificateValidationCallback = MyRemoteCertificateValidationCallback;
}
catch (Exception e)
{

GaeaLogger.error(e);
}


bool isfirstInstall = false;
_updatingState = "DownloadingVersion";
// 获取更新资源目录下的版本文件
FileInfo fileInfo = new FileInfo(PathTools.ExportAssetsRoot + "/version");
if (fileInfo.Exists)
{
// 解析成字符串
_currentVerMap = LitJson.JsonMapper.ToObject<Dictionary<string, string>>(Encoding.UTF8.GetString(File.ReadAllBytes(fileInfo.FullName)));
//读取文件并生成MD5码
_currentVerMD5 = MD5Creater.Md5Hash(File.OpenRead(fileInfo.FullName));
}
else
{
// 首次安装 后第一次更新
if (Directory.Exists(PathTools.ExportAssetsRoot) && !Directory.Exists(PathTools.ExportAssetsTemp))
{
//删除更新资源目录
Directory.Delete(PathTools.ExportAssetsRoot, true);
}
//从本地读取配置的版本文件和MD5 文件
_currentVerMap = LitJson.JsonMapper.ToObject<Dictionary<string, string>>((Resources.Load("Config/version") as TextAsset).text);
_currentVerMD5 = (Resources.Load("Config/versionMD5") as TextAsset).text;
isfirstInstall = true;
}
PlatformManager.SetFileNotBackUp(PathTools.ExportAssetsRoot);
string internalVersion = LitJson.JsonMapper.ToObject<Dictionary<string, string>>((Resources.Load("Config/version") as TextAsset).text)[VersionNumStr];
if (AssetsVersion.create(_currentVerMap[VersionNumStr]).getNum() <= AssetsVersion.create(internalVersion).getNum())
{
try
{
string tempDllPath = "/data/data/" + Application.bundleIdentifier + "/files/temp.dll";
string dllPath = "/data/data/" + Application.bundleIdentifier + "/files/Assembly-CSharp.dll";
if (File.Exists(tempDllPath))
{
File.Delete(tempDllPath);
}
if (File.Exists(dllPath))
{
File.Delete(dllPath);
}

//如果不是第一次安装 更新前删除更新资源目录
if (Directory.Exists(PathTools.ExportAssetsRoot) && !File.Exists(PathTools.ExportAssetsRoot + "/firstInstall.txt"))
{
Directory.Delete(PathTools.ExportAssetsRoot, true);
}
if (isfirstInstall)
{
// 如果是第一次安装 则创建一个firstinstall文件 来标记 是否是第一次安装
if (!File.Exists(PathTools.ExportAssetsRoot + "/firstInstall.txt"))
{
Directory.CreateDirectory(PathTools.ExportAssetsRoot);
FileStream fs = File.Create(PathTools.ExportAssetsRoot + "/firstInstall.txt");
fs.Close();
}
}

_currentVerMap = LitJson.JsonMapper.ToObject<Dictionary<string, string>>((Resources.Load("Config/version") as TextAsset).text);
_currentVerMD5 = (Resources.Load("Config/versionMD5") as TextAsset).text;

}
catch (Exception e)
{
GaeaLogger.info(e);
}

}

_currentVerNum = AssetsVersion.create(_currentVerMap[VersionNumStr]).getNum();
GaeaLogger.info("currentVerMD5: " + _currentVerMD5);
GaeaLogger.info("current version:" + AssetsVersion.create(_currentVerNum));
string tempVersionMD5Path = PathTools.ExportAssetsTemp + "/versionMD5";
//fileDelete(tempVersionMD5Path);
FileDownloader fd = new FileDownloader();
GaeaLogger.info("start load:" + _currentVerMap[VersionSourceStr] + "MD5");
// 通过服务器地址 获取MD5码 并写入临时目录下的MD5文件中
fd.download(tempVersionMD5Path, _currentVerMap[VersionSourceStr] + "MD5", downloadVerMD5Handler, null, true);
PlatformManager.SetFileNotBackUp(PathTools.ExportAssetsRoot);
}

7.比较当前版本MD5和线上MD5是否相同,如果相同 则不会更新,如果不同则需要下载服务器上的版本文件,服务器地址从当前版本文件中获取。下载完成后并写入临时目录文件下

string tempVersionPath = PathTools.ExportAssetsTemp + "/version";
//fileDelete(tempVersionPath);
FileDownloader fd = new FileDownloader();
GaeaLogger.info("start load:" + _currentVerMap[VersionSourceStr]);
fd.download(tempVersionPath, _currentVerMap[VersionSourceStr], downloadVerHandler, null, true);

8.获取到线上版本文件后,对比本地版本文件和线上版本文件中的 版本配置文件 链接地址是否一致;如果不一致说明下载路径更换了;

9.如果路径没变,则通过获取并下载版本配置文件 并写入临时目录

/// <summary>
/// Online的版本文件下载到本地temp的目录
/// </summary>
/// <param name="success"></param>
/// <returns></returns>
private void downloadVerHandler(bool success)
{
if (success)
{
_onlineVerMap = LitJson.JsonMapper.ToObject<Dictionary<string, string>>(Encoding.UTF8.GetString(File.ReadAllBytes(PathTools.ExportAssetsTemp + "/version")));

GaeaLogger.error(_currentVerMap[VersionSourceStr]);
GaeaLogger.error(_onlineVerMap[VersionSourceStr]);
// 线上的版本文件中服务器资源地址与本地版本文件中服务器资源地址不一样
if (_currentVerMap[VersionSourceStr] != _onlineVerMap[VersionSourceStr])
{

_currentVerUrlNativeToOther = true;
}

_onLineNum = AssetsVersion.create(_onlineVerMap[VersionNumStr]).getNum();
GaeaLogger.info("online version:" + AssetsVersion.create(_onLineNum));
if (_onLineNum > _currentVerNum)
{
FileDownloader fd = new FileDownloader();
//fileDelete(PathTools.ExportAssetsTemp + "/versionPgcfg");
if (_currentVerUrlNativeToOther)
{
GaeaLogger.info("start load:" + _currentVerMap[VersionSourceStr] + "Pgcfg");
fd.download(PathTools.ExportAssetsTemp + "/versionPgcfg", _currentVerMap[VersionSourceStr] + "Pgcfg", downloadPgcfgHandler, null, true);
}
else
{
GaeaLogger.info("start load:" + _onlineVerMap[VersionSourceStr] + "Pgcfg");
fd.download(PathTools.ExportAssetsTemp + "/versionPgcfg", _onlineVerMap[VersionSourceStr] + "Pgcfg", downloadPgcfgHandler, null, true);
}

}
else
{
GaeaLogger.warning("OnLineNum <= CurrentVerNum!!!");
if (!testDllUpdated(true))
{
call_stateChangeHandler(NoUpdate);
}
}

}
else
{
GaeaLogger.warning("version is not found!!!");
if (!testDllUpdated(true))
{
call_stateChangeHandler(NoUpdate);
}
}
}

10.计算版本跨度,返回需要下载的版本列表

/// <summary>
/// 下载包的MD5,包体大小等信息的配置文件的回调
/// </summary>
/// <param name="success"></param>
/// <returns></returns>
private void downloadPgcfgHandler(bool success)
{
if (success)
{
// 获取版本包体配置文件
_versionConfigMap = LitJson.JsonMapper.ToObject<Dictionary<string, Dictionary<string, string>>>(Encoding.UTF8.GetString(File.ReadAllBytes(PathTools.ExportAssetsTemp + "/versionPgcfg")));
GaeaLogger.info("versionPgcfg is loaded !");
_versionsArray = getVersionsArray((int)_currentVerNum, (int)_onLineNum);

call_stateChangeHandler(GetVersionSuccess);
}
else
{
GaeaLogger.warning("versionPgcfg is not found!!!");
call_stateChangeHandler(GetUpdateFail);
}
}

11.开始启用多线程下载

public void startLoad()
{
if (canLoad)
{
thread = Loom.StartSingleThread(loadVersions);
}
canLoad = false;
}

12.下载版本差异包

包体是否正确下载 也需要MD5 对比

原文地址:https://www.cnblogs.com/DOGame/p/8686963.html