private ResVersion CommParse(string data) { ResVersion tempVersion = new ResVersion(); string versionInfo = data; string[] line = versionInfo.Split('\n'); for (int i = 0; i < line.Length - 1; i++) { if (i == 0) {//第一行特别处理一下 string[] date = line[0].Split('|'); tempVersion.versionNumber = date[1]; } else { string[] linedata = line[i].Split('|'); if (linedata.Length == 3) { DownloadTask task = new DownloadTask(); task.FileName = linedata[0]; task.MD5 = linedata[1]; task.Size = int.Parse(linedata[2]); tempVersion.tasks.Add(task); } else { Debug.Log("linedata.Length != 3"); } } } return(tempVersion); }
private void ParseLocalVersionData(string localData) { this.m_localVersion = this.CommParse(localData); //解析完本地的,要去下载web服务器的来解析了哦 this.LoadRemoteVersionData(); }
protected override void OnWWW(Loc loc, WWW www, string fileName) { UpdateVersion tempVersion = new UpdateVersion(); if (www.error != null) { Updater.Reporter.OnError(UpdateErrorType.ReadVersionErr, www.error, loc); } else { try { tempVersion = GetUpdateVersion(www.text); } catch (Exception ex) { Updater.Reporter.OnError(UpdateErrorType.ReadVersionErr, ex.Message, loc); } } //App版本 if (fileName.Contains(ResUpdaterPath.ResVersionInfoName)) { ResVersion.SetVersion(loc, tempVersion); } else { AppVersion.SetVersion(loc, tempVersion); } Check(); }
protected override void OnDownloadError(string error) { Updater.Reporter.OnError(UpdateErrorType.DownloadVersionErr, error); ResVersion.SetVersion(Loc.Latest, new UpdateVersion()); AppVersion.SetVersion(Loc.Latest, new UpdateVersion()); Check(); }
private void ParseRemoteVersionData(string remoteData) { remoteData = remoteData.Trim(); this.m_remoteVersionData = remoteData; this.m_remoteVersion = this.CommParse(remoteData); //都解析完了的话,开始进行差异对比 this.VersionDataDifference(); }
private void CopyABToLocal() { if (build_SelectIndex == 1) { return; } ResVersion resVersion = new ResVersion { Res = new Dictionary <string, List <ResVersion.ResVersionInfo> >() }; if (!resVersion.Res.ContainsKey(Define.ABsMainGroup)) { resVersion.Res.Add(Define.ABsMainGroup, new List <ResVersion.ResVersionInfo>()); } FileInfo fileInfo1 = new FileInfo(Path.Combine(build.OutPath, Define.ABsPathParent)); resVersion.Res[Define.ABsMainGroup].Add(new ResVersion.ResVersionInfo() { File = Define.ABsPathParent, Size = fileInfo1.Length, MD5 = MD5Helper.FileMD5(fileInfo1.FullName) }); List <string> files = new List <string> { Define.ABsPathParent }; for (int i = 0; i < abs.Count; i++) { if (abs[i].CopyToLocal || build_SelectIndex == 2) { files.Add(abs[i].Name); if (!resVersion.Res.ContainsKey(abs[i].Group)) { resVersion.Res.Add(abs[i].Group, new List <ResVersion.ResVersionInfo>()); } FileInfo fileInfo = new FileInfo(Path.Combine(build.OutPath, abs[i].Name)); resVersion.Res[abs[i].Group].Add(new ResVersion.ResVersionInfo() { File = abs[i].Name, Size = fileInfo.Length, MD5 = MD5Helper.FileMD5(fileInfo.FullName) }); } } CopyTo(build.OutPath, build.CopyToLocalPath, files); GenerateVersion(resVersion, Path.Combine(build.CopyToLocalPath, "ResVersion.json")); }
public ResVersion VersionCheck(ReqVersion ReqVersion) { ResVersion rv = new ResVersion(); if (ReqVersion.versionCode == ConstantClass.version) { rv.isAllowed = true; } else { rv.isAllowed = false; } return(rv); }
//所有的下载任务都完成了 private void AllDownloadTaskFinished(bool updateVersionTxt) { LogHelper.Log("All Task Finish"); if (updateVersionTxt) { //替换本地的Version.txt为web服务器上的,保持版本最新 Util.CreateFile(this.localPath, versionTxtName, this.remoteVersionData); LogHelper.Log(versionTxtName + "已更新"); } this.LocalVersion = null; this.RemoteVersion = null; this.remoteVersionData = null; //释放downloadmgr DownloadManager.GetInstance().Dispose(); this.isAllFinish = true; }
/// <summary> /// 所有版本号版本读取完毕检查 /// </summary> private void Check() { if (AppVersion.IsLoadFinish() && ResVersion.IsLoadFinish()) { Debug.LogFormat("AppVersion:Steam:{0} ==== Persistent:{1} ==== Server:{2}", AppVersion.StreamVersion.FinalVersion, AppVersion.PersistentVersion.FinalVersion, AppVersion.LatestVersion.FinalVersion); Debug.LogFormat("ResVersion:Steam:{0} ==== Persistent:{1} ==== Server:{2}", ResVersion.StreamVersion.FinalVersion, ResVersion.PersistentVersion.FinalVersion, ResVersion.LatestVersion.FinalVersion); bool isNeedUpdate = false; if (Updater.UpdateType == UpdateType.App) { if (AppVersion.IsNeedUpdate() || ResVersion.IsNeedUpdate()) { isNeedUpdate = true; } } if (Updater.UpdateType == UpdateType.Res) { isNeedUpdate = ResVersion.IsNeedUpdate(); } //需要更新进行md5检查 if (isNeedUpdate) { Updater.Reporter.CheckVersionDone(UpdateState.CheckMd5, AppVersion.LocalVersion, AppVersion.LatestVersion); Updater.CheckMd5.Start(); } else { Updater.Reporter.CheckVersionDone(UpdateState.Succeed, AppVersion.LocalVersion, AppVersion.LatestVersion); } } }
//所有的下载任务都完成了 private void AllDownloadTaskFinished(bool updateVersionTxt) { Debug.Log("All Task Finish"); if (updateVersionTxt) { //替换本地的Version.txt为web服务器上的,保持版本最新 MyTools.CreateFile(this.m_localPath, m_versionTxtName, this.m_remoteVersionData); Debug.Log(m_versionTxtName + "已更新"); } this.m_localVersion = null; this.m_remoteVersion = null; this.m_remoteVersionData = null; //释放downloadmgr DownloadMgr.Inst.Destroy(); if (m_versionMgrCallback != null) { this.m_versionMgrCallback(); } }
private void GenerateVersion(ResVersion resVersion, string path) { IOHelper.StreamWriter(LitJson.JsonMapper.ToJson(resVersion), path); Debug.Log($"生成{path}完成!"); }
public static IEnumerator Start() { float startTime = Time.realtimeSinceStartup; #if (UNITY_EDITOR && !USE_CDN) || DISABLE_CDN yield break; #endif //初始化AAS yield return(Addressables.InitializeAsync()); LogTimeDurFormat("Addressables.InitializeAsync", ref startTime, true); //修改provider fixed AAS bug foreach (var provider in Addressables.ResourceManager.ResourceProviders) { if (typeof(TextDataProvider).IsAssignableFrom(provider.GetType())) { (provider as TextDataProvider).IgnoreFailures = false; } } LogTimeDurFormat("foreach Addressables.ResourceManager.ResourceProviders ", ref startTime, true); //拉取本地资源版本号 var localVersion = Application.version; if (File.Exists(localVersionPath)) { var localVersionHandle = LoadText(localVersionPath, "LocalVersion");; yield return(localVersionHandle); localVersion = localVersionHandle.Result; Addressables.Release(localVersionHandle); } var localResVersion = ResVersion.parseVersion(localVersion); var libResVersion = ResVersion.parseVersion(Application.version); LogFormat("local version:{0},library version:{1}", localVersion, Application.version); if (null == localResVersion || null == libResVersion) { yield break; } //包内版本大于本地持续化版本号(安装了新包) 清除本地缓存数据 if (libResVersion.high > localResVersion.high || libResVersion.mid > localResVersion.mid) { LogFormat("清除本地缓存"); Caching.ClearCache(); File.Delete(localCatalogPath); File.Delete(localVersionPath); File.Delete(PersistCDNConfigPath); if (Directory.Exists(LocalHotAssetBundlePath)) { Directory.Delete(LocalHotAssetBundlePath, true); } //yield break; } LogTimeDurFormat("load localVersion", ref startTime, true); //读取CDN 地址配置 yield return(LoadCDNConfig()); LogTimeDurFormat("load cdn config", ref startTime, true); //拉取CDN资源版本号 var remoteVersionHandle = LoadText(remoteVersionUrl, "RemoteVersion"); yield return(remoteVersionHandle); var remoteVersion = remoteVersionHandle.Result; Addressables.Release(remoteVersionHandle); LogTimeDurFormat("load remoteVersion", ref startTime, true); if (null == remoteVersion) { LogErrorFormat("远程资源版本号加载失败"); yield break; } LogFormat("remoteVersion:{0}", remoteVersion); var remoteResVersion = ResVersion.parseVersion(remoteVersion); if (null == remoteResVersion) { yield break; } if (remoteResVersion.high < localResVersion.high || (remoteResVersion.high == localResVersion.high && remoteResVersion.mid < localResVersion.mid)) { LogFormat("服务器资源版本过低"); yield break; } if (remoteResVersion.high > localResVersion.high || remoteResVersion.mid > localResVersion.mid) { LogFormat("需要更新整包"); yield break; } else if (remoteResVersion.small > localResVersion.small) { LogFormat("need hot update"); //拉取CDN catalog 信息 LogFormat("remoteCatalogUrl:" + remoteCatalogUrl); var remoteCatalogHandle = LoadText(remoteCatalogUrl, "RemoteCatalog"); yield return(remoteCatalogHandle); var remoteCatalog = remoteCatalogHandle.Result; Addressables.Release(remoteCatalogHandle); if (null == remoteCatalog) { LogErrorFormat("远程资源加载失败"); yield break; } //将最近的catalog缓存到本地持续化目录 File.WriteAllText(localCatalogPath, remoteCatalog); File.WriteAllText(localVersionPath, remoteVersion); LogTimeDurFormat("load remote catalog", ref startTime, true); } LogFormat("localCatalogPath:" + localCatalogPath); //本地持续化目录没有缓存catalog if (!File.Exists(localCatalogPath)) { yield break; } //对比catalog 解析出需要热更的bundle LogFormat("localCatalogPath:" + localCatalogPath); var localCatalogLocation = new ResourceLocationBase("LocalCatalog", localCatalogPath, typeof(JsonAssetProvider).FullName, typeof(ContentCatalogData)); var localCatalogHandle = Addressables.LoadAssetAsync <ContentCatalogData>(localCatalogLocation); yield return(localCatalogHandle); var data = localCatalogHandle.Result; Addressables.Release(localCatalogHandle); LogTimeDurFormat("load local catalog", ref startTime, true); ResourceLocationMap RemoteMap = data.CreateLocator(null); var newBundles = parseBundleList(RemoteMap, "remote"); LogTimeDurFormat("foreach remote catalog", ref startTime, true); dirtyBundle = null; // Addressables.CheckForCatalogUpdates(false); foreach (ResourceLocationMap item in Addressables.ResourceLocators) { if ("AddressablesMainContentCatalog" == item.LocatorId) { var oldBundles = parseBundleList(item, "local"); LogTimeDurFormat("load local catalog", ref startTime, true); dirtyBundle = compareResLocation(newBundles, oldBundles); Addressables.RemoveResourceLocator(item); Addressables.AddResourceLocator(RemoteMap); LogTimeDurFormat("compare catalog", ref startTime, true); break; } } if (null == dirtyBundle || 0 == dirtyBundle.Count) { yield break; } //该方法计算下载大小只对远程bundle有用 //long size = 0; //foreach (var key in dirtyBundle) //{ // IResourceLocation location; // newBundles.TryGetValue(key, out location); // var sizeData = location.Data as ILocationSizeData; // if (sizeData != null) // size += sizeData.ComputeSize(location, Addressables.ResourceManager); //} // LogFormat("需要下载的补丁大小:{0}", size); yield return(DownLoadRemoteAssetBundles(dirtyBundle)); LogTimeDurFormat("dowmload hot file", ref startTime, true); Addressables.InternalIdTransformFunc = convertBundleInternalId; LogFormat("下载完,预加载到内存"); AsyncOperationHandle handler = Addressables.DownloadDependenciesAsync(dirtyBundle, Addressables.MergeMode.Union); while (!handler.IsDone) { yield return(null); } Addressables.Release(handler); LogTimeDurFormat("download dependency", ref startTime, true); yield return(null); }
//------------------------------------------------------------------------------------------ /// <summary> /// 检测资源 /// </summary> //public void CheckResource() //{ // string path = mLocalDataFolder + "/filelist.config"; // if (!File.Exists(path)) // { // ///本地目录没有filelist,从服务器下载 // BehaviourUtil.StartCoroutine(LoadFileListFromServer()); // } // else // { // FileStream stream = new FileStream(path, FileMode.Open); // StreamReader reader = new StreamReader(stream); // try // { // mLocalDataListInfo = JsonMapper.ToObject<Filelist>(reader.ReadToEnd()); // } // catch (Exception exception) // { // string str2 = reader.ReadToEnd(); // if (str2 == null) // { // GameDebug.Log("reader.ReadToEnd() = null"); // } // else // { // GameDebug.Log("reader.ReadToEnd().Len = " + str2.Length); // } // GameDebug.Log(reader.ReadToEnd()); // GameDebug.Log(exception.ToString()); // reader.Close(); // stream.Close(); // BehaviourUtil.StartCoroutine(LoadFileListFromServer()); // return; // } // reader.Close(); // stream.Close(); // if (!UpdateTool.CheckAllRes(mLocalDataListInfo)) // { // BehaviourUtil.StartCoroutine(LoadFileListFromServer()); // } // else // { // UpdateComplete(false); // } // } //} /// <summary> /// 从服务器下载文件列表 /// </summary> /// <returns></returns> private IEnumerator LoadFileListFromServer() { #region 更新miniClient #if !UNITY_EDITOR && UNITY_ANDROID && False //鉴于应用宝平台有增量更新设置,此功能暂时屏蔽 string appversion = GameConfig.ServerAppURL + GameConfig.AppVersionPath; WWW appvWWW = new WWW(appversion); yield return(appvWWW); if (string.IsNullOrEmpty(appvWWW.error)) { int serverversion = AppVersion.VersionID; bool versionok = true; serverversion = Convert.ToInt32(appvWWW.text); AppVersion.ServerAppVersion = serverversion; if (versionok) { if (serverversion != AppVersion.VersionID) { //更新客户端 string appURL = GameConfig.ServerAppURL + GameConfig.AppPath; UpdateTool.Instance.UpdateClient(appURL); yield break; } } } #endif #endregion WWW filelistWWW = null; //获取服务器上当前的版本信息 string sVPath = GameConfig.AssetServerURL + GameConfig.AssetVersion; filelistWWW = new WWW(sVPath); yield return(filelistWWW); if (!string.IsNullOrEmpty(filelistWWW.error)) { UpdateFailed(); yield break; } AppVersion.assetVersion = JsonMapper.ToObject <AssetVersion>(filelistWWW.text); if (AppVersion.assetVersion == null || string.IsNullOrEmpty(AppVersion.assetVersion.version)) { AppVersion.assetVersion.version = AppSystemInfo.appInfo.versionName; } string versiondata = GameConfig.GetRealSrvDataPath(AppVersion.assetVersion.version) + GameConfig.DataversionPath; filelistWWW = new WWW(versiondata); yield return(filelistWWW); if (!string.IsNullOrEmpty(filelistWWW.error)) { UpdateFailed(); yield break; } //加载本地的config mServerRes = JsonMapper.ToObject <ResVersion>(filelistWWW.text); AssetParam param = new AssetParam(); yield return(AssetManager.instance.LoadResource("dataversion.config", param)); if (param.asset == null || param.asset.Data == null) { UpdateFailed(); yield break; } string text = param.asset.Data.text; ResVersion localresv = JsonMapper.ToObject <ResVersion>(text); if (localresv == null || mServerRes == null) { UpdateComplete(false); NotifyProcess(1, "资源更新失败..."); yield break; } //测试:走下面的流程 if (mServerRes.md5 == localresv.md5) { UpdateComplete(false); yield break; } NotifyProcess(0, "检查资源更新..."); //服务器上的filelist string filelistpath = string.Format("{0}filelist.config", GameConfig.GetRealSrvDataPath(AppVersion.assetVersion.version)); filelistWWW = new WWW(filelistpath); yield return(filelistWWW); if (!string.IsNullOrEmpty(filelistWWW.error)) { //TODO:处理加载失败 UpdateFailed(); yield break; } string configdata = filelistWWW.text; if (string.IsNullOrEmpty(configdata)) { //有错误 UpdateFailed(string.Empty); yield break; } mServerFileListInfo = JsonMapper.ToObject <Filelist>(configdata); filelistWWW.Dispose(); if (mServerFileListInfo != null) { ParseDownLoadAndUpdateData(); } else { UpdateFailed(string.Empty); } }