GuruSDKService/Editor/BuildTool.cs

326 lines
9.8 KiB
C#

using System;
using System.IO;
using System.Linq;
using System.Reflection;
using Guru.Editor;
using UnityEditor;
using UnityEngine;
public class BuildTool
{
public enum BuildType
{
JenkinsBuild,
EditorBuild
}
public enum BuildEnv
{
None,
Debug,
Release,
Production,
}
public class BuildParam
{
public BuildType BuildType;
public BuildEnv BuildEnv;
public string BundleVersion;
public override string ToString()
{
return $"{nameof(BuildType)}: {BuildType}, {nameof(BuildEnv)}: {BuildEnv}, {nameof(BundleVersion)}: {BundleVersion}";
}
}
#region Jenkins打包
private static string[] ParseJenkinsBuildSetting(string[] commandLineArgs)
{
for (int i = 0; i < commandLineArgs.Length; i++)
{
string commandLineArg = commandLineArgs[i];
if (commandLineArg.StartsWith("-params"))
{
return commandLineArg.Split('-');
}
}
return null;
}
private static BuildParam ParseJenkinsParam()
{
BuildParam buildParam = null;
try
{
var param = ParseJenkinsBuildSetting(Environment.GetCommandLineArgs());
string version = param[2];
BuildEnv buildEnv = BuildEnv.None;
Enum.TryParse(param[3], out buildEnv);
if (string.IsNullOrEmpty(version))
{
Debug.LogError("==============================");
Debug.LogError("【jenkins version参数解析异常】");
Debug.LogError("==============================");
}
if (buildEnv == BuildEnv.None)
{
Debug.LogError("==============================");
Debug.LogError("【jenkins buildEnv参数解析异常】");
Debug.LogError("==============================");
}
buildParam = new BuildParam
{
BundleVersion = version,
BuildType = BuildType.JenkinsBuild,
BuildEnv = buildEnv,
};
}
catch (Exception e)
{
Debug.LogError("==============================");
Debug.LogError("【jenkins 参数解析异常】");
Debug.LogException(e);
Debug.LogError("==============================");
}
return buildParam;
}
public static void JenkinsBuildAndroid()
{
string outputDir = Path.GetFullPath($"{Application.dataPath}/../BuildOutput/Android");
if (Directory.Exists(outputDir))
Directory.Delete(outputDir, true);
BuildParam buildParam = ParseJenkinsParam();
if (buildParam == null)
{
Debug.LogError("==============================");
Debug.LogError("【jenkins buildParam获取为null】");
Debug.LogError("==============================");
return;
}
Debug.Log(buildParam.ToString());
BuildAndroid(buildParam);
}
public static void JenkinsBuildIOS()
{
BuildParam buildParam = ParseJenkinsParam();
if (buildParam == null)
{
Debug.LogError("==============================");
Debug.LogError("【jenkins buildParam获取为null】");
Debug.LogError("==============================");
return;
}
Debug.Log(buildParam.ToString());
BuildIOS(buildParam);
}
#endregion
#region Android打包MenuItem定义
[MenuItem("Tools/自动化打包/Android/Debug", true)]
public static bool IsBuildAndroidDebug()
{
return EditorUserBuildSettings.activeBuildTarget == BuildTarget.Android;
}
[MenuItem("Tools/自动化打包/Android/Debug")]
public static void BuildAndroidDebug()
{
BuildAndroid(new BuildParam()
{
BuildType = BuildType.EditorBuild,
BuildEnv = BuildEnv.Debug,
});
}
[MenuItem("Tools/自动化打包/Android/Release", true)]
public static bool IsBuildAndroidRelease()
{
return EditorUserBuildSettings.activeBuildTarget == BuildTarget.Android;
}
[MenuItem("Tools/自动化打包/Android/Release")]
public static void BuildAndroidRelease()
{
BuildAndroid(new BuildParam()
{
BuildType = BuildType.EditorBuild,
BuildEnv = BuildEnv.Release,
});
}
[MenuItem("Tools/自动化打包/Android/Production", true)]
public static bool IsBuildAndroidProduction()
{
return EditorUserBuildSettings.activeBuildTarget == BuildTarget.Android;
}
[MenuItem("Tools/自动化打包/Android/Production")]
public static void BuildAndroidProduction()
{
BuildAndroid(new BuildParam()
{
BuildType = BuildType.EditorBuild,
BuildEnv = BuildEnv.Production,
});
}
#endregion
#region iOS打包MenuItem定义
[MenuItem("Tools/自动化打包/iOS/Debug", true)]
public static bool IsBuildIOSDebug()
{
return EditorUserBuildSettings.activeBuildTarget == BuildTarget.iOS;
}
[MenuItem("Tools/自动化打包/iOS/Debug")]
public static void BuildIOSDebug()
{
BuildIOS(new BuildParam()
{
BuildType = BuildType.EditorBuild,
BuildEnv = BuildEnv.Debug,
});
}
[MenuItem("Tools/自动化打包/iOS/Release", true)]
public static bool IsBuildIOSRelease()
{
return EditorUserBuildSettings.activeBuildTarget == BuildTarget.iOS;
}
[MenuItem("Tools/自动化打包/iOS/Release")]
public static void BuildIOSRelease()
{
BuildIOS(new BuildParam()
{
BuildType = BuildType.EditorBuild,
BuildEnv = BuildEnv.Release,
});
}
[MenuItem("Tools/自动化打包/iOS/Production", true)]
public static bool IsBuildIOSProduction()
{
return EditorUserBuildSettings.activeBuildTarget == BuildTarget.iOS;
}
[MenuItem("Tools/自动化打包/iOS/Production")]
public static void BuildIOSProduction()
{
BuildIOS(new BuildParam()
{
BuildType = BuildType.EditorBuild,
BuildEnv = BuildEnv.Production,
});
}
#endregion
private static AppBuildParam GetGuruSDKAppBuildParam(BuildParam buildParam)
{
return AppBuildParam.Build(
isRelease: buildParam.BuildEnv == BuildEnv.Release || buildParam.BuildEnv == BuildEnv.Production,
builderType: buildParam.BuildType == BuildType.EditorBuild ? AppBuilderType.Editor : AppBuilderType.Jenkins,
version: buildParam.BundleVersion,
buildShowLog: buildParam.BuildEnv == BuildEnv.Debug || buildParam.BuildEnv == BuildEnv.Release,
buildSymbols: buildParam.BuildEnv == BuildEnv.Production,
buildAAB: buildParam.BuildEnv == BuildEnv.Production,
useMinify: true,
debugWithMono: false
);
}
private static void OnGuruSDKBuildPreprocess(BuildTargetGroup targetGroup, BuildParam buildParam)
{
PlayerSettings.SplashScreen.show = false;
PlayerSettings.SplashScreen.showUnityLogo = false;
var assembly = AppDomain.CurrentDomain.GetAssemblies()
.FirstOrDefault(a => a.GetName().Name == "Assembly-CSharp-Editor");
if (assembly == null) {
Debug.LogError("Assembly-CSharp-Editor not found.");
return;
}
// 找到实现了IBuildImp接口的类
var type = assembly.GetTypes()
.FirstOrDefault(t => t.GetInterfaces().Any(i => i.Name == "IBuildImp"));
if (type == null) {
Debug.LogError("IBuildImp implementation not found.");
return;
}
// 创建实现类的实例
var instance = Activator.CreateInstance(type) as IBuildImp;
if (instance == null) {
Debug.LogError("Failed to create an instance of IBuildImp implementation.");
return;
}
instance.OnGuruSDKBuildPreprocess(targetGroup, buildParam);
}
private static void BuildAndroid(BuildParam buildParam)
{
Debug.Log("========Project Asset Process Start========");
OnGuruSDKBuildPreprocess(BuildTargetGroup.Android, buildParam);
Debug.Log("========Project Asset Process End========");
Debug.Log("========Guru Build Start========");
Guru.Editor.AppBuilder.BuildAndroid(GetGuruSDKAppBuildParam(buildParam));
Debug.Log("========Guru Build End========");
}
private static void BuildIOS(BuildParam buildParam)
{
Debug.Log("========Project Asset Process Start========");
OnGuruSDKBuildPreprocess(BuildTargetGroup.iOS, buildParam);
Debug.Log("========Project Asset Process End========");
Debug.Log("========Guru Build Start========");
Guru.Editor.AppBuilder.BuildIOS(GetGuruSDKAppBuildParam(buildParam));
Debug.Log("========Guru Build End========");
}
[MenuItem("Tools/自动化打包/平台切换/Android", false, 1)]
public static void ChangePlatform2Android()
{
BuildSwitchPlatform(BuildTarget.Android);
}
[MenuItem("Tools/自动化打包/平台切换/IOS", false, 2)]
public static void ChangePlatform2IOS()
{
BuildSwitchPlatform(BuildTarget.iOS);
}
/// <summary>
/// 平台切换
/// </summary>
/// <param name="targetPlatform"></param>
private static void BuildSwitchPlatform(BuildTarget targetPlatform)
{
if (EditorUserBuildSettings.activeBuildTarget != targetPlatform)
{
EditorUserBuildSettings.SwitchActiveBuildTarget(BuildPipeline.GetBuildTargetGroup(targetPlatform), targetPlatform);
AssetDatabase.Refresh();
}
}
}