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(); } } }