From d28d8c2c572e84f901c546f992bbf011ee57ba6d Mon Sep 17 00:00:00 2001 From: huyufei Date: Thu, 15 Aug 2024 20:40:28 +0800 Subject: [PATCH] =?UTF-8?q?update=EF=BC=9A=20Builder=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E9=85=8D=E7=BD=AE=20Gradle=20=E5=92=8C=20SDK?= =?UTF-8?q?=20=E8=B7=AF=E5=BE=84=E7=9A=84=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: huyufei --- Editor/BuildTool/AppBuildParam.cs | 4 + Editor/BuildTool/AppBuilder.cs | 200 +++++++++++++++++++++++------- 2 files changed, 158 insertions(+), 46 deletions(-) diff --git a/Editor/BuildTool/AppBuildParam.cs b/Editor/BuildTool/AppBuildParam.cs index 3e37217..dbd2793 100644 --- a/Editor/BuildTool/AppBuildParam.cs +++ b/Editor/BuildTool/AppBuildParam.cs @@ -32,6 +32,10 @@ namespace Guru.Editor public string AndroidKeystorePass = ""; // Android KeyStore 文件名 public string AndroidAlias = ""; // Android KeyStore 文件名 public string AndroidAliasPass = ""; // Android KeyStore 文件名 + public string CustomGradlePath = ""; // Android Gradle Path + public string CustomJDKRoot = ""; // Android JDK Path + public string CustomNDKRoot = ""; // Android NDK Path + public string CustomAndroidSDKRoot = "";// Android SDK Path //------------ iOS ---------------- public string IOSTargetVersion = ""; // IOS SDK 版本设置 ( iOS 发布专用 ) public string IOSTeamId = ""; // IOS 打包 TeamId ( iOS 使用专用的开发证书后开启 ) diff --git a/Editor/BuildTool/AppBuilder.cs b/Editor/BuildTool/AppBuilder.cs index 97e94bd..ede64de 100644 --- a/Editor/BuildTool/AppBuilder.cs +++ b/Editor/BuildTool/AppBuilder.cs @@ -2,29 +2,38 @@ namespace Guru.Editor { using System.Linq; using System; - using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEditor; using System.IO; using NUnit.Framework; - + /// /// 构建工具 /// public partial class AppBuilder { - public static int AndroidTargetSdkVersion = 33; - public static string IOSTargetOSVersion = "13.0"; - public static string GuruIOSTeamId = "39253T242A"; - public static string GuruKeystoreName => "guru_key.jks"; - public static string GuruKeystorePass => "guru0622"; - public static string GuruAliasName => "guru"; - public static string GuruAliasPass => "guru0622"; - public static string GuruKeystorePath => Application.dataPath + $"/Plugins/Android/{GuruKeystoreName}"; - public static string ProguardName => "proguard-user.txt"; - public static string ProguardPath => Application.dataPath + $"/Plugins/Android/{ProguardName}"; - public static string OutputDirName => "BuildOutput"; + private const int DefaultAndroidTargetSdkVersion = 34; + private const string IOSTargetOSVersion = "13.0"; + private const string GuruIOSTeamId = "39253T242A"; + private const string GuruKeystoreName = "guru_key.jks"; + private const string GuruKeystorePass = "guru0622"; + private const string GuruAliasName = "guru"; + private const string GuruAliasPass = "guru0622"; + + private const string DEFAULT_GRADLE_PATH_MAC_2021_3_41 = + "/Applications/Unity/Hub/Editor/2021.3.41f1/PlaybackEngines/AndroidPlayer/Tools/gradle"; + private const string DEFAULT_JDK_PATH_MAC_2021_3_41 = + "/Applications/Unity/Hub/Editor/2021.3.41f1/PlaybackEngines/AndroidPlayer/OpenJDK"; + private const string DEFAULT_NDK_PATH_MAC_2021_3_41 = + "/Applications/Unity/Hub/Editor/2021.3.41f1/PlaybackEngines/AndroidPlayer/NDK"; + private const string DEFAULT_ANDROID_SDK_MAC_2021_3_41 = + "/Applications/Unity/Hub/Editor/2021.3.41f1/PlaybackEngines/AndroidPlayer/SDK"; + + private static string GuruKeystorePath => Application.dataPath + $"/Plugins/Android/{GuruKeystoreName}"; + private static string ProguardName => "proguard-user.txt"; + private static string ProguardPath => Application.dataPath + $"/Plugins/Android/{ProguardName}"; + private static string OutputDirName => "BuildOutput"; #region 构建接口 @@ -70,12 +79,21 @@ namespace Guru.Editor SwitchBuildPlatform(BuildTarget.Android); // 打包通用设置 ChangeBuildPlayerCommonSetting(buildParam, BuildTargetGroup.Android); + // 设置打包环境 + SetGradlePath(buildParam.CustomGradlePath); + SetJDKRoot(buildParam.CustomJDKRoot); + SetNDKRoot(buildParam.CustomNDKRoot); + SetAndroidSDKRoot(buildParam.CustomAndroidSDKRoot); var isDebug = !buildParam.IsBuildRelease; var useMinify = buildParam.AndroidUseMinify; - var buildNumber= GetBuildNumberString(BuildTarget.Android); - if(buildParam.AutoSetBuildNumber) buildNumber = ChangeBuildNumber(BuildTarget.Android); - + var buildNumber= GetPlayerSettingsBuildNumberStr(BuildTarget.Android); + var androidTargetVersion = buildParam.AndroidTargetVersion == 0 ? DefaultAndroidTargetSdkVersion : buildParam.AndroidTargetVersion; + if (buildParam.AutoSetBuildNumber) + { + buildNumber = CreateGuruBuildNumber(); + PlayerSettings.Android.bundleVersionCode = int.Parse(buildNumber); + } // 保存版本信息 SaveBuildVersion(buildParam.BuildVersion, buildNumber); @@ -90,9 +108,6 @@ namespace Guru.Editor PlayerSettings.muteOtherAudioSources = false; // ---- 开启 Minify 后需要配置 proguard-user.txt 文件 ---- if (useMinify) DeployProguardTxt(); -#if UNITY_2021_3_35 - PlayerSettings.Android.minifyWithR8 = useMinify; -#endif PlayerSettings.Android.minifyRelease = useMinify; PlayerSettings.Android.minifyDebug = useMinify; // ---- 部署 Guru 专用的 Keystore ---- @@ -115,19 +130,17 @@ namespace Guru.Editor PlayerSettings.Android.keyaliasPass = buildParam.AndroidAliasPass; } - PlayerSettings.Android.targetArchitectures = AndroidArchitecture.ARMv7 | AndroidArchitecture.ARM64; //只构建 armv7 和 arm64 + PlayerSettings.Android.targetArchitectures = AndroidArchitecture.ARMv7 | AndroidArchitecture.ARM64; // 构建 armV7, arm64 PlayerSettings.Android.minSdkVersion = AndroidSdkVersions.AndroidApiLevel22; - if (buildParam.AndroidTargetVersion > 0) AndroidTargetSdkVersion = buildParam.AndroidTargetVersion; - PlayerSettings.Android.targetSdkVersion = (AndroidSdkVersions)AndroidTargetSdkVersion; // 默认设置API为33 + PlayerSettings.Android.targetSdkVersion = (AndroidSdkVersions)androidTargetVersion; // 设置 API Version //打包 string symbolDefine = buildParam.IsBuildRelease ? GameDefine.MACRO_RELEASE : GameDefine.MACRO_DEBUG; - string apkPath = string.Empty; string version = Application.version; string extension = buildParam.IsBuildAAB ? ".aab" : ".apk"; if (EditorUserBuildSettings.exportAsGoogleAndroidProject) extension = ""; // 输出工程 string outputDir = Path.GetFullPath($"{Application.dataPath }/../{OutputDirName}/Android"); - apkPath = $"{outputDir}/{Application.productName.Replace(" ","_")}_{symbolDefine}_{version}_{buildNumber}{extension}"; + var apkPath = $"{outputDir}/{Application.productName.Replace(" ","_")}_{symbolDefine}_{version}_{buildNumber}{extension}"; if (!Directory.Exists(outputDir)) Directory.CreateDirectory(outputDir); BuildOptions opts = isDebug ? BuildOptions.Development : BuildOptions.None; @@ -143,8 +156,94 @@ namespace Guru.Editor } return apkPath; } + + /// + /// 设置 GradlePath + /// + /// + private static void SetGradlePath(string gradlePath = "") + { + if (!string.IsNullOrEmpty(gradlePath)) + { + UnityEditor.Android.AndroidExternalToolsSettings.gradlePath = gradlePath; + return; + } + +#if UNITY_2021_3_41 && UNITY_EDITOR_OSX + // 针对 2021.3.41 MAC 版本,直接强制走Unity 自带的 Gradle 库 + if (Directory.Exists(DEFAULT_GRADLE_PATH_MAC_2021_3_41)) + { + UnityEditor.Android.AndroidExternalToolsSettings.gradlePath = DEFAULT_GRADLE_PATH_MAC_2021_3_41; + } +#endif + } + + /// + /// 设置自定义的JDK 路径 + /// + /// + private static void SetJDKRoot(string jdkRoot) + { + if (!string.IsNullOrEmpty(jdkRoot)) + { + UnityEditor.Android.AndroidExternalToolsSettings.jdkRootPath = jdkRoot; + return; + } + +#if UNITY_2021_3_41 && UNITY_EDITOR_OSX + // 针对 2021.3.41 MAC 版本,直接强制走Unity 自带的 JDK 库 + if (Directory.Exists(DEFAULT_JDK_PATH_MAC_2021_3_41)) + { + UnityEditor.Android.AndroidExternalToolsSettings.jdkRootPath = DEFAULT_JDK_PATH_MAC_2021_3_41; + } +#endif + } + + /// + /// 设置自定义的 NDK 路径 + /// + /// + private static void SetNDKRoot(string ndkRoot) + { + if (!string.IsNullOrEmpty(ndkRoot)) + { + UnityEditor.Android.AndroidExternalToolsSettings.ndkRootPath = ndkRoot; + return; + } + +#if UNITY_2021_3_41 && UNITY_EDITOR_OSX + // 针对 2021.3.41 MAC 版本,直接强制走Unity 自带的 JDK 库 + if (Directory.Exists(DEFAULT_JDK_PATH_MAC_2021_3_41)) + { + UnityEditor.Android.AndroidExternalToolsSettings.ndkRootPath = DEFAULT_NDK_PATH_MAC_2021_3_41; + } +#endif + } + + + /// + /// 设置自定义的 NDK 路径 + /// + /// + private static void SetAndroidSDKRoot(string sdkRoot) + { + if (!string.IsNullOrEmpty(sdkRoot)) + { + UnityEditor.Android.AndroidExternalToolsSettings.sdkRootPath = sdkRoot; + return; + } + +#if UNITY_2021_3_41 && UNITY_EDITOR_OSX + // 针对 2021.3.41 MAC 版本,直接强制走Unity 自带的 JDK 库 + if (Directory.Exists(DEFAULT_JDK_PATH_MAC_2021_3_41)) + { + UnityEditor.Android.AndroidExternalToolsSettings.sdkRootPath = DEFAULT_ANDROID_SDK_MAC_2021_3_41; + } +#endif + } - /// + + /// /// 部署 Guru 专用的 Keystore /// private static bool DeployAndroidKeystore() @@ -197,8 +296,12 @@ namespace Guru.Editor ChangeBuildPlayerCommonSetting(buildParam, BuildTargetGroup.iOS); //修改打包版本号 - var buildNumber= GetBuildNumberString(BuildTarget.Android); - if(buildParam.AutoSetBuildNumber) buildNumber = ChangeBuildNumber(BuildTarget.iOS); + var buildNumber= GetPlayerSettingsBuildNumberStr(BuildTarget.Android); + if (buildParam.AutoSetBuildNumber) + { + buildNumber = CreateGuruBuildNumber(); + PlayerSettings.iOS.buildNumber = buildNumber; + } // 保存版本信息 SaveBuildVersion(buildParam.BuildVersion, buildNumber); @@ -236,7 +339,7 @@ namespace Guru.Editor try { BuildOptions opts = isDebug ? BuildOptions.Development : BuildOptions.None; - BuildPipeline.BuildPlayer(GetBuildScenes(), outputDir, BuildTarget.iOS, BuildOptions.None); + BuildPipeline.BuildPlayer(GetBuildScenes(), outputDir, BuildTarget.iOS, opts); if (buildParam.BuilderType == AppBuilderType.Editor) { Open(outputDir); @@ -263,10 +366,9 @@ namespace Guru.Editor var guids = AssetDatabase.FindAssets($"{nameof(AppBuilder)} t:Script"); if (guids.Length > 0) { - var path = ""; foreach (var guid in guids) { - path = AssetDatabase.GUIDToAssetPath(guids[0]); + var path = AssetDatabase.GUIDToAssetPath(guid); if (path.Contains($"Editor/BuildTool/{nameof(AppBuilder)}")) { return Directory.GetParent(path)!.FullName; @@ -342,20 +444,15 @@ namespace Guru.Editor /// 修改打包版本号 /// /// - /// - private static string ChangeBuildNumber(BuildTarget buildTarget) + private static string CreateGuruBuildNumber() { var nowDate = DateTime.Now; - string strBuildNumber = $"{nowDate.Year - 2000}{nowDate.Month:00}{nowDate.Day:00}{((nowDate.Hour * 60 + nowDate.Minute) / 15):00}"; - int buildNumber = int.Parse(strBuildNumber); - if (buildTarget == BuildTarget.iOS) - { - PlayerSettings.iOS.buildNumber = buildNumber.ToString(); - } - else if (buildTarget == BuildTarget.Android) - { - PlayerSettings.Android.bundleVersionCode = buildNumber; - } + string strYear = nowDate.Year.ToString().Substring(2); + string strMon = nowDate.Month.ToString("00"); + string strDay = nowDate.Day.ToString("00"); + string strQuarter = ((nowDate.Hour * 60 + nowDate.Minute) / 15).ToString("00"); + // 2024-08-01 08:00:00 to version string: 24080130 + string strBuildNumber = $"{strYear}{strMon}{strDay}{strQuarter}"; return strBuildNumber; } @@ -363,7 +460,7 @@ namespace Guru.Editor /// 获取构建数变量 /// /// - private static string GetBuildNumberString(BuildTarget buildTarget) + private static string GetPlayerSettingsBuildNumberStr(BuildTarget buildTarget) { if (buildTarget == BuildTarget.iOS) { @@ -387,7 +484,7 @@ namespace Guru.Editor /// 获取打包场景 /// /// - public static string[] GetBuildScenes() + private static string[] GetBuildScenes() { List names = new List(); foreach (var e in EditorBuildSettings.scenes) @@ -404,7 +501,7 @@ namespace Guru.Editor /// 打开路径 /// /// - public static void Open(string path) + private static void Open(string path) { #if UNITY_EDITOR_OSX EditorUtility.RevealInFinder(path); @@ -434,7 +531,18 @@ namespace Guru.Editor } - + [Test] + public static void TEST_BuildVersionString() + { + var nowDate = new DateTime(2024, 8, 1, 0, 0, 0); + string strYear = nowDate.Year.ToString().Substring(2); + string strMon = nowDate.Month.ToString("00"); + string strDay = nowDate.Day.ToString("00"); + string strQuarter = ((nowDate.Hour * 60 + nowDate.Minute) / 15).ToString("00"); + // 2024-08-01 00:00:00 to version string: 24080100 + string strBuildNumber = $"{strYear}{strMon}{strDay}{strQuarter}"; + Debug.Log($"Get BuildVersion Code: {strBuildNumber}"); + } #endregion }