miduo_client/Assets/Editor/AutoPack.cs

397 lines
14 KiB
C#
Raw Normal View History

2020-09-10 11:47:18 +08:00
using UnityEngine;
using UnityEditor;
using System.IO;
using System;
2020-09-18 17:44:02 +08:00
using GameEditor.FrameTool;
2020-09-10 11:47:18 +08:00
public class AutoPack : EditorWindow
{
2021-05-27 10:12:22 +08:00
static string[][] PackConfig = new string[][]
{
new string[]{"喜扑", "Logo_cn_xipu", "MHT_CN_XIPU"},
new string[]{"草花", "Logo_cn_xipu", "MHT_CN_MIDDLE_WARE" },
};
#if UNITY_ANDROID
static string Platform = "Android";
static string ConfigFileName = "config.txt";
static string VersionFileName = "version.txt";
#elif UNITY_IOS
static string Platform = "IOS";
static string ConfigFileName = "config.txt";
static string VersionFileName = "game.info";
#endif
static string MomPackPath;
static string ExportPackPath;
static string ScenePath;
static string ABPath;
// 判断是否要重新导出工程
static string[] ExportTypeList =
{
"导出工程,替换出包",
"只替换AB出包",
"只出包"
};
static int ExportType;
static bool[] Chooser;
2020-09-14 16:20:36 +08:00
static bool isObb = false;
2021-05-27 10:12:22 +08:00
private void OnEnable()
{
MomPackPath = EditorPrefs.GetString("MomPackPath", "");
ExportPackPath = Application.dataPath.Replace("Assets", "ExportProject");
ScenePath = Application.dataPath + "/LuaFramework/Scenes/";
ABPath = Application.dataPath + "/../BuildABs/" + Platform + "/";
ExportType = 2;
Chooser = new bool[PackConfig.Length];
}
/// <summary>
/// 版本文件路径
/// </summary>
static string _MomPackPath
{
get
{
return MomPackPath + "/" + Platform + "/";
}
}
//bool isBuild = false;
//static bool isZs = false;
//static string[] versionArr = new string[15];
//static int verIndex = 0;
//static string curProjectDir;
//static string m_ExcelPath;
//static string[] excelArr;
//static int excelIndex=0;
2020-09-10 11:47:18 +08:00
//打包数据
[MenuItem("自动化打包/一键导出")]
private static void EzBuildPack()
{
//创建窗口
2021-05-27 10:12:22 +08:00
Rect wr = new Rect(0, 0, 500, 700);
2020-09-10 11:47:18 +08:00
var buildWin = GetWindowWithRect<AutoPack>(wr, true);
buildWin.titleContent = new GUIContent("打包工具");
2020-09-18 17:44:02 +08:00
buildWin.Show();
2020-09-10 11:47:18 +08:00
}
2021-05-27 10:12:22 +08:00
// 打开文本
private void OpenText(string tPath)
{
if (!File.Exists(tPath))
{
EditorUtility.DisplayDialog("提示", "文件不存在", "确定");
return;
}
System.Diagnostics.Process.Start("notepad.exe", tPath); //用记事本
}
2020-09-10 11:47:18 +08:00
private void OnGUI()
2020-09-18 17:44:02 +08:00
{
2020-09-10 11:47:18 +08:00
EditorGUILayout.BeginVertical();
EditorGUILayout.Space();
EditorGUILayout.Space();
2021-05-27 10:12:22 +08:00
//EditorGUILayout.LabelField("");
MomPackPath = EditorGUILayout.TextField("母包工程地址:", MomPackPath);
EditorGUILayout.Space();
EditorGUILayout.Space();
EditorGUILayout.LabelField("请选择要打的包:");
for(int i = 0; i < PackConfig.Length; i++)
2020-09-18 17:44:02 +08:00
{
2021-05-27 10:12:22 +08:00
EditorGUILayout.BeginVertical();
Chooser[i] = EditorGUILayout.ToggleLeft(PackConfig[i][0], Chooser[i]);
EditorGUILayout.BeginHorizontal();
if (GUILayout.Button("编辑Config", GUILayout.Height(20f)))
2020-09-18 17:44:02 +08:00
{
2021-05-27 10:12:22 +08:00
string tpath = _MomPackPath + PackConfig[i][2] + "/Config/" + ConfigFileName;
OpenText(tpath);
2020-09-18 17:44:02 +08:00
}
2021-05-27 10:12:22 +08:00
if (GUILayout.Button("编辑Version", GUILayout.Height(20f)))
{
string tpath = _MomPackPath + PackConfig[i][2] + "/Config/" + VersionFileName;
OpenText(tpath);
}
if (GUILayout.Button("编辑Gradle", GUILayout.Height(20f)))
2020-09-18 17:44:02 +08:00
{
2021-05-27 10:12:22 +08:00
string tpath = _MomPackPath + PackConfig[i][2] + "/build.gradle";
OpenText(tpath);
2020-09-18 17:44:02 +08:00
}
2021-05-27 10:12:22 +08:00
EditorGUILayout.EndHorizontal();
EditorGUILayout.EndVertical();
EditorGUILayout.Space();
EditorGUILayout.Space();
2020-09-18 17:44:02 +08:00
}
2021-05-27 10:12:22 +08:00
ExportType = EditorGUILayout.Popup("请选择出包方式", ExportType, ExportTypeList);
2020-09-18 17:44:02 +08:00
EditorGUILayout.Space();
EditorGUILayout.Space();
2021-05-27 10:12:22 +08:00
if (GUILayout.Button("开始", GUILayout.Height(40f)))
{
StartExport();
}
}
public static void StartExport()
{
if (MomPackPath.Equals(""))
{
EditorUtility.DisplayDialog("提示", "母包工程地址错误", "确定");
return;
}
bool check_result = false;
for (int i = 0; i < Chooser.Length; i++)
{
if (!Chooser[i]) continue;
string sceneFilePath = ScenePath + PackConfig[i][1];
if (!File.Exists(sceneFilePath + ".unity"))
2020-09-10 11:47:18 +08:00
{
2021-05-27 10:12:22 +08:00
Debug.LogError(PackConfig[i][0] + " 未找到场景:" + sceneFilePath);
check_result = true;
2020-09-10 11:47:18 +08:00
}
2021-05-27 10:12:22 +08:00
string momPath = _MomPackPath + PackConfig[i][2];
if (!Directory.Exists(momPath))
2020-09-10 11:47:18 +08:00
{
2021-05-27 10:12:22 +08:00
Debug.LogError(PackConfig[i][0] + " 未找到母包:" + momPath);
check_result = true;
2020-09-10 11:47:18 +08:00
}
2021-05-27 10:12:22 +08:00
}
if (check_result)
{
EditorUtility.DisplayDialog("提示", "包路径错误", "确定");
return;
}
// 保存配置
EditorPrefs.SetString("MomPackPath", MomPackPath);
// 开始导出
for (int i = 0; i < Chooser.Length; i++)
{
if (!Chooser[i]) continue;
switch (ExportType) {
case 0: // 导出工程
ExportAS(i);
ReplaceFromProject(i);
ReplaceConfigAndVersion(i);
StartGradleBuild(i);
break;
case 1: // 只替换AB
ReplaceFromAB(i);
ReplaceConfigAndVersion(i);
StartGradleBuild(i);
break;
case 2: // 只重新打包
StartGradleBuild(i);
break;
2020-09-10 11:47:18 +08:00
}
}
}
2021-05-27 10:12:22 +08:00
// 导出android 工程
public static void ExportAS(int index)
2020-09-10 11:47:18 +08:00
{
2021-05-27 10:12:22 +08:00
string pName = PackConfig[index][1] + "__" + PackConfig[index][2];
PlayerSettings.productName = pName;
PlayerSettings.Android.useAPKExpansionFiles = isObb;
2020-09-14 16:20:36 +08:00
if (isObb)
2020-09-10 11:47:18 +08:00
{
2021-05-27 10:12:22 +08:00
pName += "__obb";
2020-09-10 11:47:18 +08:00
}
2021-05-27 10:12:22 +08:00
if (!Directory.Exists(ExportPackPath))
2020-09-10 11:47:18 +08:00
{
2021-05-27 10:12:22 +08:00
Directory.CreateDirectory(ExportPackPath);
}
if (Directory.Exists(ExportPackPath + "/" + pName))
{
Directory.Delete(ExportPackPath + "/" + pName, true);
2020-09-10 11:47:18 +08:00
}
EditorUserBuildSettings.exportAsGoogleAndroidProject = true;
2020-09-17 12:08:08 +08:00
EditorUserBuildSettings.androidBuildSystem = AndroidBuildSystem.Gradle;
2020-09-10 11:47:18 +08:00
// 设置需要打包的场景
2021-05-27 10:12:22 +08:00
string launchScene = "Assets/LuaFramework/Scenes/" + PackConfig[index][1] + ".unity";
Debug.Log(PackConfig[index][0] + ":打包场景:" + launchScene);
BuildPlayerOptions bpo = new BuildPlayerOptions();
bpo.locationPathName = ExportPackPath;
bpo.options = BuildOptions.None;
//bpo.options |= BuildOptions.AcceptExternalModificationsToPlayer;
bpo.scenes = new[] { launchScene };
bpo.target = BuildTarget.Android;
2020-09-10 11:47:18 +08:00
// 调用开始打包
2021-05-27 10:12:22 +08:00
BuildPipeline.BuildPlayer(bpo);
Debug.Log(PackConfig[index][0] + "android工程导出路径" + ExportPackPath + "/" + pName);
Debug.Log(PackConfig[index][0] + "android工程导出完成");
2020-09-14 16:20:36 +08:00
}
2020-09-10 11:47:18 +08:00
2021-05-27 10:12:22 +08:00
static string[] ReplaceDir = new string[]
{
"/src/main/assets/Android",
"/src/main/assets/bin",
"/src/main/jniLibs"
};
// 从工程中替换
private static void ReplaceFromProject(int index)
2020-09-14 16:20:36 +08:00
{
2021-05-27 10:12:22 +08:00
string fromPath = ExportPackPath + "/" + PackConfig[index][1] + "__" + PackConfig[index][2];
string toPath = _MomPackPath + PackConfig[index][2];
for (int i = 0; i < ReplaceDir.Length; i++)
2020-09-14 16:20:36 +08:00
{
2021-05-27 10:12:22 +08:00
string dir = ReplaceDir[i];
string to = toPath + dir;
if (Directory.Exists(to)) Directory.Delete(to, true);
Directory.CreateDirectory(to);
GameCore.FileUtils.CopyDir(fromPath + dir, to);
2020-09-14 16:20:36 +08:00
}
2021-05-27 10:12:22 +08:00
Debug.Log(PackConfig[index][0] + ":母包工程资源替换完成");
// 替换build-id
RewriteManifest(fromPath + "/src/main/AndroidManifest.xml", toPath + "/src/main/AndroidManifest.xml");
Debug.Log(PackConfig[index][0] + "母包Manifest修改完成");
}
private static void RewriteManifest(string f, string t)
{
// 找到要替换的内容
string[] flines = File.ReadAllLines(f, System.Text.Encoding.UTF8);
string rpl = "";
for (int fi = 0; fi < flines.Length; fi++)
{
if (flines[fi].Contains("unity.build-id"))
{
rpl = flines[fi];
break;
}
}
// 判断是否正确
if (rpl.Equals(""))
2020-09-14 16:20:36 +08:00
{
2021-05-27 10:12:22 +08:00
return;
2020-09-14 16:20:36 +08:00
}
2021-05-27 10:12:22 +08:00
// 替换到母包中
string[] tlines = File.ReadAllLines(t, System.Text.Encoding.UTF8);
string[] wlines = new string[tlines.Length - 1];
string lastLine = "";
for (int ti = 0; ti < tlines.Length; ti++)
{
if (tlines[ti].Contains("unity.build-id"))
{
tlines[ti] = rpl;
}
if (ti == tlines.Length - 1)
{
lastLine = tlines[ti];
}
else
{
wlines[ti] = tlines[ti];
}
}
File.WriteAllLines(t, wlines, System.Text.Encoding.UTF8);
File.AppendAllText(t, lastLine, System.Text.Encoding.UTF8);
}
// 从AB包替换
private static void ReplaceFromAB(int index)
{
string toPath = _MomPackPath + PackConfig[index][2] + "/src/main/assets/Android";
if (Directory.Exists(toPath)) Directory.Delete(toPath, true);
Directory.CreateDirectory(toPath);
GameCore.FileUtils.CopyDir(ABPath, toPath);
Debug.Log(PackConfig[index][0] + "替换AB包完成");
}
// 替换配置文件
private static void ReplaceConfigAndVersion(int index)
{
string toPath = _MomPackPath + PackConfig[index][2] + "/src/main/assets/Android/";
string fromPath = _MomPackPath + PackConfig[index][2] + "/Config/";
File.Copy(fromPath + ConfigFileName, toPath + ConfigFileName, true);
File.Copy(fromPath + VersionFileName, toPath + VersionFileName, true);
Debug.Log(PackConfig[index][0]+":配置文件替换完成");
}
// 开始生成apk
private static void StartGradleBuild(int index)
{
ProcessCommand(_MomPackPath + PackConfig[index][2], new string[] { "gradlew assembleDebug" });
Debug.Log(PackConfig[index][0] + ":打包完成");
2020-09-10 11:47:18 +08:00
}
2021-05-27 10:12:22 +08:00
//
private static void ProcessCommand(string dir, string[] coms)
{
System.Diagnostics.Process p = new System.Diagnostics.Process();
//设置要启动的应用程序
p.StartInfo.FileName = "cmd.exe";
//是否使用操作系统shell启动
p.StartInfo.UseShellExecute = true;
//接受来自调用程序的输入信息
p.StartInfo.RedirectStandardInput = false;
//输出信息
p.StartInfo.RedirectStandardOutput = false;
//输出错误
p.StartInfo.RedirectStandardError = false;
//不显示程序窗口
p.StartInfo.CreateNoWindow = false;
// 设置文件夹
p.StartInfo.WorkingDirectory = dir;
// 执行命令
for(int i = 0; i < coms.Length; i++)
{
p.StartInfo.Arguments = "/k " + coms[i] + "&exit";
//启动程序
p.Start();
}
p.StartInfo.Arguments = "/k exit";
//启动程序
p.Start();
//等待程序执行完退出进程
p.WaitForExit();
p.Close();
}
//private static void ExportXcode(string _sceneName)
//{
// PlayerSettings.productName = "太初行";
// string mainXcodePath =
// isZs? "/Volumes/ELEMENTS/JieLing/Packager/IOS/MHT_HW_RELEASE": "/Volumes/ELEMENTS/JieLing/Packager/IOS/MHT_HW_TEST";
// string outPath = isZs?"/Volumes/ELEMENTS/JieLing/Packager/IOS/exXcodePro_Release":"/Volumes/ELEMENTS/JieLing/Packager/IOS/exXcodePro_Test";
// if (Directory.Exists(outPath))
// {
// Directory.Delete(outPath, true);
// }
// // 设置需要打包的场景
// string launchScene = _sceneName;
// Debug.Log("打包场景:" + launchScene);
// BuildPlayerOptions buildPlayerOptions = new BuildPlayerOptions();
// buildPlayerOptions.locationPathName = outPath;
// buildPlayerOptions.options = BuildOptions.None;
// buildPlayerOptions.options |= BuildOptions.AcceptExternalModificationsToPlayer;
// buildPlayerOptions.scenes = new[] { launchScene };
// buildPlayerOptions.target = BuildTarget.iOS;
// // 调用开始打包
// BuildPipeline.BuildPlayer(buildPlayerOptions);
// Debug.Log("打包完成");
// Debug.Log("导出工程路径:"+ outPath);
// if (Directory.Exists(mainXcodePath)&& Directory.Exists(outPath))
// {
// Debug.Log("替换xcode资源");
// Directory.Delete(mainXcodePath+"/Data", true);
// Directory.Move(outPath+"/Data",mainXcodePath+"/Data");
// Directory.Delete(mainXcodePath+"/Classes/Native", true);
// Directory.Move(outPath+"/Classes/Native",mainXcodePath+"/Classes/Native");
// }
//}
2020-09-10 11:47:18 +08:00
}