diff --git a/src/tasks/AndroidAppBuilder/AndroidAppBuilder.csproj b/src/tasks/AndroidAppBuilder/AndroidAppBuilder.csproj
index 00b863c5ea59a4..5614e09c8b106d 100644
--- a/src/tasks/AndroidAppBuilder/AndroidAppBuilder.csproj
+++ b/src/tasks/AndroidAppBuilder/AndroidAppBuilder.csproj
@@ -5,6 +5,7 @@
true
false
enable
+ true
$(NoWarn),CA1050,CA1850
diff --git a/src/tasks/AndroidAppBuilder/ApkBuilder.cs b/src/tasks/AndroidAppBuilder/ApkBuilder.cs
index 109583df46120f..30e79a29dfdf8a 100644
--- a/src/tasks/AndroidAppBuilder/ApkBuilder.cs
+++ b/src/tasks/AndroidAppBuilder/ApkBuilder.cs
@@ -6,6 +6,7 @@
using System.IO;
using System.IO.Compression;
using System.Linq;
+using System.Reflection.Metadata;
using System.Text;
using System.Text.Json;
using System.Text.RegularExpressions;
@@ -705,19 +706,32 @@ private string RenderMonodroidCoreClrTemplate(string monodroidContent)
private Dictionary ParseRuntimeConfigProperties()
{
+ // This method reads the binary runtimeconfig.bin file created by RuntimeConfigParserTask.ConvertDictionaryToBlob.
+ // The binary format is: compressed integer count, followed by count pairs of length-prefixed UTF8 strings (key, value).
+ // See src/tasks/MonoTargetsTasks/RuntimeConfigParser/RuntimeConfigParser.cs for the corresponding write logic.
+
var configProperties = new Dictionary();
- string runtimeConfigPath = Path.Combine(AppDir ?? throw new InvalidOperationException("AppDir is not set"), $"{ProjectName}.runtimeconfig.json");
+ string runtimeConfigPath = Path.Combine(AppDir ?? throw new InvalidOperationException("AppDir is not set"), "runtimeconfig.bin");
try
{
- string jsonContent = File.ReadAllText(runtimeConfigPath);
- using JsonDocument doc = JsonDocument.Parse(jsonContent);
- JsonElement root = doc.RootElement;
- if (root.TryGetProperty("runtimeOptions", out JsonElement runtimeOptions) && runtimeOptions.TryGetProperty("configProperties", out JsonElement propertiesJson))
+ byte[] fileBytes = File.ReadAllBytes(runtimeConfigPath);
+ unsafe
{
- foreach (JsonProperty property in propertiesJson.EnumerateObject())
+ fixed (byte* ptr = fileBytes)
{
- configProperties[property.Name] = property.Value.ToString();
+ var blobReader = new BlobReader(ptr, fileBytes.Length);
+
+ // Read the compressed integer count
+ int count = blobReader.ReadCompressedInteger();
+
+ // Read each key-value pair
+ for (int i = 0; i < count; i++)
+ {
+ string key = blobReader.ReadSerializedString() ?? string.Empty;
+ string value = blobReader.ReadSerializedString() ?? string.Empty;
+ configProperties[key] = value;
+ }
}
}
}
diff --git a/src/tasks/TestExclusionListTasks/TestExclusionListTasks.csproj b/src/tasks/TestExclusionListTasks/TestExclusionListTasks.csproj
index ffc0d16e0ea031..87270cd0634dd8 100644
--- a/src/tasks/TestExclusionListTasks/TestExclusionListTasks.csproj
+++ b/src/tasks/TestExclusionListTasks/TestExclusionListTasks.csproj
@@ -6,6 +6,7 @@
false
enable
$(NoWarn),CA1050,CA1850
+ true