miduo_client/Assets/Scripts/Editor/GameEditor/FrameTool/HotFixWindow.cs

513 lines
19 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using System.IO;
using System.Linq;
using GameEditor.Core;
using GameEditor.GameEditor.PlayerBuilder;
using GameEditor.Util;
using GameLogic;
using System.Diagnostics;
using ResUpdate;
using System.Threading;
using System.Net;
using System;
namespace GameEditor.FrameTool
{
public static class HotFixTool
{
//重新下载外部.unity3d文件
public static void RegetExternalFile(string resUrl, string outPath, string fileName)
{
//获取下载文件链接
string url = resUrl + "/" + fileName;
string dlPath = outPath + "/" + fileName;
// 文件夹没有就创建
if (!Directory.Exists(outPath))
{
Directory.CreateDirectory(outPath);
}
//获取文件存放路径
if (File.Exists(dlPath))
{
File.Delete(dlPath);
}
// 设置参数
UnityEngine.Debug.Log(url);
HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
//发送请求并获取相应回应数据
HttpWebResponse response = request.GetResponse() as HttpWebResponse;
//直到request.GetResponse()程序才开始向目标网页发送Post请求
Stream responseStream = response.GetResponseStream();
//创建本地文件写入流
Stream stream = new FileStream(dlPath, FileMode.Create, FileAccess.Write);
byte[] bArr = new byte[1024];
int size = responseStream.Read(bArr, 0, (int)bArr.Length);
while (size > 0)
{
stream.Write(bArr, 0, size);
size = responseStream.Read(bArr, 0, (int)bArr.Length);
}
stream.Close();
responseStream.Close();
}
//遍历内部unity3d数据
public static List<ResourceFile> GetFilesList(string filesPath)
{
UnityEngine.AssetBundle bundle = UnityEngine.AssetBundle.LoadFromFile(filesPath + UpdateConfigs.FILES);
ResourceFiles files = bundle.LoadAsset<ResourceFiles>("game");
bundle.Unload(true);
return files.files;
}
// 获取差异文件list
public static List<ResourceFile> GetDiffList(List<ResourceFile> inDataList, List<ResourceFile> exDataList)
{
List<ResourceFile> diffList = new List<ResourceFile>();
Dictionary<string, ResourceFile> exDataDic = new Dictionary<string, ResourceFile>();
for (int i = 0; i < exDataList.Count; i++)
{
if (!exDataDic.ContainsKey(exDataList[i].fileName))
{
exDataDic.Add(exDataList[i].fileName, exDataList[i]);
}
else
{
exDataDic[exDataList[i].fileName] = exDataList[i];
}
}
for (int i = 0; i < inDataList.Count; i++)
{
if (!exDataDic.ContainsKey(inDataList[i].fileName))
{
diffList.Add(inDataList[i]);
}
else
{
if (!inDataList[i].crc.Equals(exDataDic[inDataList[i].fileName].crc))
{
diffList.Add(inDataList[i]);
}
}
}
return diffList;
}
// 计算大小
public static decimal GetDiffSize(List<ResourceFile> diffList)
{
decimal size = 0;
foreach (ResourceFile rf in diffList)
{
size += rf.size;
}
return size / 1048576;
}
}
class HotFixConfig
{
public string desc;
public string dir_name;
public bool isCalSize = false;
public bool isChoose = false;
public List<HotFixSetting> hotFixSettings;
public string project_files_path;
public string local_files_path;
public decimal project_local_size = 0;
public List<ResourceFile> project_local_list;
public HotFixConfig(string _dir_name)
{
desc = _dir_name;
dir_name = _dir_name;
hotFixSettings = new List<HotFixSetting>();
//
isCalSize = false;
}
// 添加配置文件夹
public void AddSetting(string _desc, string _dir_name, string _dir_cdn_setting)
{
hotFixSettings.Add(new HotFixSetting(_desc, _dir_name, _dir_cdn_setting));
}
// 计算本地到工程的大小
public void CalHotFixSize()
{
if (HotfixWindow._HotFixProjectPath.Equals(""))
{
UnityEngine.Debug.LogError("热更工程路径为空!");
return;
}
// 工程中的位置
project_files_path = Application.dataPath + "/../BuildABs/" + AppConst.PlatformPath + "/";
// GIT位置
local_files_path = HotfixWindow._HotFixProjectPath + "/Root/" + dir_name + "/" + AppConst.PlatformPath + "/";
// 计算差异文件
project_local_list = HotFixTool.GetDiffList(HotFixTool.GetFilesList(project_files_path), HotFixTool.GetFilesList(local_files_path));
// 计算大小
project_local_size = HotFixTool.GetDiffSize(project_local_list);
//
isCalSize = true;
}
}
class HotFixSetting
{
public string desc; // 设置描述
public string dir_name; // 热更分支文件夹
public string dir_cdn_setting; // cdn设置文件夹
public string path_cdn_setting;// cdn设置文件夹全路径
public bool isCalSize = false; // 判断是否计算过大小了
public bool isChoose = false; // 是否被选中
public decimal local_cdn_size = 0; // git与cdn比较 热更文件的文件大小
public decimal project_cdn_size = 0; // 工程与cdn比较 热更文件的文件大小
public List<ResourceFile> local_cdn_list; // git与cdn比较 热更文件列表
public List<ResourceFile> project_cdn_list; // 工程与cdn比较 热更文件列表
public VersionTxt local_version;
public VersionTxt cdn_version;
public HotFixSetting(string _desc, string _dir_name, string _dir_cdn_setting)
{
desc = _desc;
dir_name = _dir_name;
dir_cdn_setting = _dir_cdn_setting;
path_cdn_setting = HotfixWindow._HotFixProjectPath + "/Root/" + dir_name + "/" + dir_cdn_setting + "/";
isCalSize = false;
}
public void CalHotFixSize()
{
if (HotfixWindow._HotFixProjectPath.Equals(""))
{
UnityEngine.Debug.LogError("热更工程路径为空!");
return;
}
// cdn上files文件保存的位置
string cdn_files_path = path_cdn_setting + "__Download/";
// 工程中的位置
string project_files_path = Application.dataPath + "/../BuildABs/" + AppConst.PlatformPath + "/";
// GIT位置
string local_files_path = HotfixWindow._HotFixProjectPath + "/Root/" + dir_name + "/" + AppConst.PlatformPath + "/";
// 读取version文件
string json = File.ReadAllText(path_cdn_setting + AppConst.GameVersionFile);
local_version = JsonUtility.FromJson<VersionTxt>(json);
// 下载cdn上的files文件
HotFixTool.RegetExternalFile(local_version.resUrl + AppConst.PlatformPath, cdn_files_path, "files.unity3d");
// 读取version文件
HotFixTool.RegetExternalFile(local_version.resUrl + AppConst.PlatformPath, cdn_files_path, AppConst.GameVersionFile);
cdn_version = JsonUtility.FromJson<VersionTxt>(File.ReadAllText(cdn_files_path + AppConst.GameVersionFile));
// 计算差异文件
local_cdn_list = HotFixTool.GetDiffList(HotFixTool.GetFilesList(local_files_path), HotFixTool.GetFilesList(cdn_files_path));
project_cdn_list = HotFixTool.GetDiffList(HotFixTool.GetFilesList(project_files_path), HotFixTool.GetFilesList(cdn_files_path));
// 计算大小
local_cdn_size = HotFixTool.GetDiffSize(local_cdn_list);
project_cdn_size = HotFixTool.GetDiffSize(project_cdn_list);
//
isCalSize = true;
}
}
//看热更大小
public class HotfixWindow : EditorWindow
{
static string[][] _SettingConfig = new string[][]{
new string[]{ "C轮测试v2", "mht_china/local", "cdn_v2", "china/dev-c" },
new string[]{ "C轮测试v3", "mht_china/local", "cdn_v3", "china/dev-c" }
};
static Dictionary<string, HotFixConfig> _HotFixConfigDic = new Dictionary<string, HotFixConfig>();
static string benchName = "";
public static string _HotFixProjectPath;
static string _Password = "tcx123";
static bool _IsUpdateCDN = false;
static bool _IsGitPull = false;
[MenuItem("Build/Hotfix")]
static void Init()
{
benchName = GitUtil.GetCurBenchName();
UnityEngine.Debug.Log("当前分支:" + benchName);
_HotFixProjectPath = EditorPrefs.GetString("_HotFixProjectPath", "");
if (!_IsGitPull && _HotFixProjectPath != "")
{
ABGitPull();
}
InitData();
InitStyle();
// Get existing open window or if none, make a new one:
HotfixWindow window = (HotfixWindow)EditorWindow.GetWindow(typeof(HotfixWindow));
window.titleContent = new GUIContent("热更新");
window.Show();
}
static void InitData()
{
_IsGitPull = false;
_HotFixConfigDic.Clear();
foreach (string[] sc in _SettingConfig)
{
string desc = sc[0];
string folder = sc[1];
string setting = sc[2];
string bench = sc[3];
if (bench.Equals(benchName))
{
HotFixConfig hfc;
_HotFixConfigDic.TryGetValue(folder, out hfc);
if (hfc == null)
{
hfc = new HotFixConfig(folder);
_HotFixConfigDic.Add(folder, hfc);
}
hfc.AddSetting(desc, folder, setting);
}
}
}
// 自定义style
static GUIStyle F_B_30 = new GUIStyle();
static GUIStyle F_25 = new GUIStyle();
static GUIStyle L_PL_50 = new GUIStyle();
static void InitStyle()
{
F_B_30.fontSize = 30;
F_B_30.fontStyle = FontStyle.Bold;
F_25.fontSize = 25;
L_PL_50.padding.left = 50;
}
void OnGUI()
{
if (AppConst.PlatformPath != "Android" && AppConst.PlatformPath != "IOS")
{
EditorGUILayout.LabelField("<color=red>请先切换到Android或者IOS平台</color>", F_B_30);
return;
}
_Password = EditorGUILayout.PasswordField("请输入密码:", _Password);
if (_Password != "tcx123")
{
return;
}
EditorGUILayout.BeginVertical();
EditorGUILayout.Space();
EditorGUILayout.Space();
EditorGUILayout.LabelField("当前工程GIT分支" + benchName);
EditorGUILayout.BeginHorizontal();
_HotFixProjectPath = EditorGUILayout.TextField("热更GIT工程地址", _HotFixProjectPath);
if (GUILayout.Button("Browse", GUILayout.ExpandWidth(false)))
{
_HotFixProjectPath = EditorUtility.OpenFolderPanel("Resource path", _HotFixProjectPath, _HotFixProjectPath);
EditorPrefs.SetString("_HotFixProjectPath", _HotFixProjectPath);
}
EditorGUILayout.EndHorizontal();
EditorGUILayout.Space();
EditorGUILayout.Space();
_IsUpdateCDN = EditorGUILayout.ToggleLeft("是否显示CDN更新选项", _IsUpdateCDN);
EditorGUILayout.Space();
EditorGUILayout.Space();
EditorGUILayout.LabelField("请选择要更新的GIT路径");
foreach (string k in _HotFixConfigDic.Keys)// i = 0; i < _CurConfig.Length; i++)
{
HotFixConfig _CurConfig = _HotFixConfigDic[k];
_CurConfig.isChoose = EditorGUILayout.ToggleLeft("<color=yellow>" + _CurConfig.desc + "</color>", _CurConfig.isChoose, F_B_30, GUILayout.Height(40));
if (_CurConfig.isChoose)
{
EditorGUILayout.BeginHorizontal();
EditorGUILayout.LabelField("工程到Git" + _CurConfig.project_local_size.ToString("0.00") + "M");
if (!_CurConfig.isCalSize)
{
_CurConfig.CalHotFixSize();
}
if (GUILayout.Button("更新到GIT", GUILayout.Height(20f)))
{
HotfixConfimWindow.Create("是否要将工程热更文件同步到GIT " + _CurConfig.desc, _CurConfig.project_local_list, () =>
{
UpdateUnity3dToGit(_CurConfig);
});
}
EditorGUILayout.EndHorizontal();
if (_IsUpdateCDN)
{
foreach (HotFixSetting hfs in _CurConfig.hotFixSettings)// i = 0; i < _CurConfig.Length; i++)
{
EditorGUILayout.BeginVertical(L_PL_50);
hfs.isChoose = EditorGUILayout.ToggleLeft("<color=green>" + hfs.desc + "</color>", hfs.isChoose, F_25, GUILayout.Height(30));
if (hfs.isChoose)
{
// 自动计算一遍大小
if (!hfs.isCalSize)
{
hfs.CalHotFixSize();
}
EditorGUILayout.BeginHorizontal();
EditorGUILayout.BeginVertical();
EditorGUILayout.LabelField("CDN当前版本号" + (hfs.cdn_version == null ? "" : hfs.cdn_version.version));
EditorGUILayout.LabelField("GIT到CDN" + hfs.local_cdn_size.ToString("0.00") + "M");
//EditorGUILayout.LabelField("工程到CDN" + hfs.project_cdn_size.ToString("0.00") + "M");
EditorGUILayout.EndVertical();
if (GUILayout.Button("编辑Setting", GUILayout.Height(30f), GUILayout.Width(100f)))
{
string tpath = hfs.path_cdn_setting + "setting.txt";
ProcessUtil.OpenText(tpath);
}
if (GUILayout.Button("编辑Config", GUILayout.Height(30f), GUILayout.Width(100f)))
{
string tpath = hfs.path_cdn_setting + AppConst.GameConfigFile;
ProcessUtil.OpenText(tpath);
}
if (GUILayout.Button("编辑Version", GUILayout.Height(30f), GUILayout.Width(100f)))
{
string tpath = hfs.path_cdn_setting + AppConst.GameVersionFile;
ProcessUtil.OpenText(tpath);
}
if (GUILayout.Button("刷新", GUILayout.Height(30f), GUILayout.Width(100f)))
{
hfs.CalHotFixSize();
}
EditorGUILayout.EndHorizontal();
}
EditorGUILayout.EndVertical();
}
}
EditorGUILayout.Space();
EditorGUILayout.Space();
EditorGUILayout.Space();
EditorGUILayout.Space();
}
}
EditorGUILayout.EndVertical();
}
// 拉取git工程
private static void ABGitPull()
{
if(!_IsGitPull)
{
ProcessUtil.ProcessCommand(_HotFixProjectPath, "git pull", true);
_IsGitPull = true;
}
}
//同步工程中的热更文件到git
private static void UpdateUnity3dToGit(HotFixConfig hfc)
{
string updateName;
List<ResourceFile> updateList;
List<string> log = new List<string>();
// 初始化数据
updateName = benchName + DateTime.Now.ToString("yyyy_MM_dd_hh_mm_ss");
log.Add("热更文件的版本:" + updateName);
updateList = hfc.project_local_list;
if (updateList.Count <= 0)
{
UnityEngine.Debug.Log("未检测到文件改动");
return;
}
// copy unity3d
log.Add("热更文件:");
string fromPath = hfc.project_files_path;
string toPath = hfc.local_files_path;
foreach (ResourceFile rf in updateList)
{
File.Copy(fromPath + rf.fileName, toPath + rf.fileName, true);
log.Add(rf.fileName);
}
// write log
string[] logArray = log.ToArray();
// git commit
}
}
//看热更大小
public class HotfixConfimWindow : EditorWindow
{
string content;
List<ResourceFile> diffList;
Action a;
Vector2 _scp = Vector2.zero;
public static void Create(string content, List<ResourceFile> diffList, Action a)
{
HotfixConfimWindow window = (HotfixConfimWindow)EditorWindow.GetWindow(typeof(HotfixConfimWindow), true, "提示", true);
window.SetContent(content, diffList, a);
window.ShowAuxWindow();
}
public void SetContent(string _content, List<ResourceFile> _diffList, Action _a)
{
content = _content;
diffList = _diffList;
a = _a;
}
private void OnGUI()
{
EditorGUILayout.BeginVertical();
EditorGUILayout.LabelField(content);
_scp = EditorGUILayout.BeginScrollView(_scp);
foreach(ResourceFile rf in diffList)
{
EditorGUILayout.LabelField(rf.fileName);
}
EditorGUILayout.EndScrollView();
EditorGUILayout.LabelField("更新大小:" + HotFixTool.GetDiffSize(diffList).ToString("0.00") + "M");
EditorGUILayout.BeginHorizontal();
if (GUILayout.Button("取消")){
Close();
}
if (GUILayout.Button("确定"))
{
if (a!= null) a();
}
EditorGUILayout.EndHorizontal();
EditorGUILayout.EndVertical();
}
}
}