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
}