diff --git a/Editor/BuildTool.cs b/Editor/BuildTool.cs new file mode 100644 index 0000000..d4f3080 --- /dev/null +++ b/Editor/BuildTool.cs @@ -0,0 +1,317 @@ +using System; +using System.IO; +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() + { + PlayerSettings.SplashScreen.show = false; + PlayerSettings.SplashScreen.showUnityLogo = false; + Assembly assembly = Assembly.GetAssembly(typeof(IBuildImp)); + var types = assembly.GetTypes(); + foreach (var item in types) + { + if(item.IsInterface) continue; + var interfaces = item.GetInterfaces(); + foreach (var interfaceType in interfaces) + { + if (interfaceType == typeof(IBuildImp)) + { + var instance = Activator.CreateInstance(item) as IBuildImp; + Debug.Log(instance.GetType().Name); + instance.OnGuruSDKBuildPreprocess(); + break; + } + } + } + } + + private static void BuildAndroid(BuildParam buildParam) + { + Debug.Log("========Project Asset Process Start========"); + OnGuruSDKBuildPreprocess(); + 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(); + 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); + } + + /// + /// 平台切换 + /// + /// + private static void BuildSwitchPlatform(BuildTarget targetPlatform) + { + if (EditorUserBuildSettings.activeBuildTarget != targetPlatform) + { + EditorUserBuildSettings.SwitchActiveBuildTarget(BuildPipeline.GetBuildTargetGroup(targetPlatform), targetPlatform); + AssetDatabase.Refresh(); + } + } +} diff --git a/Editor/BuildTool.cs.meta b/Editor/BuildTool.cs.meta new file mode 100644 index 0000000..5a13289 --- /dev/null +++ b/Editor/BuildTool.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 9b057dc48b244f209567e48a6ef6639e +timeCreated: 1712568069 \ No newline at end of file diff --git a/Editor/GuruSDKService.Editor.asmdef b/Editor/GuruSDKService.Editor.asmdef index dd94239..523effe 100644 --- a/Editor/GuruSDKService.Editor.asmdef +++ b/Editor/GuruSDKService.Editor.asmdef @@ -1,7 +1,7 @@ { "name": "GuruSDKService.Editor", "rootNamespace": "", - "references": [], + "references": ["GUID:06333683107744765b2aba72701ca0a2"], "includePlatforms": [ "Editor" ], diff --git a/Editor/IBuildImp.cs b/Editor/IBuildImp.cs new file mode 100644 index 0000000..9580a76 --- /dev/null +++ b/Editor/IBuildImp.cs @@ -0,0 +1,4 @@ +public interface IBuildImp +{ + void OnGuruSDKBuildPreprocess(); +} diff --git a/Editor/IBuildImp.cs.meta b/Editor/IBuildImp.cs.meta new file mode 100644 index 0000000..95d782a --- /dev/null +++ b/Editor/IBuildImp.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 87959a6db973437caf21e766e1c621f2 +timeCreated: 1712570362 \ No newline at end of file