From ca0aaa5c81c4abe505e5b427f2addab37a7454ea Mon Sep 17 00:00:00 2001 From: liutao <821580467@qq.com> Date: Thu, 9 Apr 2026 13:41:00 +0800 Subject: [PATCH 01/23] =?UTF-8?q?=E3=80=90=E8=B5=84=E6=BA=90=E6=8B=86?= =?UTF-8?q?=E5=88=86=E3=80=91=E6=8B=86=E5=88=86=E9=80=BB=E8=BE=91=E8=B5=84?= =?UTF-8?q?=E6=BA=90=E5=92=8C=E9=85=8D=E7=BD=AE=E8=B5=84=E6=BA=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Assets/AssetBundleCollectorSetting.asset | 71 ++++++++----------- ProjectNLD/Assets/PhxhSDK | 2 +- 2 files changed, 30 insertions(+), 43 deletions(-) diff --git a/ProjectNLD/Assets/AssetBundleCollectorSetting.asset b/ProjectNLD/Assets/AssetBundleCollectorSetting.asset index de3249809fb..bba648689c4 100644 --- a/ProjectNLD/Assets/AssetBundleCollectorSetting.asset +++ b/ProjectNLD/Assets/AssetBundleCollectorSetting.asset @@ -17,7 +17,7 @@ MonoBehaviour: UniqueBundleName: 1 Packages: - PackageName: DefaultPackage - PackageDesc: + PackageDesc: "\u9ED8\u8BA4\u8D44\u6E90" EnableAddressable: 0 LocationToLower: 0 IncludeAssetGUID: 0 @@ -45,19 +45,6 @@ MonoBehaviour: FilterRuleName: CollectAll AssetTags: UserData: - - GroupName: Config_Common - GroupDesc: - AssetTags: - ActiveRuleName: EnableGroup - Collectors: - - CollectPath: Assets/Config - CollectorGUID: d3e5101ac58a142ff98b2bad4a50f203 - CollectorType: 0 - AddressRuleName: AddressByFileName - PackRuleName: PackGroup - FilterRuleName: CollectAll - AssetTags: - UserData: - GroupName: UI GroupDesc: AssetTags: @@ -119,27 +106,6 @@ MonoBehaviour: FilterRuleName: CollectAll AssetTags: UserData: - - GroupName: HotUpdateDlls - GroupDesc: - AssetTags: - ActiveRuleName: EnableGroup - Collectors: - - CollectPath: Assets/HotUpdateDlls/HotUpdateDll - CollectorGUID: fc0a59196e2c827448097ec5198b2901 - CollectorType: 0 - AddressRuleName: AddressByFileName - PackRuleName: PackGroup - FilterRuleName: CollectAll - AssetTags: - UserData: - - CollectPath: Assets/HotUpdateDlls/MetaDataDll - CollectorGUID: 9379cb20c9c63464da9daa6fe5375f00 - CollectorType: 0 - AddressRuleName: AddressByFileName - PackRuleName: PackGroup - FilterRuleName: CollectAll - AssetTags: - UserData: - GroupName: Scenes GroupDesc: AssetTags: @@ -396,7 +362,7 @@ MonoBehaviour: AssetTags: UserData: - PackageName: RawPackage - PackageDesc: + PackageDesc: "\u4EC5\u5F15\u7528\u8DEF\u5F84" EnableAddressable: 0 LocationToLower: 0 IncludeAssetGUID: 0 @@ -416,24 +382,45 @@ MonoBehaviour: FilterRuleName: CollectAll AssetTags: UserData: - - PackageName: TestPackage - PackageDesc: + - PackageName: DllPackage + PackageDesc: "\u903B\u8F91\u8D44\u6E90" EnableAddressable: 0 LocationToLower: 0 IncludeAssetGUID: 0 IgnoreDefaultType: 1 AutoCollectShaders: 1 Groups: - - GroupName: Test + - GroupName: Dll GroupDesc: AssetTags: ActiveRuleName: EnableGroup Collectors: - - CollectPath: Assets/_Test/Audio - CollectorGUID: 75b0d58bca322234fa3e6b6d82d8c93a + - CollectPath: Assets/HotUpdateDlls + CollectorGUID: 4625a9ccc1660174e8e6295de19639d7 CollectorType: 0 AddressRuleName: AddressByFileName PackRuleName: PackDirectory - FilterRuleName: CollectScene + FilterRuleName: CollectAll + AssetTags: + UserData: + - PackageName: ConfigPackage + PackageDesc: "\u914D\u7F6E\u8D44\u6E90" + EnableAddressable: 0 + LocationToLower: 0 + IncludeAssetGUID: 0 + IgnoreDefaultType: 1 + AutoCollectShaders: 1 + Groups: + - GroupName: Config + GroupDesc: + AssetTags: + ActiveRuleName: EnableGroup + Collectors: + - CollectPath: Assets/Config + CollectorGUID: d3e5101ac58a142ff98b2bad4a50f203 + CollectorType: 0 + AddressRuleName: AddressByFileName + PackRuleName: PackDirectory + FilterRuleName: CollectAll AssetTags: UserData: diff --git a/ProjectNLD/Assets/PhxhSDK b/ProjectNLD/Assets/PhxhSDK index 71b88fdc1bc..661b21853bb 160000 --- a/ProjectNLD/Assets/PhxhSDK +++ b/ProjectNLD/Assets/PhxhSDK @@ -1 +1 @@ -Subproject commit 71b88fdc1bc5f4d10e2c3addb35a184b9cfd3ca7 +Subproject commit 661b21853bb45bf55734d02aea7d5928993f6476 From e219ffe0b64e947272b6852e0089a92dc2f3e091 Mon Sep 17 00:00:00 2001 From: liutao <821580467@qq.com> Date: Thu, 9 Apr 2026 14:08:59 +0800 Subject: [PATCH 02/23] =?UTF-8?q?=E3=80=90=E8=B5=84=E6=BA=90=E6=8B=86?= =?UTF-8?q?=E5=88=86=E3=80=91=E6=8B=86=E5=88=86=E9=80=BB=E8=BE=91=E8=B5=84?= =?UTF-8?q?=E6=BA=90=E5=92=8C=E9=85=8D=E7=BD=AE=E8=B5=84=E6=BA=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ProjectNLD/Assets/PhxhSDK | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ProjectNLD/Assets/PhxhSDK b/ProjectNLD/Assets/PhxhSDK index 661b21853bb..3b7e1f3755c 160000 --- a/ProjectNLD/Assets/PhxhSDK +++ b/ProjectNLD/Assets/PhxhSDK @@ -1 +1 @@ -Subproject commit 661b21853bb45bf55734d02aea7d5928993f6476 +Subproject commit 3b7e1f3755c322bcf55859150e83b3ce3b229db4 From b3d9b807ed2187e3d044982d03833c003d8b7465 Mon Sep 17 00:00:00 2001 From: liutao <821580467@qq.com> Date: Thu, 9 Apr 2026 15:04:24 +0800 Subject: [PATCH 03/23] =?UTF-8?q?=E3=80=90=E6=89=93=E5=8C=85=E3=80=91?= =?UTF-8?q?=E4=BF=AE=E5=A4=8Dshader=E6=8A=A5=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Character/NLD_Charactor_Dead.shader | 9 ++++--- .../UI/Particle/UI_Particle_Base.shader | 26 +++++++++++-------- .../UI/Particle/UI_Particle_Polar.shader | 26 +++++++++++-------- .../UI/Particle/UI_Particle_Polar_Mask.shader | 20 +++++++------- 4 files changed, 46 insertions(+), 35 deletions(-) diff --git a/ProjectNLD/Assets/Code/Shaders/Character/NLD_Charactor_Dead.shader b/ProjectNLD/Assets/Code/Shaders/Character/NLD_Charactor_Dead.shader index 84a5d3cda8e..2829d411717 100644 --- a/ProjectNLD/Assets/Code/Shaders/Character/NLD_Charactor_Dead.shader +++ b/ProjectNLD/Assets/Code/Shaders/Character/NLD_Charactor_Dead.shader @@ -31,6 +31,7 @@ Shader "NLD_URP/NLD_Charactor_Dead" float3 normal : NORMAL; float4 tangent : TANGENT; float2 uv : TEXCOORD0; + UNITY_VERTEX_INPUT_INSTANCE_ID }; struct v2f @@ -38,7 +39,9 @@ Shader "NLD_URP/NLD_Charactor_Dead" float2 uv : TEXCOORD0; float4 positionHCS : SV_POSITION; float3 normalWS : TEXCOORD1; - float3 positionWS : TEXCOORD02; + float3 positionWS : TEXCOORD2; + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO }; TEXTURE2D(_MainTex); @@ -81,7 +84,7 @@ Shader "NLD_URP/NLD_Charactor_Dead" o.positionHCS = TransformObjectToHClip(v.positionOS.xyz); o.uv = TRANSFORM_TEX(v.uv, _MainTex); o.normalWS = TransformObjectToWorldNormal(v.normal); - o.positionWS = TransformObjectToWorld(v.positionOS); + o.positionWS = TransformObjectToWorld(v.positionOS.xyz); return o; } @@ -137,7 +140,7 @@ Shader "NLD_URP/NLD_Charactor_Dead" v2f vert (appdata v) { - v2f o; + v2f o = (v2f)0; UNITY_SETUP_INSTANCE_ID(v); UNITY_TRANSFER_INSTANCE_ID(v, o); UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); diff --git a/ProjectNLD/Assets/Code/Shaders/UI/Particle/UI_Particle_Base.shader b/ProjectNLD/Assets/Code/Shaders/UI/Particle/UI_Particle_Base.shader index cf2de42d2b8..7b3bbb9ab0b 100644 --- a/ProjectNLD/Assets/Code/Shaders/UI/Particle/UI_Particle_Base.shader +++ b/ProjectNLD/Assets/Code/Shaders/UI/Particle/UI_Particle_Base.shader @@ -106,7 +106,7 @@ float4 worldPosition : TEXCOORD1; #if _CUSTOMDATA_ON - float4 customData: TEXCOORD1; + float4 customData: TEXCOORD2; #endif UNITY_VERTEX_INPUT_INSTANCE_ID @@ -137,6 +137,10 @@ o.uv = v.uv; o.vColor = v.color * _BaseColor * _BaseColorScale; + #if _CUSTOMDATA_ON + o.customData = v.customData; + #endif + // #### required for RectMask2D #### o.worldPosition = v.positionOS; return o; @@ -148,16 +152,6 @@ UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(IN); const float time = _TimeParameters.x; - // #### required for RectMask2D #### - #ifdef UNITY_UI_CLIP_RECT - color.a *= UnityGet2DClipping(IN.worldPosition.xy, _ClipRect); - #endif - - // #### required for Mask #### - #ifdef UNITY_UI_ALPHACLIP - clip (color.a - 0.001); - #endif - // 主贴图UV流动 float2 uv = TRANSFORM_TEX(IN.uv, _BaseMap); @@ -173,6 +167,16 @@ float4 col = _BaseMap.Sample(sampler_BaseMap, uv); col *= IN.vColor; + // #### required for RectMask2D #### + #ifdef UNITY_UI_CLIP_RECT + col.a *= UnityGet2DClipping(IN.worldPosition.xy, _ClipRect); + #endif + + // #### required for Mask #### + #ifdef UNITY_UI_ALPHACLIP + clip (col.a - 0.001); + #endif + if (col.a < _AlphaClip) { discard; diff --git a/ProjectNLD/Assets/Code/Shaders/UI/Particle/UI_Particle_Polar.shader b/ProjectNLD/Assets/Code/Shaders/UI/Particle/UI_Particle_Polar.shader index 60c577e1a80..f39b1177c78 100644 --- a/ProjectNLD/Assets/Code/Shaders/UI/Particle/UI_Particle_Polar.shader +++ b/ProjectNLD/Assets/Code/Shaders/UI/Particle/UI_Particle_Polar.shader @@ -110,7 +110,7 @@ float4 worldPosition : TEXCOORD1; #if _CUSTOMDATA_ON - float4 customData: TEXCOORD1; + float4 customData: TEXCOORD2; #endif UNITY_VERTEX_INPUT_INSTANCE_ID @@ -145,6 +145,10 @@ o.uv = v.uv; o.vColor = v.color * _BaseColor * _BaseColorScale; + #if _CUSTOMDATA_ON + o.customData = v.customData; + #endif + // #### required for RectMask2D #### o.worldPosition = v.positionOS; return o; @@ -156,16 +160,6 @@ UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(IN); const float time = _TimeParameters.x; - // #### required for RectMask2D #### - #ifdef UNITY_UI_CLIP_RECT - color.a *= UnityGet2DClipping(IN.worldPosition.xy, _ClipRect); - #endif - - // #### required for Mask #### - #ifdef UNITY_UI_ALPHACLIP - clip (color.a - 0.001); - #endif - // 主贴图UV流动 float2 uv = TRANSFORM_TEX(IN.uv, _BaseMap); @@ -196,6 +190,16 @@ float4 col = _BaseMap.Sample(sampler_BaseMap, uv); col *= IN.vColor; + // #### required for RectMask2D #### + #ifdef UNITY_UI_CLIP_RECT + col.a *= UnityGet2DClipping(IN.worldPosition.xy, _ClipRect); + #endif + + // #### required for Mask #### + #ifdef UNITY_UI_ALPHACLIP + clip (col.a - 0.001); + #endif + if (col.a < _AlphaClip) { discard; diff --git a/ProjectNLD/Assets/Code/Shaders/UI/Particle/UI_Particle_Polar_Mask.shader b/ProjectNLD/Assets/Code/Shaders/UI/Particle/UI_Particle_Polar_Mask.shader index 3c73f492bfe..c9856f1fa17 100644 --- a/ProjectNLD/Assets/Code/Shaders/UI/Particle/UI_Particle_Polar_Mask.shader +++ b/ProjectNLD/Assets/Code/Shaders/UI/Particle/UI_Particle_Polar_Mask.shader @@ -179,16 +179,6 @@ UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(IN); const float time = _TimeParameters.x; - // #### required for RectMask2D #### - #ifdef UNITY_UI_CLIP_RECT - color.a *= UnityGet2DClipping(IN.worldPosition.xy, _ClipRect); - #endif - - // #### required for Mask #### - #ifdef UNITY_UI_ALPHACLIP - clip (color.a - 0.001); - #endif - // 主贴图UV流动 float2 uv = TRANSFORM_TEX(IN.uv, _BaseMap); @@ -231,6 +221,16 @@ #endif + // #### required for RectMask2D #### + #ifdef UNITY_UI_CLIP_RECT + col.a *= UnityGet2DClipping(IN.worldPosition.xy, _ClipRect); + #endif + + // #### required for Mask #### + #ifdef UNITY_UI_ALPHACLIP + clip (col.a - 0.001); + #endif + if (col.a < _AlphaClip) { discard; From 3dfa07a5ae5a6375f28cc5cae6002324c76da428 Mon Sep 17 00:00:00 2001 From: liutao <821580467@qq.com> Date: Thu, 9 Apr 2026 16:34:15 +0800 Subject: [PATCH 04/23] =?UTF-8?q?=E3=80=90=E6=89=93=E5=8C=85=E3=80=91?= =?UTF-8?q?=E4=BF=AE=E5=A4=8Dshader=E6=8A=A5=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Assets/Code/Shaders/UI/Particle/UI_Particle_Base.shader | 6 ++++++ .../Code/Shaders/UI/Particle/UI_Particle_Polar.shader | 6 ++++++ .../Code/Shaders/UI/Particle/UI_Particle_Polar_Mask.shader | 6 ++++++ 3 files changed, 18 insertions(+) diff --git a/ProjectNLD/Assets/Code/Shaders/UI/Particle/UI_Particle_Base.shader b/ProjectNLD/Assets/Code/Shaders/UI/Particle/UI_Particle_Base.shader index 7b3bbb9ab0b..892eb77b235 100644 --- a/ProjectNLD/Assets/Code/Shaders/UI/Particle/UI_Particle_Base.shader +++ b/ProjectNLD/Assets/Code/Shaders/UI/Particle/UI_Particle_Base.shader @@ -83,6 +83,12 @@ #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + inline float UnityGet2DClipping(float2 position, float4 clipRect) + { + float2 inside = step(clipRect.xy, position) * step(position, clipRect.zw); + return inside.x * inside.y; + } + struct appdata { float4 positionOS : POSITION; diff --git a/ProjectNLD/Assets/Code/Shaders/UI/Particle/UI_Particle_Polar.shader b/ProjectNLD/Assets/Code/Shaders/UI/Particle/UI_Particle_Polar.shader index f39b1177c78..083b22e8d74 100644 --- a/ProjectNLD/Assets/Code/Shaders/UI/Particle/UI_Particle_Polar.shader +++ b/ProjectNLD/Assets/Code/Shaders/UI/Particle/UI_Particle_Polar.shader @@ -87,6 +87,12 @@ #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + inline float UnityGet2DClipping(float2 position, float4 clipRect) + { + float2 inside = step(clipRect.xy, position) * step(position, clipRect.zw); + return inside.x * inside.y; + } + struct appdata { float4 positionOS : POSITION; diff --git a/ProjectNLD/Assets/Code/Shaders/UI/Particle/UI_Particle_Polar_Mask.shader b/ProjectNLD/Assets/Code/Shaders/UI/Particle/UI_Particle_Polar_Mask.shader index c9856f1fa17..c4d5157dc43 100644 --- a/ProjectNLD/Assets/Code/Shaders/UI/Particle/UI_Particle_Polar_Mask.shader +++ b/ProjectNLD/Assets/Code/Shaders/UI/Particle/UI_Particle_Polar_Mask.shader @@ -94,6 +94,12 @@ #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + inline float UnityGet2DClipping(float2 position, float4 clipRect) + { + float2 inside = step(clipRect.xy, position) * step(position, clipRect.zw); + return inside.x * inside.y; + } + struct appdata { float4 positionOS : POSITION; From 7f024eb24bf099d507d88f014585ce10abd14f9f Mon Sep 17 00:00:00 2001 From: liutao <821580467@qq.com> Date: Fri, 10 Apr 2026 11:11:37 +0800 Subject: [PATCH 05/23] =?UTF-8?q?=E3=80=90editor=E3=80=91=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E6=8A=A5=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Assets/Code/Scripts/Framework/Data/EditorTableManager.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ProjectNLD/Assets/Code/Scripts/Framework/Data/EditorTableManager.cs b/ProjectNLD/Assets/Code/Scripts/Framework/Data/EditorTableManager.cs index b9f9150311d..313c0b1f518 100644 --- a/ProjectNLD/Assets/Code/Scripts/Framework/Data/EditorTableManager.cs +++ b/ProjectNLD/Assets/Code/Scripts/Framework/Data/EditorTableManager.cs @@ -48,7 +48,7 @@ namespace Framework public static string GetLocalizeText(string key) { - var getValue = instance.tables.StringConfig.Get(key); + var getValue = instance.tables.StringConfig.GetOrDefault(key); if (getValue == null) { return key; From a27a9f6ecc58057d5badebaf23ac76df0ae58922 Mon Sep 17 00:00:00 2001 From: liutao <821580467@qq.com> Date: Fri, 10 Apr 2026 11:26:07 +0800 Subject: [PATCH 06/23] =?UTF-8?q?=E3=80=90=E7=83=AD=E6=9B=B4=E9=80=BB?= =?UTF-8?q?=E8=BE=91=E3=80=91=E4=BF=AE=E6=94=B9=E7=83=AD=E6=9B=B4=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ProjectNLD/Assets/Code/Scripts/HotUpdate/GameLauncher.cs | 2 +- ProjectNLD/Assets/PhxhSDK | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ProjectNLD/Assets/Code/Scripts/HotUpdate/GameLauncher.cs b/ProjectNLD/Assets/Code/Scripts/HotUpdate/GameLauncher.cs index 178504133b4..7ea62463d32 100644 --- a/ProjectNLD/Assets/Code/Scripts/HotUpdate/GameLauncher.cs +++ b/ProjectNLD/Assets/Code/Scripts/HotUpdate/GameLauncher.cs @@ -299,7 +299,7 @@ public class GameLauncher : MonoBehaviour Debug.Log("需要热更新,开始加载程序集"); _hybridCLRHelper = new HybridCLRHelper(); _hybridCLRHelper.SetDllList(AOTGenericReferences.PatchedAOTAssemblyList); - _hybridCLRHelper.RegistLoader(_simpleLoader); + _hybridCLRHelper.RegisterLoader(_simpleLoader); await _hybridCLRHelper.LoadAssemblies(); Debug.Log("加载程序集结束!"); diff --git a/ProjectNLD/Assets/PhxhSDK b/ProjectNLD/Assets/PhxhSDK index 3b7e1f3755c..ca6b57d4575 160000 --- a/ProjectNLD/Assets/PhxhSDK +++ b/ProjectNLD/Assets/PhxhSDK @@ -1 +1 @@ -Subproject commit 3b7e1f3755c322bcf55859150e83b3ce3b229db4 +Subproject commit ca6b57d45750b1ee4073520875620a990826d9c2 From 7d6d3f3c758b2eb2eccb7ba1f7c9dd8892d88e34 Mon Sep 17 00:00:00 2001 From: liutao <821580467@qq.com> Date: Fri, 10 Apr 2026 12:01:22 +0800 Subject: [PATCH 07/23] =?UTF-8?q?=E3=80=90=E6=89=93=E5=8C=85=E3=80=91?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=89=93=E5=8C=85=E6=B5=81=E7=A8=8B=E5=8F=8A?= =?UTF-8?q?=E8=A7=84=E5=88=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ProjectNLD/Assets/PhxhSDK | 2 +- .../jenkins_build_android_dev.groovy | 552 ++++++++++++++++++ Tool/build_tools | 2 +- 3 files changed, 554 insertions(+), 2 deletions(-) create mode 100644 Tool/build_env/jenkins_build_android_dev.groovy diff --git a/ProjectNLD/Assets/PhxhSDK b/ProjectNLD/Assets/PhxhSDK index ca6b57d4575..bdf307da1f8 160000 --- a/ProjectNLD/Assets/PhxhSDK +++ b/ProjectNLD/Assets/PhxhSDK @@ -1 +1 @@ -Subproject commit ca6b57d45750b1ee4073520875620a990826d9c2 +Subproject commit bdf307da1f8cb9f8bd4740d9158b22b8052274e4 diff --git a/Tool/build_env/jenkins_build_android_dev.groovy b/Tool/build_env/jenkins_build_android_dev.groovy new file mode 100644 index 00000000000..b720513f13d --- /dev/null +++ b/Tool/build_env/jenkins_build_android_dev.groovy @@ -0,0 +1,552 @@ +// 对应管线任务参数 +def PLATFORM_PARAM = "Android" +def PROFILE_PARAM = "Debug" +def APK_NAME = "NLDBuild.apk" + +// 构建时候的参数 +def CHANNEL_PARAM = params.Channel +def DEBUGBUILD_PARAM = params.DebugBuild +def HOTUPDATE_PARAM = params.Enable_Hot_Update +def AAB_PARAM = params.AAB +def OBFUZ = params.Obfuz +def DEV_PARAM = true +def ANDROIDKEYSTORE = "/Users/mayuanzheng/key/phxh_android.keystore" +def ANDROIDKEYALIAS = "avery" +def UPLOAD_SYMBOL = params.UploadSymbol +def PACKAGE_HARDENING = params.PackageHardening +def PackDefaultRes = params.PackDefaultRes +def PackDllRes = params.PackDllRes +def PackConfigRes = params.PackConfigRes + +// Jenkins 归档地址 +def ARTIFACT_URL = "http://${env.PHXH_BUILDER_IP_ADDRESS}:8080/job/${env.JOB_NAME}/" + +def VERSION_PARAM = "尚未获取" // 版本号 根据项目获取 +def OSS_UPLOAD_PATH_PARAM // 上传地址,根据项目获取 +def ASSETS_END_POINT_PARAM // Assets endPoint,根据项目获取 + +// 构建地址 +def BUILD_PATH +// 日志地址 +def log_path + +def GetRemote(){ + if('Dev' == params.Channel) + return 'feature/split_build'; + else + return params.Channel; +} + +def CheckRemoteBranchExists(repoUrl, branchName) { + def result = sh( + script: "git ls-remote --heads ${repoUrl} refs/heads/${branchName}", + returnStdout: true + ).trim() + + if (result == '') { + echo "警告: 远程分支 ${branchName} 不存在于 ${repoUrl}, 可以在GetRemote函数中添加映射, 或者检查分支名称是否正确" + return false + } + + echo "远程分支 ${branchName} 存在" + return true +} + +def SendMessageToWechat(message){ + if (!message) { + return } + def INNER_ROBOT="https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=3c92758c-1128-4931-ac8d-f19669d7befe" + sh "chmod +x $WORKSPACE/Tool/build_tools/send_wechat_message.sh" + sh "$WORKSPACE/Tool/build_tools/send_wechat_message.sh '${INNER_ROBOT}' '@all' '${message}'" +} + +def ParseBuildLogError(logPath){ + sh "chmod +x $WORKSPACE/Tool/build_tools/parse_unity_build_log.sh" + + // 转译 "\[Build Exception\]:" 取消使用 + // def exceptionFlag = '\\[Build Exception\\]:' + def errorMessage = sh(script: "${WORKSPACE}/Tool/build_tools/parse_unity_build_log.sh ${logPath} 'error CS' true true", returnStdout: true).trim() + def exceptionMessage = sh(script: "${WORKSPACE}/Tool/build_tools/parse_unity_build_log.sh ${logPath} 'Build Exception' false true", returnStdout: true).trim() + def sceneMessage = sh(script: "${WORKSPACE}/Tool/build_tools/parse_unity_build_log.sh ${logPath} 'Problem detected while' true true", returnStdout: true).trim() + def multipleMessage = sh(script: "${WORKSPACE}/Tool/build_tools/parse_unity_build_log.sh ${logPath} 'Multiple Unity' true false", returnStdout: true).trim() + def processSceneMessage = sh(script: "${WORKSPACE}/Tool/build_tools/parse_unity_build_log.sh ${logPath} 'Failed to process scene' true false", returnStdout: true).trim() + + SendMessageToWechat(errorMessage) + SendMessageToWechat(exceptionMessage) + SendMessageToWechat(sceneMessage) + SendMessageToWechat(multipleMessage) + SendMessageToWechat(processSceneMessage) +} + +pipeline { + agent any + stages { + stage('拉最新工程') { + steps { + script { + try { + def currentPath = sh(script: 'pwd', returnStdout: true).trim() + echo "cd ${currentPath}" + + // 1. 还原子模块修改 + def gitDirExists = sh(script: '[ -d ".git" ] && echo "true" || echo "false"', returnStdout: true).trim() + def scriptPathExists = fileExists("${WORKSPACE}/Tool/build_tools/git_revert_modules_modification.sh") + if (gitDirExists == 'true' && scriptPathExists) { + sh "chmod +x $WORKSPACE/Tool/build_tools/git_revert_modules_modification.sh" + sh "$WORKSPACE/Tool/build_tools/git_revert_modules_modification.sh $WORKSPACE" + } + + // 2. 拉取主项目代码 + def repoUrl = 'http://1.14.122.170:3000/PHXH/NLDClient.git' + def remote = GetRemote(); + echo "获取到分支名字:${remote}" + // 检查远程分支是否存在 + if (!CheckRemoteBranchExists(repoUrl, remote)) { + def message = "【${PLATFORM_PARAM}】【${VERSION_PARAM}】【Debug】【${CHANNEL_PARAM}】NLDClient 远程分支 ${remote} 不存在" + SendMessageToWechat(message) + error("Failure of the '拉最新工程' stage") + } + + echo "拉取分支:${remote}" + checkout scmGit( + branches: [[name: "*/${remote}"]], + extensions: [ + checkoutOption(60), + lfs(), + cloneOption(noTags: false, reference: '', shallow: false, timeout: 120), + submodule(recursiveSubmodules: true, reference: '', timeout: 1200) + ], + userRemoteConfigs: [[url: repoUrl]] + ) + + // 3. 删除旧 GamePlay_Dll 文件夹 + def gameplayDllPath = "${WORKSPACE}/ProjectNLD/Assets/Code/Scripts/GamePlay_Dll" + sh "if [ -d '${gameplayDllPath}' ]; then rm -rf '${gameplayDllPath}'; fi" + + // 4. 拉取 GamePlay 仓库 + def gameplayTargetPath = "${WORKSPACE}/ProjectNLD/Assets/Code/Scripts/GamePlay" + def gameplayUrl = "http://1.14.122.170:3000/PHXH/GamePlay.git" + def branch = GetRemote(); + // 检查远程分支是否存在 + if (!CheckRemoteBranchExists(gameplayUrl, branch)) { + def message = "【${PLATFORM_PARAM}】【${VERSION_PARAM}】【Debug】【${CHANNEL_PARAM}】GamePlay 远程分支 ${branch} 不存在" + SendMessageToWechat(message) + error("Failure of the '拉最新工程' stage") + } + + sh "chmod +x ${WORKSPACE}/Tool/build_tools/git_pull_gameplay.sh" + sh "$WORKSPACE/Tool/build_tools/git_pull_gameplay.sh ${gameplayTargetPath} ${gameplayUrl} ${branch}" + } catch (err) { + def message = "【${PLATFORM_PARAM}】【${VERSION_PARAM}】【Debug】【${CHANNEL_PARAM}】拉最新工程失败" + SendMessageToWechat(message) + error("Failure of the '拉最新工程' stage") + } + } + } + } + stage('获取项目配置') { + steps { + script { + try { + // 将项目相关配置复制到打包路径下 + sh "chmod +x $WORKSPACE/Tool/build_tools/copy_env.sh" + sh "$WORKSPACE/Tool/build_tools/copy_env.sh $WORKSPACE/Tool/build_env" + + // 将打包机器相关配置复制到打包路径下 + echo "copy local env file to $WORKSPACE" + sh "cp /Users/mayuanzheng/Builds/local_env.sh $WORKSPACE/Tool/build_tools/" + } catch (err) { + def message = "【${PLATFORM_PARAM}】【${VERSION_PARAM}】【Debug】【${CHANNEL_PARAM}】获取项目配置失败" + SendMessageToWechat(message) + error("Failure of the '获取项目配置' stage") + } + } + } + } + stage('修改渠道文件夹') { + steps { + script { + try { + // 先安装pyyaml + sh "pip3 install pyyaml --user" + // 调用python脚本修改渠道文件夹 + echo "根据 [${params.Channel}] 渠道修改文件夹" + def channelPath = "${WORKSPACE}/Tool/Channels/${CHANNEL_PARAM}" + def sdkPath = "${WORKSPACE}/Tool/sdk_packages" + echo "Channel Path: ${channelPath}" + echo "SDK Path: ${sdkPath}" + // python脚本: Tool/py_tools/PreHandle.py + sh "chmod +x $WORKSPACE/Tool/py_tools/PreHandle.py" + // 使用 returnStatus 获取脚本的退出码 + def pythonResult = sh(script: "python3 $WORKSPACE/Tool/py_tools/PreHandle.py ${sdkPath} ${channelPath} ${OBFUZ}", returnStatus: true) + if (pythonResult != 0) { + def message = "【${PLATFORM_PARAM}】【${VERSION_PARAM}】【Debug】【${CHANNEL_PARAM}】修改渠道文件夹失败: pythonResult=${pythonResult}" + SendMessageToWechat(message) + error("Failure of the '修改渠道文件夹' stage") + } + } catch (err) { + def message = "【${PLATFORM_PARAM}】【${VERSION_PARAM}】【Debug】【${CHANNEL_PARAM}】根据渠道修改工程失败" + SendMessageToWechat(message) + error("Failure of the '修改渠道文件夹' stage") + } + } + } + } + stage('根据渠道修改工程') { + steps { + script { + try { + echo "根据 [${params.Channel}] 渠道修改工程" + sh "chmod +x $WORKSPACE/Tool/build_tools/modify_project_by_channel.sh" + sh "$WORKSPACE/Tool/build_tools/modify_project_by_channel.sh $WORKSPACE ${CHANNEL_PARAM}" + } catch (err) { + def message = "【${PLATFORM_PARAM}】【${VERSION_PARAM}】【Debug】【${CHANNEL_PARAM}】根据渠道修改工程失败" + SendMessageToWechat(message) + error("Failure of the '根据渠道修改工程' stage") + } + } + } + } + stage('根据渠道获取相关参数') { + steps { + script { + try { + echo "根据 [${params.Channel}] 渠道获取相关参数" + def playersettings = "${WORKSPACE}/Tool/Channels/${CHANNEL_PARAM}/ChannelSetting.yaml" + // 1. 读取并解析 YAML,得到一个 Groovy Map + def cfg = readYaml(file: playersettings) + // 2. 提取字段 根据 YAML 键名取值 + VERSION_PARAM = (cfg?.Version ?: '').trim() + OSS_UPLOAD_PATH_PARAM = (cfg?.OssRemoteUploadPath ?: '').trim() + ASSETS_END_POINT_PARAM = (cfg?.AssetsEndPoint ?: '').trim() + // 3.其他数据 + BUILD_PATH = "Builds/$CHANNEL_PARAM/$PLATFORM_PARAM/$VERSION_PARAM" + log_path="$BUILD_PATH/build.log" + echo "获取到的版本是 ${VERSION_PARAM}, 获取到的上传地址是 ${OSS_UPLOAD_PATH_PARAM},获取到的assets-oss-endpoint是 ${ASSETS_END_POINT_PARAM}" + } catch (err) { + def message = "【${PLATFORM_PARAM}】【${VERSION_PARAM}】【Debug】【${CHANNEL_PARAM}】根据渠道获取相关参数失败" + SendMessageToWechat(message) + error("Failure of the '根据渠道获取相关参数' stage") + } + } + } + } + stage('获取构建版本号') { + steps { + script { + try { + def channelYamlPath = "${WORKSPACE}/Tool/Channels/${CHANNEL_PARAM}/ChannelSetting.yaml" + def versionCodeScript = "${WORKSPACE}/Tool/py_tools/version_code_manager.py" + + // 使用 python3 执行脚本,读取输出的 export 语句 + def exportLines = sh( + script: "python3 '${versionCodeScript}' '${CHANNEL_PARAM}' '${channelYamlPath}'", + returnStdout: true + ).trim() + echo "[BuildCode] 脚本输出: ${exportLines}" + + // 解析 NLD_CURRENT_VERSION_CODE=xxx 行 + def versionCodeLine = exportLines.split('\n').find { it.contains('NLD_CURRENT_VERSION_CODE') } + if (versionCodeLine) { + def versionCode = versionCodeLine.replaceAll('export NLD_CURRENT_VERSION_CODE=', '').trim() + echo "[BuildCode] 当前渠道=${CHANNEL_PARAM},versionCode=${versionCode}" + // 设置环境变量,供后续 stage 中的 shell 使用 + def safeChannel = CHANNEL_PARAM.replace('-', '_').replace(' ', '_') + env."NLD_CLIENT_${safeChannel}_VERSION_CODE" = versionCode + env.NLD_CURRENT_VERSION_CODE = versionCode + } else { + echo "[BuildCode] 警告: 未能解析 NLD_CURRENT_VERSION_CODE,将使用 YAML 中的 BuildCode" + } + } catch (err) { + echo "[BuildCode] 警告: 获取构建版本号失败: ${err},将使用 YAML 中的 BuildCode" + // 不中断流程,降级为使用 YAML 默认值 + } + } + } + } + stage('打包') { + steps { + sh "chmod +x $WORKSPACE/Tool/build_tools/build_unity.sh" + sh "chmod +x $WORKSPACE/Tool/build_tools/hot_update.sh" + script { + def build_result + if(params.Debug_AllLocal == true) + PROFILE_PARAM="AllLocal" + + if(params.Build_InitApp == false){ + build_result=sh(script: "$WORKSPACE/Tool/build_tools/hot_update.sh ${VERSION_PARAM} ${PLATFORM_PARAM} ${PROFILE_PARAM} ${CHANNEL_PARAM} ${HOTUPDATE_PARAM} ${DEBUGBUILD_PARAM} ${ANDROIDKEYSTORE} ${ANDROIDKEYALIAS} ${OBFUZ} ${PackDefaultRes} ${PackDllRes} ${PackConfigRes}", returnStatus: true, returnStdout: false) + log_path="$BUILD_PATH/UpdatePreviousBuild.log" + } + else + build_result=sh(script: "$WORKSPACE/Tool/build_tools/build_unity.sh ${VERSION_PARAM} ${PLATFORM_PARAM} ${PROFILE_PARAM} ${CHANNEL_PARAM} ${HOTUPDATE_PARAM} ${DEBUGBUILD_PARAM} ${AAB_PARAM} ${DEV_PARAM} ${ANDROIDKEYSTORE} ${ANDROIDKEYALIAS} ${OBFUZ} ${UPLOAD_SYMBOL} ${PackDefaultRes} ${PackDllRes} ${PackConfigRes}", returnStatus: true, returnStdout: false) + + def parse_log = "../../$log_path" + // 打包失败 + if(build_result != 0) + { + // 归档并分析日志 + archiveArtifacts artifacts: "$log_path" , followSymlinks: false + ParseBuildLogError(parse_log) + + def message = "【${PLATFORM_PARAM}】【${VERSION_PARAM}】【Debug】【${CHANNEL_PARAM}】构建失败" + SendMessageToWechat(message) + error("Failure of the '打包' stage") + } + // 保底捕捉一次 Build Finished, Result: Failure. + else{ + sh "chmod +x $WORKSPACE/Tool/build_tools/check_unity_build_result.sh" + def check_result = sh(script: "sh $WORKSPACE/Tool/build_tools/check_unity_build_result.sh ${parse_log}", returnStatus: true) + if (check_result != 0) { + // 归档日志 + archiveArtifacts artifacts: "$log_path" , followSymlinks: false + def message = "【${PLATFORM_PARAM}】【${VERSION_PARAM}】【Debug】【${CHANNEL_PARAM}】构建失败 日志捕捉到 Build Finished, Result: Failure." + SendMessageToWechat(message) + error("Failure of the '打包' stage") + } + } + } + } + } + stage('加密应用') { + steps { + script { + if (PACKAGE_HARDENING == true) { + // 只在构建完整应用时进行加密 + echo "params.Build_InitApp: ${params.Build_InitApp}" + echo "WORKSPACE: ${WORKSPACE}" + if (params.Build_InitApp == true) { + try { + // 确保CHANNEL_PARAM是正确的渠道名称 + def actualChannel = CHANNEL_PARAM ?: "Dev" + echo "Actual channel: ${actualChannel}" + + // 构建YAML文件路径,添加备选路径 + def playersettings = "${WORKSPACE}/Tool/Channels/${actualChannel}/ChannelSetting.yaml" + def fallbackPlayersettings = "d:/UnityProjects/NLDClient/Tool/Channels/${actualChannel}/ChannelSetting.yaml" + + // 选择存在的YAML文件路径 + def finalPlayersettings + if (fileExists(playersettings)) { + finalPlayersettings = playersettings + } else if (fileExists(fallbackPlayersettings)) { + finalPlayersettings = fallbackPlayersettings + } else { + echo "Warning: Both YAML paths not found. Using default: ${playersettings}" + finalPlayersettings = playersettings + } + + // 添加调试信息 + echo "playersettings path: ${finalPlayersettings}" + echo "File exists: ${fileExists(finalPlayersettings)}" + + // 读取YAML文件,添加错误处理 + def cfg + try { + cfg = readYaml(file: finalPlayersettings) + echo "YAML content: ${cfg}" + } catch (yamlErr) { + echo "Error reading YAML: ${yamlErr.getMessage()}" + // 尝试使用另一种方式读取YAML + def yamlContent = readFile(finalPlayersettings) + echo "Raw YAML content: ${yamlContent}" + error "Failed to parse YAML file" + } + + // 读取加密相关配置 + def encryptConfig = cfg?.Encryption + echo "encryptConfig: ${encryptConfig}" + if (encryptConfig) { + def apiUrl = (encryptConfig?.ApiUrl ?: '').trim() + def strategyName = (encryptConfig?.StrategyName ?: '').trim() + def username = (encryptConfig?.Username ?: '').trim() + def password = (encryptConfig?.Password ?: '').trim() + def toolPath = (encryptConfig?.ToolPath ?: '').trim() + def needSign = (encryptConfig?.NeedSign ?: true) + def signName = (encryptConfig?.SignName ?: '').trim() + def signVersion = (encryptConfig?.SignVersion ?: 4) + def retryCount = (encryptConfig?.RetryCount ?: 3) + + // 构建APK路径 + def apkPath = "$WORKSPACE/Builds/$CHANNEL_PARAM/$PLATFORM_PARAM/$VERSION_PARAM/$APK_NAME" + def outputDir = "$WORKSPACE/Builds/$CHANNEL_PARAM/$PLATFORM_PARAM/$VERSION_PARAM" + + // 替换WORKSPACE变量 + toolPath = toolPath.replace('${WORKSPACE}', WORKSPACE) + + // 构建加密命令 + def encryptCmd = "java -jar '${toolPath}' -t apk -u '${apiUrl}' -r '${username}' -w '${password}' -k '${apkPath}' -s '${strategyName}' -d '${outputDir}' -n '${APK_NAME}' -y ${retryCount}" + + // 添加签名参数 + if (needSign) { + encryptCmd += " -i true -g '${signName}' -v ${signVersion}" + } + + echo "开始加密应用..." + echo "APK路径: ${apkPath}" + echo "加密策略: ${strategyName}" + echo "执行命令: ${encryptCmd}" + + // 执行加密命令 + def encryptResult = sh(script: encryptCmd, returnStatus: true, returnStdout: false) + + if (encryptResult != 0) { + def message = "【${PLATFORM_PARAM}】【${VERSION_PARAM}】【Debug】【${CHANNEL_PARAM}】应用加密失败" + SendMessageToWechat(message) + error("Failure of the '加密应用' stage") + } else { + echo "应用加密成功!加密后的APK已覆盖原APK。" + } + } else { + echo "警告:未在渠道配置中找到加密相关配置,跳过加密步骤。" + } + } catch (err) { + def message = "【${PLATFORM_PARAM}】【${VERSION_PARAM}】【Debug】【${CHANNEL_PARAM}】应用加密过程中发生异常: ${err.getMessage()}" + SendMessageToWechat(message) + error("Failure of the '加密应用' stage") + } + } else { + echo "增量更新模式,跳过加密步骤。" + } + } else { + echo "PackageHardening 未启用,跳过加密步骤。" + } + } + } + } + stage('上传资源') { + steps { + script { + def asset_path="$WORKSPACE/ProjectNLD/ServerData/${PLATFORM_PARAM}" + def upload_path="${OSS_UPLOAD_PATH_PARAM}/${CHANNEL_PARAM}/${PLATFORM_PARAM}/${VERSION_PARAM}" + + if(params.Upload_Incremental == true) + { + def upload_incremental_result=0 + def last_manifest_path="$WORKSPACE/ProjectNLD/ServerData/LastManifests/${CHANNEL_PARAM}" + sh "chmod +x $WORKSPACE/Tool/build_tools/upload_incremental_oss.sh" + upload_incremental_result = sh(script: "$WORKSPACE/Tool/build_tools/upload_incremental_oss.sh ${asset_path} ${upload_path} ${ASSETS_END_POINT_PARAM} ${last_manifest_path}", returnStatus: true, returnStdout: false) + if(upload_incremental_result != 0) + { + def message = "【${PLATFORM_PARAM}】【${VERSION_PARAM}】【Debug】【${CHANNEL_PARAM}】上传资源失败" + SendMessageToWechat(message) + error("Failure of the '上传资源' stage") + } + } + else + { + sh "chmod +x $WORKSPACE/Tool/build_tools/upload_oss.sh" + def upload_result=0 + upload_result = sh(script: "$WORKSPACE/Tool/build_tools/upload_oss.sh ${asset_path} ${upload_path} ${ASSETS_END_POINT_PARAM}", returnStatus: true, returnStdout: false) + if(upload_result != 0) + { + def message = "【${PLATFORM_PARAM}】【${VERSION_PARAM}】【Debug】【${CHANNEL_PARAM}】上传资源失败" + SendMessageToWechat(message) + error("Failure of the '上传资源' stage") + } + } + + } + } + } + /*stage('上传apk') { + steps { + script { + // 增量更新不需要上传包体 + if (params.Build_InitApp == true){ + def apk_path="$WORKSPACE/Builds/$CHANNEL_PARAM/$PLATFORM_PARAM/$VERSION_PARAM/$APK_NAME" + def upload_path="${OSS_UPLOAD_PATH_PARAM}/${CHANNEL_PARAM}/${PLATFORM_PARAM}/" + def upload_path_with_version="${OSS_UPLOAD_PATH_PARAM}/${CHANNEL_PARAM}/${PLATFORM_PARAM}/${VERSION_PARAM}/" + def upload_result=0 + def upload_result_with_version=0 + + upload_result=sh(script: "$WORKSPACE/Tool/build_tools/upload_oss.sh ${apk_path} ${upload_path} ${ASSETS_END_POINT_PARAM}", returnStatus: true, returnStdout: false) + upload_result_with_version=sh(script: "$WORKSPACE/Tool/build_tools/upload_oss.sh ${apk_path} ${upload_path_with_version} ${ASSETS_END_POINT_PARAM}", returnStatus: true, returnStdout: false) + + if(upload_result != 0 || upload_result_with_version != 0) + { + def message = "【${PLATFORM_PARAM}】【${VERSION_PARAM}】【Debug】【${CHANNEL_PARAM}】上传APK失败" + SendMessageToWechat(message) + error("Failure of the '上传apk' stage") + } + } + } + } + } + stage('上传符号表') { + steps { + script { + if(UPLOAD_SYMBOL == true) + { + // 增量更新不需要上传符号表 + sh "chmod +x $WORKSPACE/Tool/build_tools/upload_symbol_file.sh" + sh "chmod +x $WORKSPACE/Tool/build_tools/upload_symbol_file_firebase.sh" + if (params.Build_InitApp == true){ + def playersettings = "${WORKSPACE}/Tool/Channels/${CHANNEL_PARAM}/ChannelSetting.yaml" + def cfg = readYaml(file: playersettings) + def symbol_path="$WORKSPACE/Builds/$CHANNEL_PARAM/$PLATFORM_PARAM/$VERSION_PARAM" + def upload_result=0 + if('GoogleDev' == params.Channel) + { + def FIREBASE_APP_ID = (cfg?.FIREBASE_APP_ID ?: '').trim() + echo "获取到的Firebase App ID ${FIREBASE_APP_ID}" + upload_result = sh(script: "$WORKSPACE/Tool/build_tools/upload_symbol_file_firebase.sh ${VERSION_PARAM} ${symbol_path} ${FIREBASE_APP_ID}", returnStatus: true, returnStdout: false) + } + else + { + def crashsightConfig = cfg?."CrashSight_${PLATFORM_PARAM}" + def crashsightId = (crashsightConfig?.id ?: '').trim() + def crashsightKey = (crashsightConfig?.key ?: '').trim() + upload_result = sh(script: "$WORKSPACE/Tool/build_tools/upload_symbol_file.sh ${VERSION_PARAM} ${PLATFORM_PARAM} ${symbol_path} ${crashsightId} ${crashsightKey}", returnStatus: true, returnStdout: false) + } + if(upload_result != 0) + { + def message = "【${PLATFORM_PARAM}】【${VERSION_PARAM}】【Debug】【${CHANNEL_PARAM}】上传符号表异常" + SendMessageToWechat(message) + } + } + } + } + } + }*/ + stage('发布debug版本号') { + steps { + script { + if (params.Build_InitApp == true){ + sh "chmod +x $WORKSPACE/Tool/build_tools/debug_send_version.sh" + def result=0 + result = sh(script: "$WORKSPACE/Tool/build_tools/debug_send_version.sh") + } + } + } + } + stage('归档') { + steps { + script { + try{ + archiveArtifacts artifacts: "$log_path" , followSymlinks: false + if (params.Build_InitApp == true) + archiveArtifacts artifacts: "$BUILD_PATH/*.apk" , followSymlinks: false + } + catch(Exception e){ + SendMessageToWechat(e.message + "\r\n" + e.stackTrace) + currentBuild.result = 'FAILURE' + return + } + } + } + } + stage('通知') { + steps { + script { + if (params.Build_InitApp == true) { + def message = "【${PLATFORM_PARAM}】【${VERSION_PARAM}】【Debug】【${CHANNEL_PARAM}】客户端打包上传成功!下载链接:${ARTIFACT_URL}" + SendMessageToWechat(message) + } else { + def message = "【${PLATFORM_PARAM}】【${VERSION_PARAM}】【Debug】【${CHANNEL_PARAM}】客户端增量更新上传成功!下载链接:${ARTIFACT_URL}" + SendMessageToWechat(message) + } + } + } + } + } +} \ No newline at end of file diff --git a/Tool/build_tools b/Tool/build_tools index dba595d9c6e..34a565305a0 160000 --- a/Tool/build_tools +++ b/Tool/build_tools @@ -1 +1 @@ -Subproject commit dba595d9c6e380b32afb9b6032380616d6df7e87 +Subproject commit 34a565305a05419f893d18702b66e0fdc049625c From 8e02bfead03ec7f2626035a046bd0b271017e46b Mon Sep 17 00:00:00 2001 From: liutao <821580467@qq.com> Date: Fri, 10 Apr 2026 13:27:30 +0800 Subject: [PATCH 08/23] =?UTF-8?q?=E3=80=90=E6=89=93=E5=8C=85=E3=80=91?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=89=93=E5=8C=85=E6=B5=81=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Assets/Editor/Common/BuildLauncher.cs | 52 +++++++++++++------ ProjectNLD/Assets/PhxhSDK | 2 +- 2 files changed, 37 insertions(+), 17 deletions(-) diff --git a/ProjectNLD/Assets/Editor/Common/BuildLauncher.cs b/ProjectNLD/Assets/Editor/Common/BuildLauncher.cs index c5d1164e855..a2683a16f82 100644 --- a/ProjectNLD/Assets/Editor/Common/BuildLauncher.cs +++ b/ProjectNLD/Assets/Editor/Common/BuildLauncher.cs @@ -128,7 +128,6 @@ internal class BatchBuild thinkingDataAppId = YooAssetBuildBase.thinkingDataAppId, thinkingDataServerUrl = YooAssetBuildBase.thinkingDataServerUrl, }; - PackDataInst.CreateResourceJson(info); BuildTargetGroup currentTargetGroup = BuildPipeline.GetBuildTargetGroup(EditorUserBuildSettings.activeBuildTarget); @@ -139,12 +138,24 @@ internal class BatchBuild #if DEVELOPMENT_BUILD || DEBUG isDebugBuild = true; #endif - ExtBuildInfoHelper.CreateFirstExtBuildInfo(info.buildTicks, info.workSpace, info.version, info.buildCode, - isDebugBuild, defines); + var extBuildInfo = ExtBuildInfoHelper.PrepareFullBuildInfo( + info.buildTicks, + info.workSpace, + info.version, + info.buildCode, + isDebugBuild, + defines, + YooAssetBuildBase.ShouldPackDefaultRes(), + YooAssetBuildBase.ShouldPackDllRes(), + YooAssetBuildBase.ShouldPackConfigRes()); + info.localFullVersion = extBuildInfo.ComposeResVersion(); + PackDataInst.CreateResourceJson(info); BuildLauncher.SetEnableHotUpdate(enableHotUpdate); - if (enableHotUpdate) + if (YooAssetBuildBase.ShouldBuildHotUpdateDll()) BuildLauncher.BuildHotUpdateDlls(); + else if (enableHotUpdate) + Debug.Log("检测到 packDllRes=false,已跳过热更新 DLL 重编步骤,将沿用上次已生成的 DLL 资源。"); YooAssetBuildBase.BuildContentAndPlayer(); @@ -228,9 +239,25 @@ internal class BatchBuild ExtBuildInfoHelper.VertifyExitBuildInfo(YooAssetBuildBase.workSpace, YooAssetBuildBase.appVersion); DebugUtil.Log($"验证ExBuildInfo完成:{DateTime.Now}"); + BuildTargetGroup currentTargetGroup = BuildPipeline.GetBuildTargetGroup(EditorUserBuildSettings.activeBuildTarget); + string defines = PlayerSettings.GetScriptingDefineSymbolsForGroup(currentTargetGroup); + + ExtBuildInfoHelper.PrepareHotUpdateBuildInfo( + YooAssetBuildBase.workSpace, + YooAssetBuildBase.appVersion, +#if DEVELOPMENT_BUILD || DEBUG + true, +#else + false, +#endif + defines, + YooAssetBuildBase.ShouldPackDefaultRes(), + YooAssetBuildBase.ShouldPackDllRes(), + YooAssetBuildBase.ShouldPackConfigRes()); + var skipCheck = true; - if (enableHotUpdate) + if (YooAssetBuildBase.ShouldBuildHotUpdateDll()) { if (skipCheck) { @@ -255,22 +282,15 @@ internal class BatchBuild } } + else if (enableHotUpdate) + { + Debug.Log("检测到 packDllRes=false,已跳过热更新 DLL 重编步骤,将沿用上次已生成的 DLL 资源。"); + } else { Debug.Log("未开启热更"); } - BuildTargetGroup currentTargetGroup = BuildPipeline.GetBuildTargetGroup(EditorUserBuildSettings.activeBuildTarget); - string defines = PlayerSettings.GetScriptingDefineSymbolsForGroup(currentTargetGroup); - - // 写入打包信息到Yoo_Build_Cache -#if DEVELOPMENT_BUILD || DEBUG - ExtBuildInfoHelper.UpdateExtBuildInfo(YooAssetBuildBase.workSpace, YooAssetBuildBase.appVersion, true, - defines); -#else - ExtBuildInfoHelper.UpdateExtBuildInfo(YooAssetBuildBase.workSpace, YooAssetBuildBase.appVersion, false, defines); -#endif - DebugUtil.Log($"开始打包热更资源:{DateTime.Now}"); bool result = YooAssetBuildBase.BuildOnlyResUpdate(); DebugUtil.Log($"打包热更资源完成:{DateTime.Now}"); diff --git a/ProjectNLD/Assets/PhxhSDK b/ProjectNLD/Assets/PhxhSDK index bdf307da1f8..8ef16e625b6 160000 --- a/ProjectNLD/Assets/PhxhSDK +++ b/ProjectNLD/Assets/PhxhSDK @@ -1 +1 @@ -Subproject commit bdf307da1f8cb9f8bd4740d9158b22b8052274e4 +Subproject commit 8ef16e625b609ff66d6ccb8bbfaa060bb022eeca From bf76498f34ad3e53481e04d8594aaaa79461bb1d Mon Sep 17 00:00:00 2001 From: liutao <821580467@qq.com> Date: Fri, 10 Apr 2026 13:29:03 +0800 Subject: [PATCH 09/23] =?UTF-8?q?=E3=80=90=E6=89=93=E5=8C=85=E3=80=91?= =?UTF-8?q?=E7=83=AD=E6=9B=B4=E5=BF=85=E9=A1=BB=E5=BE=97=E5=BC=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Tool/build_env/jenkins_build_android_dev.groovy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tool/build_env/jenkins_build_android_dev.groovy b/Tool/build_env/jenkins_build_android_dev.groovy index b720513f13d..fb48f1db51b 100644 --- a/Tool/build_env/jenkins_build_android_dev.groovy +++ b/Tool/build_env/jenkins_build_android_dev.groovy @@ -6,7 +6,7 @@ def APK_NAME = "NLDBuild.apk" // 构建时候的参数 def CHANNEL_PARAM = params.Channel def DEBUGBUILD_PARAM = params.DebugBuild -def HOTUPDATE_PARAM = params.Enable_Hot_Update +def HOTUPDATE_PARAM = true def AAB_PARAM = params.AAB def OBFUZ = params.Obfuz def DEV_PARAM = true From 21656b83a478332fe3653c80bab6d9d1e6be6ba9 Mon Sep 17 00:00:00 2001 From: liutao <821580467@qq.com> Date: Fri, 10 Apr 2026 14:24:03 +0800 Subject: [PATCH 10/23] =?UTF-8?q?=E3=80=90=E6=89=93=E5=8C=85=E3=80=91?= =?UTF-8?q?=E8=B0=83=E6=95=B4=E6=89=93=E5=8C=85=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ProjectNLD/Assets/PhxhSDK | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ProjectNLD/Assets/PhxhSDK b/ProjectNLD/Assets/PhxhSDK index 8ef16e625b6..0c0ea8f80b1 160000 --- a/ProjectNLD/Assets/PhxhSDK +++ b/ProjectNLD/Assets/PhxhSDK @@ -1 +1 @@ -Subproject commit 8ef16e625b609ff66d6ccb8bbfaa060bb022eeca +Subproject commit 0c0ea8f80b15074b6043b917d6e005a14c88be3c From 4a2230bfb1854d05952f5f310bad7bcfaeadeb0f Mon Sep 17 00:00:00 2001 From: liutao <821580467@qq.com> Date: Fri, 10 Apr 2026 15:58:52 +0800 Subject: [PATCH 11/23] =?UTF-8?q?=E3=80=90=E6=89=93=E5=8C=85=E3=80=91?= =?UTF-8?q?=E7=A7=BB=E9=99=A4=E6=97=A0=E7=94=A8=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Assets/Code/Scripts/HotUpdate/UI/TempUIHandle.cs | 10 ---------- ProjectNLD/Assets/PhxhSDK | 2 +- ProjectNLD/Assets/Scenes/GameLauncher.unity | 8 ++++---- 3 files changed, 5 insertions(+), 15 deletions(-) diff --git a/ProjectNLD/Assets/Code/Scripts/HotUpdate/UI/TempUIHandle.cs b/ProjectNLD/Assets/Code/Scripts/HotUpdate/UI/TempUIHandle.cs index 3acb7e1dead..a81f588d3e5 100644 --- a/ProjectNLD/Assets/Code/Scripts/HotUpdate/UI/TempUIHandle.cs +++ b/ProjectNLD/Assets/Code/Scripts/HotUpdate/UI/TempUIHandle.cs @@ -24,16 +24,6 @@ namespace HotUpdate.UI return TempUpdateUI.Instance.isClickOk; } - public void ShowVersion(string aotVersion, string curResVersion, string newResVersion) - { - TempUpdateUI.Instance.m_TextAotVersion.text = aotVersion; - TempUpdateUI.Instance.m_TextCurResVersion.text = curResVersion; - TempUpdateUI.Instance.m_TextNewResVersion.text = newResVersion; - TempUpdateUI.Instance.m_TextAotVersion.gameObject.SetActive(true); - TempUpdateUI.Instance.m_TextCurResVersion.gameObject.SetActive(true); - TempUpdateUI.Instance.m_TextNewResVersion.gameObject.SetActive(true); - } - public void ShowVersion(string curAotVersion, string workSpace, string curResVersion, string newResVersion, string serverName) { string aotVersion = string.Format(LocalizeMono.Instance.GetLocalizeText("AotVersionInfo"), curAotVersion, workSpace, serverName); // 游戏版本:{0},渠道:{1},服务器:{2} diff --git a/ProjectNLD/Assets/PhxhSDK b/ProjectNLD/Assets/PhxhSDK index 0c0ea8f80b1..53d2790c1c8 160000 --- a/ProjectNLD/Assets/PhxhSDK +++ b/ProjectNLD/Assets/PhxhSDK @@ -1 +1 @@ -Subproject commit 0c0ea8f80b15074b6043b917d6e005a14c88be3c +Subproject commit 53d2790c1c8f41f3f46b4119101f33e1f810b967 diff --git a/ProjectNLD/Assets/Scenes/GameLauncher.unity b/ProjectNLD/Assets/Scenes/GameLauncher.unity index 1d80d12b025..c415f5e2aea 100644 --- a/ProjectNLD/Assets/Scenes/GameLauncher.unity +++ b/ProjectNLD/Assets/Scenes/GameLauncher.unity @@ -906,7 +906,7 @@ RectTransform: m_AnchorMin: {x: 1, y: 0} m_AnchorMax: {x: 1, y: 0} m_AnchoredPosition: {x: 950, y: -531} - m_SizeDelta: {x: 1000, y: 35.3} + m_SizeDelta: {x: 1500, y: 35.3} m_Pivot: {x: 1, y: 0} --- !u!114 &1084087109 MonoBehaviour: @@ -972,7 +972,7 @@ MonoBehaviour: m_lineSpacingMax: 0 m_paragraphSpacing: 0 m_charWidthMaxAdj: 0 - m_enableWordWrapping: 1 + m_enableWordWrapping: 0 m_wordWrappingRatios: 0.4 m_overflowMode: 0 m_linkedTextComponent: {fileID: 0} @@ -1269,7 +1269,7 @@ RectTransform: m_AnchorMin: {x: 1, y: 0} m_AnchorMax: {x: 1, y: 0} m_AnchoredPosition: {x: 950, y: -501.0017} - m_SizeDelta: {x: 1000, y: 35.3} + m_SizeDelta: {x: 1500, y: 35.3} m_Pivot: {x: 1, y: 0} --- !u!114 &1202956216 MonoBehaviour: @@ -1335,7 +1335,7 @@ MonoBehaviour: m_lineSpacingMax: 0 m_paragraphSpacing: 0 m_charWidthMaxAdj: 0 - m_enableWordWrapping: 1 + m_enableWordWrapping: 0 m_wordWrappingRatios: 0.4 m_overflowMode: 0 m_linkedTextComponent: {fileID: 0} From 0e86ad96d6cf95ade7e54f7f54c42d7ff984898f Mon Sep 17 00:00:00 2001 From: liutao <821580467@qq.com> Date: Fri, 10 Apr 2026 16:14:21 +0800 Subject: [PATCH 12/23] =?UTF-8?q?=E3=80=90=E5=90=AF=E5=8A=A8=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E3=80=91=E4=BC=98=E5=8C=96=E7=89=88=E6=9C=AC=E5=8F=B7?= =?UTF-8?q?=E6=98=BE=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ProjectNLD/Assets/PhxhSDK | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ProjectNLD/Assets/PhxhSDK b/ProjectNLD/Assets/PhxhSDK index 53d2790c1c8..091c61b2886 160000 --- a/ProjectNLD/Assets/PhxhSDK +++ b/ProjectNLD/Assets/PhxhSDK @@ -1 +1 @@ -Subproject commit 53d2790c1c8f41f3f46b4119101f33e1f810b967 +Subproject commit 091c61b288649b454ea1651b5695d3d17d2a37b2 From e67d0cdb6bb361011d2e4cb1085fcee909768c9b Mon Sep 17 00:00:00 2001 From: liutao <821580467@qq.com> Date: Fri, 10 Apr 2026 16:29:55 +0800 Subject: [PATCH 13/23] =?UTF-8?q?=E3=80=90=E5=90=AF=E5=8A=A8=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E3=80=91=E4=BC=98=E5=8C=96=E7=89=88=E6=9C=AC=E6=98=BE?= =?UTF-8?q?=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Code/Scripts/HotUpdate/GameLauncher.cs | 82 ++++++++++++++++++- 1 file changed, 79 insertions(+), 3 deletions(-) diff --git a/ProjectNLD/Assets/Code/Scripts/HotUpdate/GameLauncher.cs b/ProjectNLD/Assets/Code/Scripts/HotUpdate/GameLauncher.cs index 7ea62463d32..5cddebbfdb0 100644 --- a/ProjectNLD/Assets/Code/Scripts/HotUpdate/GameLauncher.cs +++ b/ProjectNLD/Assets/Code/Scripts/HotUpdate/GameLauncher.cs @@ -24,6 +24,8 @@ using UnityEngine.Android; public class GameLauncher : MonoBehaviour { + private const string VersionDisplayPlaceholder = "----"; + #if USE_OBFUZ private static bool _isSetUpStaticSecret = false; /// @@ -217,7 +219,9 @@ public class GameLauncher : MonoBehaviour UpdateLocalInfo localInfo = PackDataInst.Inst.localInfo; string acquiring = LocalizeMono.Instance.GetLocalizeText("Acquiring"); // 获取中... - versionUpdateUI.ShowVersion(Application.version, localInfo.workSpace, localInfo.localFullVersion, acquiring, acquiring); + string displayLocalVersion = FormatVersionForDisplay(localInfo.localFullVersion); + Debug.Log("[LTRes]GameLauncher - ShowVersion关键日志 stage=LaunchInit, fullOldVersion=" + localInfo.localFullVersion + ", fullNewVersion=" + acquiring + ", displayOldVersion=" + displayLocalVersion + ", displayNewVersion=" + acquiring + ", serverName=" + acquiring); + versionUpdateUI.ShowVersion(Application.version, localInfo.workSpace, displayLocalVersion, acquiring, acquiring); BIToolinAOT.Instance.Init();//TalkingData初始化 try @@ -250,7 +254,9 @@ public class GameLauncher : MonoBehaviour downloadResult = await PreConfig.instance.DownloadConfig(); versionUpdateUI.UpdateProgressText(LocalizeMono.Instance.GetLocalizeText("RequestConfigurationComplete")); // 请求APPConfig结束 - versionUpdateUI.ShowVersion(Application.version, localInfo.workSpace, localInfo.localFullVersion, acquiring, PreConfig.instance.ServerName); + string displayLocalVersionAfterConfig = FormatVersionForDisplay(localInfo.localFullVersion); + Debug.Log("[LTRes]GameLauncher - ShowVersion关键日志 stage=ConfigReady, fullOldVersion=" + localInfo.localFullVersion + ", fullNewVersion=" + acquiring + ", displayOldVersion=" + displayLocalVersionAfterConfig + ", displayNewVersion=" + acquiring + ", serverName=" + PreConfig.instance.ServerName); + versionUpdateUI.ShowVersion(Application.version, localInfo.workSpace, displayLocalVersionAfterConfig, acquiring, PreConfig.instance.ServerName); BIToolinAOT.Instance.TrackEventInAOT("app_config_response", new System.Collections.Generic.Dictionary(){ {"result", downloadResult? 0 : 1 } }); @@ -378,6 +384,76 @@ public class GameLauncher : MonoBehaviour { realProgess = progress; } + + private static string FormatVersionForDisplay(string fullVersion) + { + if (string.IsNullOrWhiteSpace(fullVersion)) + return VersionDisplayPlaceholder; + + if (string.Equals(fullVersion, "unknown", StringComparison.OrdinalIgnoreCase)) + return fullVersion; + + try + { + string defaultVersion = null; + string dllVersion = null; + string configVersion = null; + + string[] segments = fullVersion.Split('|'); + foreach (string segment in segments) + { + if (string.IsNullOrWhiteSpace(segment)) + continue; + + string[] keyValue = segment.Split(new[] { ':' }, 2); + if (keyValue.Length != 2) + continue; + + string key = keyValue[0].Trim(); + string value = keyValue[1].Trim(); + if (string.IsNullOrEmpty(value)) + continue; + + if (string.Equals(key, "default", StringComparison.OrdinalIgnoreCase)) + { + defaultVersion = value; + } + else if (string.Equals(key, "dll", StringComparison.OrdinalIgnoreCase)) + { + dllVersion = value; + } + else if (string.Equals(key, "config", StringComparison.OrdinalIgnoreCase)) + { + configVersion = value; + } + } + + if (defaultVersion == null && dllVersion == null && configVersion == null) + return fullVersion; + + return string.Join("-", new[] + { + ToShortVersionSegment(defaultVersion), + ToShortVersionSegment(dllVersion), + ToShortVersionSegment(configVersion) + }); + } + catch (Exception ex) + { + Debug.LogWarning("[LTRes]GameLauncher - 版本短显示格式化失败, fullVersion=" + fullVersion + ", error=" + ex.Message); + return fullVersion; + } + } + + private static string ToShortVersionSegment(string versionSegment) + { + if (string.IsNullOrWhiteSpace(versionSegment)) + return VersionDisplayPlaceholder; + + return versionSegment.Length <= 4 + ? versionSegment + : versionSegment.Substring(versionSegment.Length - 4, 4); + } #region iOS_DeviceHelper @@ -424,4 +500,4 @@ public class GameLauncher : MonoBehaviour } #endregion -} \ No newline at end of file +} From 97d56617d48ee145ca31f43b43348d6fbb9b206b Mon Sep 17 00:00:00 2001 From: liutao <821580467@qq.com> Date: Fri, 10 Apr 2026 17:06:42 +0800 Subject: [PATCH 14/23] =?UTF-8?q?=E3=80=90=E6=89=93=E5=8C=85=E3=80=91?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=89=93=E5=8C=85=E6=B5=81=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ProjectNLD/Assets/Editor/Common/BuildLauncher.cs | 8 +++++++- ProjectNLD/Assets/PhxhSDK | 2 +- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/ProjectNLD/Assets/Editor/Common/BuildLauncher.cs b/ProjectNLD/Assets/Editor/Common/BuildLauncher.cs index a2683a16f82..5bc169f9011 100644 --- a/ProjectNLD/Assets/Editor/Common/BuildLauncher.cs +++ b/ProjectNLD/Assets/Editor/Common/BuildLauncher.cs @@ -148,7 +148,13 @@ internal class BatchBuild YooAssetBuildBase.ShouldPackDefaultRes(), YooAssetBuildBase.ShouldPackDllRes(), YooAssetBuildBase.ShouldPackConfigRes()); - info.localFullVersion = extBuildInfo.ComposeResVersion(); + string serverComposeVersion = extBuildInfo.ComposeResVersion(); + string clientLocalDeclaredVersion = extBuildInfo.ComposeClientLocalResVersion( + YooAssetBuildBase.ShouldPackDefaultRes(), + YooAssetBuildBase.ShouldPackDllRes(), + YooAssetBuildBase.ShouldPackConfigRes()); + Debug.Log($"[Build]AOT本地资源版本声明 packDefaultRes={YooAssetBuildBase.ShouldPackDefaultRes()}, packDllRes={YooAssetBuildBase.ShouldPackDllRes()}, packConfigRes={YooAssetBuildBase.ShouldPackConfigRes()}, serverComposeVersion={serverComposeVersion}, clientLocalDeclaredVersion={clientLocalDeclaredVersion}"); + info.localFullVersion = clientLocalDeclaredVersion; PackDataInst.CreateResourceJson(info); BuildLauncher.SetEnableHotUpdate(enableHotUpdate); diff --git a/ProjectNLD/Assets/PhxhSDK b/ProjectNLD/Assets/PhxhSDK index 091c61b2886..c5d78568a5f 160000 --- a/ProjectNLD/Assets/PhxhSDK +++ b/ProjectNLD/Assets/PhxhSDK @@ -1 +1 @@ -Subproject commit 091c61b288649b454ea1651b5695d3d17d2a37b2 +Subproject commit c5d78568a5f67dd577c7c668a677866be33f90b5 From f1feca4954870372a217edb8c01b6afa389587eb Mon Sep 17 00:00:00 2001 From: liutao <821580467@qq.com> Date: Fri, 10 Apr 2026 17:25:48 +0800 Subject: [PATCH 15/23] =?UTF-8?q?=E3=80=90=E6=89=93=E5=8C=85=E3=80=91?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=89=93=E5=8C=85=E6=B5=81=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Code/Scripts/HotUpdate/GameLauncher.cs | 76 +------------------ ProjectNLD/Assets/PhxhSDK | 2 +- 2 files changed, 3 insertions(+), 75 deletions(-) diff --git a/ProjectNLD/Assets/Code/Scripts/HotUpdate/GameLauncher.cs b/ProjectNLD/Assets/Code/Scripts/HotUpdate/GameLauncher.cs index 5cddebbfdb0..100d095acf6 100644 --- a/ProjectNLD/Assets/Code/Scripts/HotUpdate/GameLauncher.cs +++ b/ProjectNLD/Assets/Code/Scripts/HotUpdate/GameLauncher.cs @@ -24,8 +24,6 @@ using UnityEngine.Android; public class GameLauncher : MonoBehaviour { - private const string VersionDisplayPlaceholder = "----"; - #if USE_OBFUZ private static bool _isSetUpStaticSecret = false; /// @@ -219,7 +217,7 @@ public class GameLauncher : MonoBehaviour UpdateLocalInfo localInfo = PackDataInst.Inst.localInfo; string acquiring = LocalizeMono.Instance.GetLocalizeText("Acquiring"); // 获取中... - string displayLocalVersion = FormatVersionForDisplay(localInfo.localFullVersion); + string displayLocalVersion = VersionDisplayFormatter.Format(localInfo.localFullVersion, "[LTRes]GameLauncher"); Debug.Log("[LTRes]GameLauncher - ShowVersion关键日志 stage=LaunchInit, fullOldVersion=" + localInfo.localFullVersion + ", fullNewVersion=" + acquiring + ", displayOldVersion=" + displayLocalVersion + ", displayNewVersion=" + acquiring + ", serverName=" + acquiring); versionUpdateUI.ShowVersion(Application.version, localInfo.workSpace, displayLocalVersion, acquiring, acquiring); @@ -254,7 +252,7 @@ public class GameLauncher : MonoBehaviour downloadResult = await PreConfig.instance.DownloadConfig(); versionUpdateUI.UpdateProgressText(LocalizeMono.Instance.GetLocalizeText("RequestConfigurationComplete")); // 请求APPConfig结束 - string displayLocalVersionAfterConfig = FormatVersionForDisplay(localInfo.localFullVersion); + string displayLocalVersionAfterConfig = VersionDisplayFormatter.Format(localInfo.localFullVersion, "[LTRes]GameLauncher"); Debug.Log("[LTRes]GameLauncher - ShowVersion关键日志 stage=ConfigReady, fullOldVersion=" + localInfo.localFullVersion + ", fullNewVersion=" + acquiring + ", displayOldVersion=" + displayLocalVersionAfterConfig + ", displayNewVersion=" + acquiring + ", serverName=" + PreConfig.instance.ServerName); versionUpdateUI.ShowVersion(Application.version, localInfo.workSpace, displayLocalVersionAfterConfig, acquiring, PreConfig.instance.ServerName); BIToolinAOT.Instance.TrackEventInAOT("app_config_response", new System.Collections.Generic.Dictionary(){ @@ -384,76 +382,6 @@ public class GameLauncher : MonoBehaviour { realProgess = progress; } - - private static string FormatVersionForDisplay(string fullVersion) - { - if (string.IsNullOrWhiteSpace(fullVersion)) - return VersionDisplayPlaceholder; - - if (string.Equals(fullVersion, "unknown", StringComparison.OrdinalIgnoreCase)) - return fullVersion; - - try - { - string defaultVersion = null; - string dllVersion = null; - string configVersion = null; - - string[] segments = fullVersion.Split('|'); - foreach (string segment in segments) - { - if (string.IsNullOrWhiteSpace(segment)) - continue; - - string[] keyValue = segment.Split(new[] { ':' }, 2); - if (keyValue.Length != 2) - continue; - - string key = keyValue[0].Trim(); - string value = keyValue[1].Trim(); - if (string.IsNullOrEmpty(value)) - continue; - - if (string.Equals(key, "default", StringComparison.OrdinalIgnoreCase)) - { - defaultVersion = value; - } - else if (string.Equals(key, "dll", StringComparison.OrdinalIgnoreCase)) - { - dllVersion = value; - } - else if (string.Equals(key, "config", StringComparison.OrdinalIgnoreCase)) - { - configVersion = value; - } - } - - if (defaultVersion == null && dllVersion == null && configVersion == null) - return fullVersion; - - return string.Join("-", new[] - { - ToShortVersionSegment(defaultVersion), - ToShortVersionSegment(dllVersion), - ToShortVersionSegment(configVersion) - }); - } - catch (Exception ex) - { - Debug.LogWarning("[LTRes]GameLauncher - 版本短显示格式化失败, fullVersion=" + fullVersion + ", error=" + ex.Message); - return fullVersion; - } - } - - private static string ToShortVersionSegment(string versionSegment) - { - if (string.IsNullOrWhiteSpace(versionSegment)) - return VersionDisplayPlaceholder; - - return versionSegment.Length <= 4 - ? versionSegment - : versionSegment.Substring(versionSegment.Length - 4, 4); - } #region iOS_DeviceHelper diff --git a/ProjectNLD/Assets/PhxhSDK b/ProjectNLD/Assets/PhxhSDK index c5d78568a5f..6d2c5aca872 160000 --- a/ProjectNLD/Assets/PhxhSDK +++ b/ProjectNLD/Assets/PhxhSDK @@ -1 +1 @@ -Subproject commit c5d78568a5f67dd577c7c668a677866be33f90b5 +Subproject commit 6d2c5aca872b1ba333cb3af84b3435228fb769e3 From 3439ac502bd59fae971531a04cb19a94c2e1ae40 Mon Sep 17 00:00:00 2001 From: liutao <821580467@qq.com> Date: Fri, 10 Apr 2026 17:38:47 +0800 Subject: [PATCH 16/23] =?UTF-8?q?=E3=80=90=E6=89=93=E5=8C=85=E3=80=91?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=9E=84=E5=BB=BA=E7=89=A9=E5=90=8D=E5=AD=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Tool/build_env/jenkins_android_dev.groovy | 16 ++++++++++++---- Tool/build_env/jenkins_build_android_dev.groovy | 16 ++++++++++++---- Tool/build_tools | 2 +- 3 files changed, 25 insertions(+), 9 deletions(-) diff --git a/Tool/build_env/jenkins_android_dev.groovy b/Tool/build_env/jenkins_android_dev.groovy index 05dcd816b68..e74d3b3ed4f 100644 --- a/Tool/build_env/jenkins_android_dev.groovy +++ b/Tool/build_env/jenkins_android_dev.groovy @@ -21,6 +21,8 @@ def ARTIFACT_URL = "http://${env.PHXH_BUILDER_IP_ADDRESS}:8080/job/${env.JOB_NAM def VERSION_PARAM = "尚未获取" // 版本号 根据项目获取 def OSS_UPLOAD_PATH_PARAM // 上传地址,根据项目获取 def ASSETS_END_POINT_PARAM // Assets endPoint,根据项目获取 +def BUILD_TIMESTAMP +def OUTPUT_APK_NAME // 构建地址 def BUILD_PATH @@ -230,10 +232,15 @@ pipeline { VERSION_PARAM = (cfg?.Version ?: '').trim() OSS_UPLOAD_PATH_PARAM = (cfg?.OssRemoteUploadPath ?: '').trim() ASSETS_END_POINT_PARAM = (cfg?.AssetsEndPoint ?: '').trim() + BUILD_TIMESTAMP = new Date().format("yyyyMMdd_HHmmss") + def safeChannel = CHANNEL_PARAM.replaceAll(/[^A-Za-z0-9_-]/, "_") + def safeVersion = VERSION_PARAM.replaceAll(/[^A-Za-z0-9._-]/, "_") + OUTPUT_APK_NAME = "NLD_${safeChannel}_${safeVersion}_${BUILD_TIMESTAMP}.apk" // 3.其他数据 BUILD_PATH = "Builds/$CHANNEL_PARAM/$PLATFORM_PARAM/$VERSION_PARAM" log_path="$BUILD_PATH/build.log" echo "获取到的版本是 ${VERSION_PARAM}, 获取到的上传地址是 ${OSS_UPLOAD_PATH_PARAM},获取到的assets-oss-endpoint是 ${ASSETS_END_POINT_PARAM}" + echo "[APKName] channel=${CHANNEL_PARAM}, timestamp=${BUILD_TIMESTAMP}, outputApkName=${OUTPUT_APK_NAME}" } catch (err) { def message = "【${PLATFORM_PARAM}】【${VERSION_PARAM}】【Debug】【${CHANNEL_PARAM}】根据渠道获取相关参数失败" SendMessageToWechat(message) @@ -289,7 +296,7 @@ pipeline { log_path="$BUILD_PATH/UpdatePreviousBuild.log" } else - build_result=sh(script: "$WORKSPACE/Tool/build_tools/build_unity.sh ${VERSION_PARAM} ${PLATFORM_PARAM} ${PROFILE_PARAM} ${CHANNEL_PARAM} ${HOTUPDATE_PARAM} ${DEBUGBUILD_PARAM} ${AAB_PARAM} ${DEV_PARAM} ${ANDROIDKEYSTORE} ${ANDROIDKEYALIAS} ${OBFUZ} ${UPLOAD_SYMBOL}", returnStatus: true, returnStdout: false) + build_result=sh(script: "$WORKSPACE/Tool/build_tools/build_unity.sh ${VERSION_PARAM} ${PLATFORM_PARAM} ${PROFILE_PARAM} ${CHANNEL_PARAM} ${HOTUPDATE_PARAM} ${DEBUGBUILD_PARAM} ${AAB_PARAM} ${DEV_PARAM} ${ANDROIDKEYSTORE} ${ANDROIDKEYALIAS} ${OBFUZ} ${UPLOAD_SYMBOL} true true true ${OUTPUT_APK_NAME}", returnStatus: true, returnStdout: false) def parse_log = "../../$log_path" // 打包失败 @@ -378,14 +385,15 @@ pipeline { def retryCount = (encryptConfig?.RetryCount ?: 3) // 构建APK路径 - def apkPath = "$WORKSPACE/Builds/$CHANNEL_PARAM/$PLATFORM_PARAM/$VERSION_PARAM/$APK_NAME" + def apkName = OUTPUT_APK_NAME ?: APK_NAME + def apkPath = "$WORKSPACE/Builds/$CHANNEL_PARAM/$PLATFORM_PARAM/$VERSION_PARAM/$apkName" def outputDir = "$WORKSPACE/Builds/$CHANNEL_PARAM/$PLATFORM_PARAM/$VERSION_PARAM" // 替换WORKSPACE变量 toolPath = toolPath.replace('${WORKSPACE}', WORKSPACE) // 构建加密命令 - def encryptCmd = "java -jar '${toolPath}' -t apk -u '${apiUrl}' -r '${username}' -w '${password}' -k '${apkPath}' -s '${strategyName}' -d '${outputDir}' -n '${APK_NAME}' -y ${retryCount}" + def encryptCmd = "java -jar '${toolPath}' -t apk -u '${apiUrl}' -r '${username}' -w '${password}' -k '${apkPath}' -s '${strategyName}' -d '${outputDir}' -n '${apkName}' -y ${retryCount}" // 添加签名参数 if (needSign) { @@ -560,4 +568,4 @@ pipeline { } } } -} \ No newline at end of file +} diff --git a/Tool/build_env/jenkins_build_android_dev.groovy b/Tool/build_env/jenkins_build_android_dev.groovy index fb48f1db51b..f678cdb1888 100644 --- a/Tool/build_env/jenkins_build_android_dev.groovy +++ b/Tool/build_env/jenkins_build_android_dev.groovy @@ -24,6 +24,8 @@ def ARTIFACT_URL = "http://${env.PHXH_BUILDER_IP_ADDRESS}:8080/job/${env.JOB_NAM def VERSION_PARAM = "尚未获取" // 版本号 根据项目获取 def OSS_UPLOAD_PATH_PARAM // 上传地址,根据项目获取 def ASSETS_END_POINT_PARAM // Assets endPoint,根据项目获取 +def BUILD_TIMESTAMP +def OUTPUT_APK_NAME // 构建地址 def BUILD_PATH @@ -219,10 +221,15 @@ pipeline { VERSION_PARAM = (cfg?.Version ?: '').trim() OSS_UPLOAD_PATH_PARAM = (cfg?.OssRemoteUploadPath ?: '').trim() ASSETS_END_POINT_PARAM = (cfg?.AssetsEndPoint ?: '').trim() + BUILD_TIMESTAMP = new Date().format("yyyyMMdd_HHmmss") + def safeChannel = CHANNEL_PARAM.replaceAll(/[^A-Za-z0-9_-]/, "_") + def safeVersion = VERSION_PARAM.replaceAll(/[^A-Za-z0-9._-]/, "_") + OUTPUT_APK_NAME = "NLD_${safeChannel}_${safeVersion}_${BUILD_TIMESTAMP}.apk" // 3.其他数据 BUILD_PATH = "Builds/$CHANNEL_PARAM/$PLATFORM_PARAM/$VERSION_PARAM" log_path="$BUILD_PATH/build.log" echo "获取到的版本是 ${VERSION_PARAM}, 获取到的上传地址是 ${OSS_UPLOAD_PATH_PARAM},获取到的assets-oss-endpoint是 ${ASSETS_END_POINT_PARAM}" + echo "[APKName] channel=${CHANNEL_PARAM}, timestamp=${BUILD_TIMESTAMP}, outputApkName=${OUTPUT_APK_NAME}" } catch (err) { def message = "【${PLATFORM_PARAM}】【${VERSION_PARAM}】【Debug】【${CHANNEL_PARAM}】根据渠道获取相关参数失败" SendMessageToWechat(message) @@ -278,7 +285,7 @@ pipeline { log_path="$BUILD_PATH/UpdatePreviousBuild.log" } else - build_result=sh(script: "$WORKSPACE/Tool/build_tools/build_unity.sh ${VERSION_PARAM} ${PLATFORM_PARAM} ${PROFILE_PARAM} ${CHANNEL_PARAM} ${HOTUPDATE_PARAM} ${DEBUGBUILD_PARAM} ${AAB_PARAM} ${DEV_PARAM} ${ANDROIDKEYSTORE} ${ANDROIDKEYALIAS} ${OBFUZ} ${UPLOAD_SYMBOL} ${PackDefaultRes} ${PackDllRes} ${PackConfigRes}", returnStatus: true, returnStdout: false) + build_result=sh(script: "$WORKSPACE/Tool/build_tools/build_unity.sh ${VERSION_PARAM} ${PLATFORM_PARAM} ${PROFILE_PARAM} ${CHANNEL_PARAM} ${HOTUPDATE_PARAM} ${DEBUGBUILD_PARAM} ${AAB_PARAM} ${DEV_PARAM} ${ANDROIDKEYSTORE} ${ANDROIDKEYALIAS} ${OBFUZ} ${UPLOAD_SYMBOL} ${PackDefaultRes} ${PackDllRes} ${PackConfigRes} ${OUTPUT_APK_NAME}", returnStatus: true, returnStdout: false) def parse_log = "../../$log_path" // 打包失败 @@ -367,14 +374,15 @@ pipeline { def retryCount = (encryptConfig?.RetryCount ?: 3) // 构建APK路径 - def apkPath = "$WORKSPACE/Builds/$CHANNEL_PARAM/$PLATFORM_PARAM/$VERSION_PARAM/$APK_NAME" + def apkName = OUTPUT_APK_NAME ?: APK_NAME + def apkPath = "$WORKSPACE/Builds/$CHANNEL_PARAM/$PLATFORM_PARAM/$VERSION_PARAM/$apkName" def outputDir = "$WORKSPACE/Builds/$CHANNEL_PARAM/$PLATFORM_PARAM/$VERSION_PARAM" // 替换WORKSPACE变量 toolPath = toolPath.replace('${WORKSPACE}', WORKSPACE) // 构建加密命令 - def encryptCmd = "java -jar '${toolPath}' -t apk -u '${apiUrl}' -r '${username}' -w '${password}' -k '${apkPath}' -s '${strategyName}' -d '${outputDir}' -n '${APK_NAME}' -y ${retryCount}" + def encryptCmd = "java -jar '${toolPath}' -t apk -u '${apiUrl}' -r '${username}' -w '${password}' -k '${apkPath}' -s '${strategyName}' -d '${outputDir}' -n '${apkName}' -y ${retryCount}" // 添加签名参数 if (needSign) { @@ -549,4 +557,4 @@ pipeline { } } } -} \ No newline at end of file +} diff --git a/Tool/build_tools b/Tool/build_tools index 34a565305a0..e4df2e9f03e 160000 --- a/Tool/build_tools +++ b/Tool/build_tools @@ -1 +1 @@ -Subproject commit 34a565305a05419f893d18702b66e0fdc049625c +Subproject commit e4df2e9f03e927b87ae4374b021143cfa6c123a7 From 15e7587d8f36127f4033867ff5dc4309f4390282 Mon Sep 17 00:00:00 2001 From: liutao <821580467@qq.com> Date: Fri, 10 Apr 2026 18:08:49 +0800 Subject: [PATCH 17/23] =?UTF-8?q?Revert=20"=E3=80=90=E6=89=93=E5=8C=85?= =?UTF-8?q?=E3=80=91=E4=BC=98=E5=8C=96=E6=9E=84=E5=BB=BA=E7=89=A9=E5=90=8D?= =?UTF-8?q?=E5=AD=97"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 3439ac502bd59fae971531a04cb19a94c2e1ae40. --- Tool/build_env/jenkins_android_dev.groovy | 16 ++++------------ Tool/build_env/jenkins_build_android_dev.groovy | 16 ++++------------ Tool/build_tools | 2 +- 3 files changed, 9 insertions(+), 25 deletions(-) diff --git a/Tool/build_env/jenkins_android_dev.groovy b/Tool/build_env/jenkins_android_dev.groovy index e74d3b3ed4f..05dcd816b68 100644 --- a/Tool/build_env/jenkins_android_dev.groovy +++ b/Tool/build_env/jenkins_android_dev.groovy @@ -21,8 +21,6 @@ def ARTIFACT_URL = "http://${env.PHXH_BUILDER_IP_ADDRESS}:8080/job/${env.JOB_NAM def VERSION_PARAM = "尚未获取" // 版本号 根据项目获取 def OSS_UPLOAD_PATH_PARAM // 上传地址,根据项目获取 def ASSETS_END_POINT_PARAM // Assets endPoint,根据项目获取 -def BUILD_TIMESTAMP -def OUTPUT_APK_NAME // 构建地址 def BUILD_PATH @@ -232,15 +230,10 @@ pipeline { VERSION_PARAM = (cfg?.Version ?: '').trim() OSS_UPLOAD_PATH_PARAM = (cfg?.OssRemoteUploadPath ?: '').trim() ASSETS_END_POINT_PARAM = (cfg?.AssetsEndPoint ?: '').trim() - BUILD_TIMESTAMP = new Date().format("yyyyMMdd_HHmmss") - def safeChannel = CHANNEL_PARAM.replaceAll(/[^A-Za-z0-9_-]/, "_") - def safeVersion = VERSION_PARAM.replaceAll(/[^A-Za-z0-9._-]/, "_") - OUTPUT_APK_NAME = "NLD_${safeChannel}_${safeVersion}_${BUILD_TIMESTAMP}.apk" // 3.其他数据 BUILD_PATH = "Builds/$CHANNEL_PARAM/$PLATFORM_PARAM/$VERSION_PARAM" log_path="$BUILD_PATH/build.log" echo "获取到的版本是 ${VERSION_PARAM}, 获取到的上传地址是 ${OSS_UPLOAD_PATH_PARAM},获取到的assets-oss-endpoint是 ${ASSETS_END_POINT_PARAM}" - echo "[APKName] channel=${CHANNEL_PARAM}, timestamp=${BUILD_TIMESTAMP}, outputApkName=${OUTPUT_APK_NAME}" } catch (err) { def message = "【${PLATFORM_PARAM}】【${VERSION_PARAM}】【Debug】【${CHANNEL_PARAM}】根据渠道获取相关参数失败" SendMessageToWechat(message) @@ -296,7 +289,7 @@ pipeline { log_path="$BUILD_PATH/UpdatePreviousBuild.log" } else - build_result=sh(script: "$WORKSPACE/Tool/build_tools/build_unity.sh ${VERSION_PARAM} ${PLATFORM_PARAM} ${PROFILE_PARAM} ${CHANNEL_PARAM} ${HOTUPDATE_PARAM} ${DEBUGBUILD_PARAM} ${AAB_PARAM} ${DEV_PARAM} ${ANDROIDKEYSTORE} ${ANDROIDKEYALIAS} ${OBFUZ} ${UPLOAD_SYMBOL} true true true ${OUTPUT_APK_NAME}", returnStatus: true, returnStdout: false) + build_result=sh(script: "$WORKSPACE/Tool/build_tools/build_unity.sh ${VERSION_PARAM} ${PLATFORM_PARAM} ${PROFILE_PARAM} ${CHANNEL_PARAM} ${HOTUPDATE_PARAM} ${DEBUGBUILD_PARAM} ${AAB_PARAM} ${DEV_PARAM} ${ANDROIDKEYSTORE} ${ANDROIDKEYALIAS} ${OBFUZ} ${UPLOAD_SYMBOL}", returnStatus: true, returnStdout: false) def parse_log = "../../$log_path" // 打包失败 @@ -385,15 +378,14 @@ pipeline { def retryCount = (encryptConfig?.RetryCount ?: 3) // 构建APK路径 - def apkName = OUTPUT_APK_NAME ?: APK_NAME - def apkPath = "$WORKSPACE/Builds/$CHANNEL_PARAM/$PLATFORM_PARAM/$VERSION_PARAM/$apkName" + def apkPath = "$WORKSPACE/Builds/$CHANNEL_PARAM/$PLATFORM_PARAM/$VERSION_PARAM/$APK_NAME" def outputDir = "$WORKSPACE/Builds/$CHANNEL_PARAM/$PLATFORM_PARAM/$VERSION_PARAM" // 替换WORKSPACE变量 toolPath = toolPath.replace('${WORKSPACE}', WORKSPACE) // 构建加密命令 - def encryptCmd = "java -jar '${toolPath}' -t apk -u '${apiUrl}' -r '${username}' -w '${password}' -k '${apkPath}' -s '${strategyName}' -d '${outputDir}' -n '${apkName}' -y ${retryCount}" + def encryptCmd = "java -jar '${toolPath}' -t apk -u '${apiUrl}' -r '${username}' -w '${password}' -k '${apkPath}' -s '${strategyName}' -d '${outputDir}' -n '${APK_NAME}' -y ${retryCount}" // 添加签名参数 if (needSign) { @@ -568,4 +560,4 @@ pipeline { } } } -} +} \ No newline at end of file diff --git a/Tool/build_env/jenkins_build_android_dev.groovy b/Tool/build_env/jenkins_build_android_dev.groovy index f678cdb1888..fb48f1db51b 100644 --- a/Tool/build_env/jenkins_build_android_dev.groovy +++ b/Tool/build_env/jenkins_build_android_dev.groovy @@ -24,8 +24,6 @@ def ARTIFACT_URL = "http://${env.PHXH_BUILDER_IP_ADDRESS}:8080/job/${env.JOB_NAM def VERSION_PARAM = "尚未获取" // 版本号 根据项目获取 def OSS_UPLOAD_PATH_PARAM // 上传地址,根据项目获取 def ASSETS_END_POINT_PARAM // Assets endPoint,根据项目获取 -def BUILD_TIMESTAMP -def OUTPUT_APK_NAME // 构建地址 def BUILD_PATH @@ -221,15 +219,10 @@ pipeline { VERSION_PARAM = (cfg?.Version ?: '').trim() OSS_UPLOAD_PATH_PARAM = (cfg?.OssRemoteUploadPath ?: '').trim() ASSETS_END_POINT_PARAM = (cfg?.AssetsEndPoint ?: '').trim() - BUILD_TIMESTAMP = new Date().format("yyyyMMdd_HHmmss") - def safeChannel = CHANNEL_PARAM.replaceAll(/[^A-Za-z0-9_-]/, "_") - def safeVersion = VERSION_PARAM.replaceAll(/[^A-Za-z0-9._-]/, "_") - OUTPUT_APK_NAME = "NLD_${safeChannel}_${safeVersion}_${BUILD_TIMESTAMP}.apk" // 3.其他数据 BUILD_PATH = "Builds/$CHANNEL_PARAM/$PLATFORM_PARAM/$VERSION_PARAM" log_path="$BUILD_PATH/build.log" echo "获取到的版本是 ${VERSION_PARAM}, 获取到的上传地址是 ${OSS_UPLOAD_PATH_PARAM},获取到的assets-oss-endpoint是 ${ASSETS_END_POINT_PARAM}" - echo "[APKName] channel=${CHANNEL_PARAM}, timestamp=${BUILD_TIMESTAMP}, outputApkName=${OUTPUT_APK_NAME}" } catch (err) { def message = "【${PLATFORM_PARAM}】【${VERSION_PARAM}】【Debug】【${CHANNEL_PARAM}】根据渠道获取相关参数失败" SendMessageToWechat(message) @@ -285,7 +278,7 @@ pipeline { log_path="$BUILD_PATH/UpdatePreviousBuild.log" } else - build_result=sh(script: "$WORKSPACE/Tool/build_tools/build_unity.sh ${VERSION_PARAM} ${PLATFORM_PARAM} ${PROFILE_PARAM} ${CHANNEL_PARAM} ${HOTUPDATE_PARAM} ${DEBUGBUILD_PARAM} ${AAB_PARAM} ${DEV_PARAM} ${ANDROIDKEYSTORE} ${ANDROIDKEYALIAS} ${OBFUZ} ${UPLOAD_SYMBOL} ${PackDefaultRes} ${PackDllRes} ${PackConfigRes} ${OUTPUT_APK_NAME}", returnStatus: true, returnStdout: false) + build_result=sh(script: "$WORKSPACE/Tool/build_tools/build_unity.sh ${VERSION_PARAM} ${PLATFORM_PARAM} ${PROFILE_PARAM} ${CHANNEL_PARAM} ${HOTUPDATE_PARAM} ${DEBUGBUILD_PARAM} ${AAB_PARAM} ${DEV_PARAM} ${ANDROIDKEYSTORE} ${ANDROIDKEYALIAS} ${OBFUZ} ${UPLOAD_SYMBOL} ${PackDefaultRes} ${PackDllRes} ${PackConfigRes}", returnStatus: true, returnStdout: false) def parse_log = "../../$log_path" // 打包失败 @@ -374,15 +367,14 @@ pipeline { def retryCount = (encryptConfig?.RetryCount ?: 3) // 构建APK路径 - def apkName = OUTPUT_APK_NAME ?: APK_NAME - def apkPath = "$WORKSPACE/Builds/$CHANNEL_PARAM/$PLATFORM_PARAM/$VERSION_PARAM/$apkName" + def apkPath = "$WORKSPACE/Builds/$CHANNEL_PARAM/$PLATFORM_PARAM/$VERSION_PARAM/$APK_NAME" def outputDir = "$WORKSPACE/Builds/$CHANNEL_PARAM/$PLATFORM_PARAM/$VERSION_PARAM" // 替换WORKSPACE变量 toolPath = toolPath.replace('${WORKSPACE}', WORKSPACE) // 构建加密命令 - def encryptCmd = "java -jar '${toolPath}' -t apk -u '${apiUrl}' -r '${username}' -w '${password}' -k '${apkPath}' -s '${strategyName}' -d '${outputDir}' -n '${apkName}' -y ${retryCount}" + def encryptCmd = "java -jar '${toolPath}' -t apk -u '${apiUrl}' -r '${username}' -w '${password}' -k '${apkPath}' -s '${strategyName}' -d '${outputDir}' -n '${APK_NAME}' -y ${retryCount}" // 添加签名参数 if (needSign) { @@ -557,4 +549,4 @@ pipeline { } } } -} +} \ No newline at end of file diff --git a/Tool/build_tools b/Tool/build_tools index e4df2e9f03e..34a565305a0 160000 --- a/Tool/build_tools +++ b/Tool/build_tools @@ -1 +1 @@ -Subproject commit e4df2e9f03e927b87ae4374b021143cfa6c123a7 +Subproject commit 34a565305a05419f893d18702b66e0fdc049625c From baa4dfce61cc2d986dcc83b526d0472596bef8e8 Mon Sep 17 00:00:00 2001 From: liutao <821580467@qq.com> Date: Fri, 10 Apr 2026 18:11:00 +0800 Subject: [PATCH 18/23] =?UTF-8?q?=E8=BF=98=E5=8E=9F=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Tool/build_tools | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tool/build_tools b/Tool/build_tools index 34a565305a0..3d2d651da6a 160000 --- a/Tool/build_tools +++ b/Tool/build_tools @@ -1 +1 @@ -Subproject commit 34a565305a05419f893d18702b66e0fdc049625c +Subproject commit 3d2d651da6a817280bf674439187f1257e916013 From cef81f8a642a61e584273ed4d195481205f2301f Mon Sep 17 00:00:00 2001 From: liutao <821580467@qq.com> Date: Sat, 11 Apr 2026 14:33:10 +0800 Subject: [PATCH 19/23] =?UTF-8?q?=E3=80=90=E6=89=93=E5=8C=85=E3=80=91?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=B8=8A=E4=BC=A0debug=20key=E6=B5=81?= =?UTF-8?q?=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Assets/Editor/Common/BuildLauncher.cs | 48 +++++++++++++++++++ ProjectNLD/Assets/PhxhSDK | 2 +- Tool/build_tools | 2 +- 3 files changed, 50 insertions(+), 2 deletions(-) diff --git a/ProjectNLD/Assets/Editor/Common/BuildLauncher.cs b/ProjectNLD/Assets/Editor/Common/BuildLauncher.cs index 5bc169f9011..28f71331e88 100644 --- a/ProjectNLD/Assets/Editor/Common/BuildLauncher.cs +++ b/ProjectNLD/Assets/Editor/Common/BuildLauncher.cs @@ -447,6 +447,54 @@ internal class BatchBuild HttpHelper.PostAsync(url, body, dicHeadData).Forget(); } + /// + /// batchmode 下等待 sendVersion 请求完成,并显式退出 Unity,避免 Jenkins 长时间挂起。 + /// + public static async void PostDebugSendKeyBatch() + { + const int timeoutSeconds = 30; + + try + { + string version = PackDataInst.Inst.localInfo.version; + string tag = HashUtils.MD5(version); + + Dictionary dicHeadData = PostHeader.PostHeaderInfo(new Dictionary + { + { "plaintext", version }, + { "platform", "0" }, + { "tag", tag }, + { "timestamp", DateTimeOffset.UtcNow.ToUnixTimeSeconds().ToString() } + }); + + SendVersionBody body = new() + { + plaintext = version, + tag = tag, + platform = "0" + }; + + string url = $"{Dev_PostUrl}sendVersion"; + Debug.Log($"[PostDebugSendKeyBatch] Start URL={url}, version={version}, tag(MD5)={tag}, timeout={timeoutSeconds}s"); + + var result = await HttpHelper.PostAsync(url, body, dicHeadData, timeoutSeconds); + if (result.code != 0) + { + Debug.LogError($"[PostDebugSendKeyBatch] Failed code={result.code}, message={result.message}"); + EditorApplication.Exit(1); + return; + } + + Debug.Log($"[PostDebugSendKeyBatch] Success message={result.message}"); + EditorApplication.Exit(0); + } + catch (Exception e) + { + Debug.LogError($"[PostDebugSendKeyBatch Exception]:{e.Message} \r\n {e.StackTrace}"); + EditorApplication.Exit(1); + } + } + #if UNITY_EDITOR [UnityEditor.MenuItem("Test/Build/测试 Version (version=1.0.0)")] public static void TestPostDebugSendKey() diff --git a/ProjectNLD/Assets/PhxhSDK b/ProjectNLD/Assets/PhxhSDK index 6d8d808b9ba..e47e2ad436f 160000 --- a/ProjectNLD/Assets/PhxhSDK +++ b/ProjectNLD/Assets/PhxhSDK @@ -1 +1 @@ -Subproject commit 6d8d808b9bafe76105897814dbf6891240d0ceb3 +Subproject commit e47e2ad436f6ec9d0057e82d76ba9fc1bc314694 diff --git a/Tool/build_tools b/Tool/build_tools index 3d2d651da6a..30d4c15d29e 160000 --- a/Tool/build_tools +++ b/Tool/build_tools @@ -1 +1 @@ -Subproject commit 3d2d651da6a817280bf674439187f1257e916013 +Subproject commit 30d4c15d29e64de4184053eed464170ef75d292b From b980526265fe6c251a82fe24281f5de2e404aece Mon Sep 17 00:00:00 2001 From: liutao <821580467@qq.com> Date: Sat, 11 Apr 2026 14:33:44 +0800 Subject: [PATCH 20/23] =?UTF-8?q?=E6=8F=90=E4=BA=A4unity=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E5=8F=98=E5=8A=A8=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Icon/BuffIcon/Icon_Buff_Moraledamageincreased_01.png.meta | 2 +- .../Icon/BuffIcon/Icon_Debuff_Moraledamageincreased_01.png.meta | 2 +- .../BuffIcon/Icon_Buff_Moraledamageincreased_01.png.meta | 2 +- .../BuffIcon/Icon_Debuff_Moraledamageincreased_01.png.meta | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/ProjectNLD/Assets/Art_Out/UI/Texture/Icon/BuffIcon/Icon_Buff_Moraledamageincreased_01.png.meta b/ProjectNLD/Assets/Art_Out/UI/Texture/Icon/BuffIcon/Icon_Buff_Moraledamageincreased_01.png.meta index f58d366579b..bcc699c08f2 100644 --- a/ProjectNLD/Assets/Art_Out/UI/Texture/Icon/BuffIcon/Icon_Buff_Moraledamageincreased_01.png.meta +++ b/ProjectNLD/Assets/Art_Out/UI/Texture/Icon/BuffIcon/Icon_Buff_Moraledamageincreased_01.png.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: d11a6cac5ec82a94e9ce4b93e4adf3f4 +guid: a468c2be85133e945b9e4b61f9d575c1 TextureImporter: internalIDToNameTable: [] externalObjects: {} diff --git a/ProjectNLD/Assets/Art_Out/UI/Texture/Icon/BuffIcon/Icon_Debuff_Moraledamageincreased_01.png.meta b/ProjectNLD/Assets/Art_Out/UI/Texture/Icon/BuffIcon/Icon_Debuff_Moraledamageincreased_01.png.meta index e921cbf37a2..0eafeda1aa5 100644 --- a/ProjectNLD/Assets/Art_Out/UI/Texture/Icon/BuffIcon/Icon_Debuff_Moraledamageincreased_01.png.meta +++ b/ProjectNLD/Assets/Art_Out/UI/Texture/Icon/BuffIcon/Icon_Debuff_Moraledamageincreased_01.png.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 07d3075d6c048394086852042ab9736b +guid: 6eb3e4eefd7e0244db8a0dd821fcdc36 TextureImporter: internalIDToNameTable: [] externalObjects: {} diff --git a/ProjectNLD/Assets/Art_Out/UI/Texture/UI_Pic_Level/BuffIcon/Icon_Buff_Moraledamageincreased_01.png.meta b/ProjectNLD/Assets/Art_Out/UI/Texture/UI_Pic_Level/BuffIcon/Icon_Buff_Moraledamageincreased_01.png.meta index f58d366579b..bcf64b5b27d 100644 --- a/ProjectNLD/Assets/Art_Out/UI/Texture/UI_Pic_Level/BuffIcon/Icon_Buff_Moraledamageincreased_01.png.meta +++ b/ProjectNLD/Assets/Art_Out/UI/Texture/UI_Pic_Level/BuffIcon/Icon_Buff_Moraledamageincreased_01.png.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: d11a6cac5ec82a94e9ce4b93e4adf3f4 +guid: 2f5922e38c7791247b826711633f179d TextureImporter: internalIDToNameTable: [] externalObjects: {} diff --git a/ProjectNLD/Assets/Art_Out/UI/Texture/UI_Pic_Level/BuffIcon/Icon_Debuff_Moraledamageincreased_01.png.meta b/ProjectNLD/Assets/Art_Out/UI/Texture/UI_Pic_Level/BuffIcon/Icon_Debuff_Moraledamageincreased_01.png.meta index e921cbf37a2..973948c74e7 100644 --- a/ProjectNLD/Assets/Art_Out/UI/Texture/UI_Pic_Level/BuffIcon/Icon_Debuff_Moraledamageincreased_01.png.meta +++ b/ProjectNLD/Assets/Art_Out/UI/Texture/UI_Pic_Level/BuffIcon/Icon_Debuff_Moraledamageincreased_01.png.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 07d3075d6c048394086852042ab9736b +guid: 8b7966c5144ead044bb904b872939c42 TextureImporter: internalIDToNameTable: [] externalObjects: {} From 0bb2b7dcae87e3159746d8cf374c065197342f78 Mon Sep 17 00:00:00 2001 From: liutao <821580467@qq.com> Date: Sat, 11 Apr 2026 15:36:32 +0800 Subject: [PATCH 21/23] =?UTF-8?q?=E3=80=90=E6=89=93=E5=8C=85=E3=80=91dev?= =?UTF-8?q?=E8=87=AA=E5=8A=A8=E4=B8=8A=E4=BC=A0key=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E6=89=8B=E5=8A=A8=E6=B5=8B=E8=AF=95=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Assets/Editor/Common/BuildLauncher.cs | 49 ++----------------- 1 file changed, 5 insertions(+), 44 deletions(-) diff --git a/ProjectNLD/Assets/Editor/Common/BuildLauncher.cs b/ProjectNLD/Assets/Editor/Common/BuildLauncher.cs index 28f71331e88..50d5f0a02e0 100644 --- a/ProjectNLD/Assets/Editor/Common/BuildLauncher.cs +++ b/ProjectNLD/Assets/Editor/Common/BuildLauncher.cs @@ -421,9 +421,9 @@ internal class BatchBuild /// /// 自动发布debug loginKey /// - public static void PostDebugSendKey() + public static void PostDebugSendKey(string sendVersion = null) { - string version = PackDataInst.Inst.localInfo.version; + string version = string.IsNullOrEmpty(sendVersion) ? PackDataInst.Inst.localInfo.version : sendVersion; string tag = HashUtils.MD5(version); // 服务端签名原文包含 platform="0",按字母升序排列 @@ -496,50 +496,11 @@ internal class BatchBuild } #if UNITY_EDITOR - [UnityEditor.MenuItem("Test/Build/测试 Version (version=1.0.0)")] + [UnityEditor.MenuItem("Test/Build/手动发布LoginKey")] public static void TestPostDebugSendKey() { - const string testVersion = "1.0.0"; - string loginKey = HashUtils.MD5(testVersion); - string timestamp = DateTimeOffset.UtcNow.ToUnixTimeSeconds().ToString(); - - // 服务端签名算法:MD5(排序参数字符串) + httpKey 再做 SHA256(64位) - // 即 PostHeader.PostHeaderInfo 内部已实现的流程,参数需包含 platform="" - Dictionary signParams = new Dictionary - { - { "plaintext", testVersion }, - { "platform", "" }, - { "tag", loginKey }, - { "timestamp", timestamp } - }; - - var sortedKeys = signParams.Keys.OrderBy(k => k).ToList(); - string sortParamsStr = string.Join("&", sortedKeys.Select(k => $"{k}={signParams[k]}")); - Debug.Log($"[TestPostLoginKey] 签名原文: {sortParamsStr}"); - - // 使用 PostHeaderInfo 生成 64 位 signature(MD5 + httpKey + SHA256) - Dictionary headData = PostHeader.PostHeaderInfo(signParams); - Debug.Log($"[TestPostLoginKey] signature: {headData["signature"]}"); - - LoginKeyData loginKeyData = new() - { - plaintext = testVersion, - tag = loginKey, - }; - string bodyJson = JsonUtility.ToJson(loginKeyData); - Debug.Log($"[TestPostLoginKey] 请求 Body: {bodyJson}"); - - string testUrl = $"{Dev_PostUrl}version"; - try - { - Debug.Log($"[TestPostLoginKey] URL: {testUrl}"); - HttpHelper.PostAsync(testUrl, loginKeyData, headData).Forget(); - } - catch (Exception e) - { - Debug.LogError($"[TestPostLoginKey Exception]:{e.Message} \r\n {e.StackTrace}"); - throw; - } + const string testVersion = "0.9.0"; + PostDebugSendKey(testVersion); } [UnityEditor.MenuItem("Test/Build/测试 SendVersion (version=1.0.0)")] From 67ec46037b5e5bef5e9bb1f9f2fedde68dfface7 Mon Sep 17 00:00:00 2001 From: liutao <821580467@qq.com> Date: Sat, 11 Apr 2026 15:39:38 +0800 Subject: [PATCH 22/23] =?UTF-8?q?=E3=80=90=E6=89=93=E5=8C=85=E3=80=91?= =?UTF-8?q?=E6=89=8B=E5=8A=A8merge?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ProjectNLD/Assets/PhxhSDK | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ProjectNLD/Assets/PhxhSDK b/ProjectNLD/Assets/PhxhSDK index e47e2ad436f..efe2e69b0b5 160000 --- a/ProjectNLD/Assets/PhxhSDK +++ b/ProjectNLD/Assets/PhxhSDK @@ -1 +1 @@ -Subproject commit e47e2ad436f6ec9d0057e82d76ba9fc1bc314694 +Subproject commit efe2e69b0b56c70f633216ab0fca75ffed8a529e From 37e3712a5f3a1ab6be90c013ef5a3e24771bfc6c Mon Sep 17 00:00:00 2001 From: liutao <821580467@qq.com> Date: Sat, 11 Apr 2026 16:26:44 +0800 Subject: [PATCH 23/23] =?UTF-8?q?=E3=80=90=E6=89=93=E5=8C=85=E3=80=91?= =?UTF-8?q?=E5=86=8D=E6=AC=A1=E4=BF=AE=E6=AD=A3=E4=B8=8A=E4=BC=A0debugkey?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Assets/Editor/Common/BuildLauncher.cs | 37 +------------------ 1 file changed, 2 insertions(+), 35 deletions(-) diff --git a/ProjectNLD/Assets/Editor/Common/BuildLauncher.cs b/ProjectNLD/Assets/Editor/Common/BuildLauncher.cs index be7f351d4e4..ca6bc2df4c1 100644 --- a/ProjectNLD/Assets/Editor/Common/BuildLauncher.cs +++ b/ProjectNLD/Assets/Editor/Common/BuildLauncher.cs @@ -452,48 +452,15 @@ internal class BatchBuild /// /// batchmode 下等待 sendVersion 请求完成,并显式退出 Unity,避免 Jenkins 长时间挂起。 /// - public static async void PostDebugSendKeyBatch() + public static void PostDebugSendKeyBatch() { - const int timeoutSeconds = 30; - try { - string version = PackDataInst.Inst.localInfo.version; - string tag = HashUtils.MD5(version); - - Dictionary dicHeadData = PostHeader.PostHeaderInfo(new Dictionary - { - { "plaintext", version }, - { "platform", "0" }, - { "tag", tag }, - { "timestamp", DateTimeOffset.UtcNow.ToUnixTimeSeconds().ToString() } - }); - - SendVersionBody body = new() - { - plaintext = version, - tag = tag, - platform = "0" - }; - - string url = $"{Dev_PostUrl}sendVersion"; - Debug.Log($"[PostDebugSendKeyBatch] Start URL={url}, version={version}, tag(MD5)={tag}, timeout={timeoutSeconds}s"); - - var result = await HttpHelper.PostAsync(url, body, dicHeadData, timeoutSeconds); - if (result.code != 0) - { - Debug.LogError($"[PostDebugSendKeyBatch] Failed code={result.code}, message={result.message}"); - EditorApplication.Exit(1); - return; - } - - Debug.Log($"[PostDebugSendKeyBatch] Success message={result.message}"); - EditorApplication.Exit(0); + PostDebugSendKey(); } catch (Exception e) { Debug.LogError($"[PostDebugSendKeyBatch Exception]:{e.Message} \r\n {e.StackTrace}"); - EditorApplication.Exit(1); } }