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