From 75a0012e094de9520a912e4c1407af5930f6904a Mon Sep 17 00:00:00 2001 From: David Nguyen <87228593+davidnguyen-tech@users.noreply.github.com> Date: Fri, 11 Jul 2025 10:28:04 +0000 Subject: [PATCH 01/12] Propagate InvariantGlobalization --- src/mono/msbuild/android/build/AndroidBuild.targets | 1 + 1 file changed, 1 insertion(+) diff --git a/src/mono/msbuild/android/build/AndroidBuild.targets b/src/mono/msbuild/android/build/AndroidBuild.targets index 56dd94a5983986..886e99635a34c6 100644 --- a/src/mono/msbuild/android/build/AndroidBuild.targets +++ b/src/mono/msbuild/android/build/AndroidBuild.targets @@ -251,6 +251,7 @@ ForceAOT="$(RunAOTCompilation)" ForceFullAOT="$(ForceFullAOT)" ForceInterpreter="$(MonoForceInterpreter)" + InvariantGlobalization="$(InvariantGlobalization)" IsLibraryMode="$(_IsLibraryMode)" MainLibraryFileName="$(MainLibraryFileName)" RuntimeHeaders="@(RuntimeHeaders)" From 0e7dbf3aaeecb1c0fe73356a7aeb59a51da586ed Mon Sep 17 00:00:00 2001 From: David Nguyen <87228593+davidnguyen-tech@users.noreply.github.com> Date: Fri, 11 Jul 2025 10:28:40 +0000 Subject: [PATCH 02/12] Create InvariantGlobalization property --- src/tasks/AndroidAppBuilder/AndroidAppBuilder.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/tasks/AndroidAppBuilder/AndroidAppBuilder.cs b/src/tasks/AndroidAppBuilder/AndroidAppBuilder.cs index 006b746ef0d010..dd1629e5e08ab7 100644 --- a/src/tasks/AndroidAppBuilder/AndroidAppBuilder.cs +++ b/src/tasks/AndroidAppBuilder/AndroidAppBuilder.cs @@ -108,6 +108,11 @@ public class AndroidAppBuilderTask : Task public bool ForceInterpreter { get; set; } + /// + /// Indicates whether we want to use invariant globalization mode. + /// + public bool InvariantGlobalization { get; set; } + [Output] public string ApkBundlePath { get; set; } = ""!; From 72bb9f776d868dd0a450fa3d0cf5eec7288a7c30 Mon Sep 17 00:00:00 2001 From: David Nguyen <87228593+davidnguyen-tech@users.noreply.github.com> Date: Fri, 11 Jul 2025 10:29:05 +0000 Subject: [PATCH 03/12] Pass the InvariantGlobalization to apkBuilder --- src/tasks/AndroidAppBuilder/AndroidAppBuilder.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/tasks/AndroidAppBuilder/AndroidAppBuilder.cs b/src/tasks/AndroidAppBuilder/AndroidAppBuilder.cs index dd1629e5e08ab7..bf3d76bcb24626 100644 --- a/src/tasks/AndroidAppBuilder/AndroidAppBuilder.cs +++ b/src/tasks/AndroidAppBuilder/AndroidAppBuilder.cs @@ -146,6 +146,7 @@ public override bool Execute() apkBuilder.NativeDependencies = NativeDependencies; apkBuilder.ExtraLinkerArguments = ExtraLinkerArguments; apkBuilder.RuntimeFlavor = RuntimeFlavor; + apkBuilder.InvariantGlobalization = InvariantGlobalization; (ApkBundlePath, ApkPackageId) = apkBuilder.BuildApk(RuntimeIdentifier, MainLibraryFileName, RuntimeHeaders); return true; From 3df358b64b54eda6548880053f1a022f237b5693 Mon Sep 17 00:00:00 2001 From: David Nguyen <87228593+davidnguyen-tech@users.noreply.github.com> Date: Fri, 11 Jul 2025 10:29:39 +0000 Subject: [PATCH 04/12] Pass the InvariantGlobalization to envVariables --- src/tasks/AndroidAppBuilder/ApkBuilder.cs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/tasks/AndroidAppBuilder/ApkBuilder.cs b/src/tasks/AndroidAppBuilder/ApkBuilder.cs index 21fd800c89681a..6a7e9d56669328 100644 --- a/src/tasks/AndroidAppBuilder/ApkBuilder.cs +++ b/src/tasks/AndroidAppBuilder/ApkBuilder.cs @@ -424,6 +424,12 @@ public ApkBuilder(TaskLoggingHelper logger) envVariables += $"\t\tsetEnv(\"{name}\", \"{value}\");\n"; } + // Set invariant globalization environment variable if enabled + if (InvariantGlobalization) + { + envVariables += $"\t\tsetEnv(\"DOTNET_SYSTEM_GLOBALIZATION_INVARIANT\", \"true\");\n"; + } + string jniLibraryName = (IsLibraryMode) ? ProjectName! : (StaticLinkedRuntime && IsCoreCLR) ? "monodroid" : "System.Security.Cryptography.Native.Android"; string monoRunner = Utils.GetEmbeddedResource("MonoRunner.java") From 90e224555997684f91ef35e0a594203496040cc4 Mon Sep 17 00:00:00 2001 From: David Nguyen <87228593+davidnguyen-tech@users.noreply.github.com> Date: Fri, 11 Jul 2025 10:30:15 +0000 Subject: [PATCH 05/12] Pass InvariantGlobalization to AndroidAppBuilderTask --- src/tests/build.proj | 1 + 1 file changed, 1 insertion(+) diff --git a/src/tests/build.proj b/src/tests/build.proj index 8499575b01c257..b1fd5ba3b72efb 100644 --- a/src/tests/build.proj +++ b/src/tests/build.proj @@ -264,6 +264,7 @@ AppDir="$(BuildDir)" DiagnosticPorts="$(DiagnosticPorts)" ForceInterpreter="$(MonoInterp)" + InvariantGlobalization="$(InvariantGlobalization)" RuntimeHeaders="$(MicrosoftNetCoreAppRuntimePackDir)/native/include/mono-2.0" OutputDir="$(AppDir)" ProjectName="$(Category)" From 05a72a4d9f8f67c6fb7003c3ba61b767d7cc5c10 Mon Sep 17 00:00:00 2001 From: David Nguyen <87228593+davidnguyen-tech@users.noreply.github.com> Date: Fri, 11 Jul 2025 10:31:11 +0000 Subject: [PATCH 06/12] Increase property count to make space for invariant globalization --- src/tasks/AndroidAppBuilder/Templates/monodroid-coreclr.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tasks/AndroidAppBuilder/Templates/monodroid-coreclr.c b/src/tasks/AndroidAppBuilder/Templates/monodroid-coreclr.c index f973a886c9555a..f13d649286ec7f 100644 --- a/src/tasks/AndroidAppBuilder/Templates/monodroid-coreclr.c +++ b/src/tasks/AndroidAppBuilder/Templates/monodroid-coreclr.c @@ -182,7 +182,7 @@ mono_droid_execute_assembly (const char* executable_path, void* coreclr_handle, return rv; } -#define PROPERTY_COUNT 3 +#define PROPERTY_COUNT 4 static int mono_droid_runtime_init (const char* executable) From fe581cafb09548f47125ddb32f1d84fb9db0779c Mon Sep 17 00:00:00 2001 From: David Nguyen <87228593+davidnguyen-tech@users.noreply.github.com> Date: Fri, 11 Jul 2025 10:33:00 +0000 Subject: [PATCH 07/12] Set the invariant globalization AppContext to match the env variable --- .../AndroidAppBuilder/Templates/monodroid-coreclr.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/tasks/AndroidAppBuilder/Templates/monodroid-coreclr.c b/src/tasks/AndroidAppBuilder/Templates/monodroid-coreclr.c index f13d649286ec7f..e4405710b23634 100644 --- a/src/tasks/AndroidAppBuilder/Templates/monodroid-coreclr.c +++ b/src/tasks/AndroidAppBuilder/Templates/monodroid-coreclr.c @@ -210,6 +210,7 @@ mono_droid_runtime_init (const char* executable) appctx_keys[0] = "RUNTIME_IDENTIFIER"; appctx_keys[1] = "APP_CONTEXT_BASE_DIRECTORY"; appctx_keys[2] = "HOST_RUNTIME_CONTRACT"; + appctx_keys[3] = "System.Globalization.Invariant"; const char* appctx_values[PROPERTY_COUNT]; appctx_values[0] = ANDROID_RUNTIME_IDENTIFIER; @@ -219,6 +220,14 @@ mono_droid_runtime_init (const char* executable) snprintf(contract_str, 19, "0x%zx", (size_t)(&g_host_contract)); appctx_values[2] = contract_str; + const char* invariant_env = getenv("DOTNET_SYSTEM_GLOBALIZATION_INVARIANT"); + const char* invariant_value = "false"; // Default to false + if (invariant_env != NULL && (strcmp(invariant_env, "1") == 0 || strcmp(invariant_env, "true") == 0)) + { + invariant_value = "true"; + } + appctx_values[3] = invariant_value; + LOG_INFO ("Calling coreclr_initialize"); int rv = coreclr_initialize ( g_executable_path, From 1e895470e861d233579f858a6091580fe09710cd Mon Sep 17 00:00:00 2001 From: David Nguyen <87228593+davidnguyen-tech@users.noreply.github.com> Date: Fri, 11 Jul 2025 10:33:55 +0000 Subject: [PATCH 08/12] Remove Invariant.Tests.csproj exclusion --- src/libraries/tests.proj | 1 - 1 file changed, 1 deletion(-) diff --git a/src/libraries/tests.proj b/src/libraries/tests.proj index 5641c763c36977..ffeb39af997abd 100644 --- a/src/libraries/tests.proj +++ b/src/libraries/tests.proj @@ -231,7 +231,6 @@ - From 3b9064c3430b888977a2bbf0bf6128c278c6ef85 Mon Sep 17 00:00:00 2001 From: David Nguyen <87228593+davidnguyen-tech@users.noreply.github.com> Date: Fri, 11 Jul 2025 12:07:00 +0000 Subject: [PATCH 09/12] Remove setting the invariant globalization in AppContext, since setting env variables is sufficient --- .../AndroidAppBuilder/Templates/monodroid-coreclr.c | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/src/tasks/AndroidAppBuilder/Templates/monodroid-coreclr.c b/src/tasks/AndroidAppBuilder/Templates/monodroid-coreclr.c index e4405710b23634..f973a886c9555a 100644 --- a/src/tasks/AndroidAppBuilder/Templates/monodroid-coreclr.c +++ b/src/tasks/AndroidAppBuilder/Templates/monodroid-coreclr.c @@ -182,7 +182,7 @@ mono_droid_execute_assembly (const char* executable_path, void* coreclr_handle, return rv; } -#define PROPERTY_COUNT 4 +#define PROPERTY_COUNT 3 static int mono_droid_runtime_init (const char* executable) @@ -210,7 +210,6 @@ mono_droid_runtime_init (const char* executable) appctx_keys[0] = "RUNTIME_IDENTIFIER"; appctx_keys[1] = "APP_CONTEXT_BASE_DIRECTORY"; appctx_keys[2] = "HOST_RUNTIME_CONTRACT"; - appctx_keys[3] = "System.Globalization.Invariant"; const char* appctx_values[PROPERTY_COUNT]; appctx_values[0] = ANDROID_RUNTIME_IDENTIFIER; @@ -220,14 +219,6 @@ mono_droid_runtime_init (const char* executable) snprintf(contract_str, 19, "0x%zx", (size_t)(&g_host_contract)); appctx_values[2] = contract_str; - const char* invariant_env = getenv("DOTNET_SYSTEM_GLOBALIZATION_INVARIANT"); - const char* invariant_value = "false"; // Default to false - if (invariant_env != NULL && (strcmp(invariant_env, "1") == 0 || strcmp(invariant_env, "true") == 0)) - { - invariant_value = "true"; - } - appctx_values[3] = invariant_value; - LOG_INFO ("Calling coreclr_initialize"); int rv = coreclr_initialize ( g_executable_path, From 729d70c62ebba4e6bd2a0683dad2753e455f00a5 Mon Sep 17 00:00:00 2001 From: David Nguyen <87228593+davidnguyen-tech@users.noreply.github.com> Date: Fri, 11 Jul 2025 12:40:59 +0000 Subject: [PATCH 10/12] Remove comment --- src/tasks/AndroidAppBuilder/ApkBuilder.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/tasks/AndroidAppBuilder/ApkBuilder.cs b/src/tasks/AndroidAppBuilder/ApkBuilder.cs index 6a7e9d56669328..df0772393e73a8 100644 --- a/src/tasks/AndroidAppBuilder/ApkBuilder.cs +++ b/src/tasks/AndroidAppBuilder/ApkBuilder.cs @@ -424,7 +424,6 @@ public ApkBuilder(TaskLoggingHelper logger) envVariables += $"\t\tsetEnv(\"{name}\", \"{value}\");\n"; } - // Set invariant globalization environment variable if enabled if (InvariantGlobalization) { envVariables += $"\t\tsetEnv(\"DOTNET_SYSTEM_GLOBALIZATION_INVARIANT\", \"true\");\n"; From 66f8c0121711a279d0f5b7f84e69da501d33f0c9 Mon Sep 17 00:00:00 2001 From: David Nguyen <87228593+davidnguyen-tech@users.noreply.github.com> Date: Mon, 14 Jul 2025 11:28:43 +0000 Subject: [PATCH 11/12] Remove globalization tests exclusions --- src/libraries/tests.proj | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/libraries/tests.proj b/src/libraries/tests.proj index ffeb39af997abd..82f68154fcabcd 100644 --- a/src/libraries/tests.proj +++ b/src/libraries/tests.proj @@ -234,10 +234,7 @@ - - - From 9aef454ac482ec022351c58c85f79b046543cc42 Mon Sep 17 00:00:00 2001 From: David Nguyen <87228593+davidnguyen-tech@users.noreply.github.com> Date: Mon, 14 Jul 2025 13:34:52 +0000 Subject: [PATCH 12/12] Exclude globalizations tests again (undo changes) --- src/libraries/tests.proj | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/libraries/tests.proj b/src/libraries/tests.proj index 82f68154fcabcd..ffeb39af997abd 100644 --- a/src/libraries/tests.proj +++ b/src/libraries/tests.proj @@ -234,7 +234,10 @@ + + +