From 3524476d199a284a737ca591fd963302101dd1e7 Mon Sep 17 00:00:00 2001 From: Jonathan Peppers Date: Tue, 28 Feb 2023 17:35:01 -0600 Subject: [PATCH 01/13] $(AndroidPackVersionSuffix)=preview.3; net8 is 34.0.0-preview.3 (#7839) Context: https://github.com/xamarin/xamarin-android/tree/release/8.0.1xx-preview2 We branched for .NET 8 preview 2 from d0701eb into `release/8.0.1xx-preview2`. Update xamarin-android/main's version number to 34.0.0-preview.3 for .NET 8 preview 3. --- Directory.Build.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Directory.Build.props b/Directory.Build.props index 33a80a4adcf..df130024544 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -35,7 +35,7 @@ * Bump first digit of the patch version for feature releases (and reset the first two digits to 0) --> 34.0.0 - preview.2 + preview.3 From 5d68699061cfa8150531bdb694aeac61120954ae Mon Sep 17 00:00:00 2001 From: Eric Erhardt Date: Tue, 28 Feb 2023 21:07:32 -0600 Subject: [PATCH 02/13] Replace K4os.Hash.xxHash with System.IO.Hashing (#7831) This allows us to remove an external dependency and use code from dotnet/runtime. Update `create-installers.targets` to include `System.IO.Hashing.dll` and remove `K4os.Hash.xxHash.dll`. --- build-tools/installers/create-installers.targets | 2 +- eng/Version.Details.xml | 4 ++++ eng/Versions.props | 1 + .../Utilities/AssemblyStoreIndexEntry.cs | 7 +++---- .../Utilities/LlvmIrGenerator/LlvmIrComposer.cs | 7 +++---- .../Utilities/TypeMappingReleaseNativeAssemblyGenerator.cs | 6 +++--- .../Xamarin.Android.Build.Tasks.csproj | 2 +- 7 files changed, 16 insertions(+), 13 deletions(-) diff --git a/build-tools/installers/create-installers.targets b/build-tools/installers/create-installers.targets index 7cd264758a6..4ed80da1171 100644 --- a/build-tools/installers/create-installers.targets +++ b/build-tools/installers/create-installers.targets @@ -270,6 +270,7 @@ <_MSBuildFiles Include="$(MicrosoftAndroidSdkOutDir)System.CodeDom.dll" /> <_MSBuildFiles Include="$(MicrosoftAndroidSdkOutDir)System.Collections.Immutable.dll" /> <_MSBuildFiles Include="$(MicrosoftAndroidSdkOutDir)System.Buffers.dll" /> + <_MSBuildFiles Include="$(MicrosoftAndroidSdkOutDir)System.IO.Hashing.dll" /> <_MSBuildFiles Include="$(MicrosoftAndroidSdkOutDir)Xamarin.Android.Aapt.targets" ExcludeFromAndroidNETSdk="true" /> <_MSBuildFiles Include="$(MicrosoftAndroidSdkOutDir)Xamarin.Android.Aapt2.targets" /> <_MSBuildFiles Include="$(MicrosoftAndroidSdkOutDir)Xamarin.Android.Analysis.targets" /> @@ -315,7 +316,6 @@ <_MSBuildFiles Include="$(MicrosoftAndroidSdkOutDir)Xamarin.Build.AsyncTask.dll" /> <_MSBuildFiles Include="$(MicrosoftAndroidSdkOutDir)Xamarin.Build.AsyncTask.pdb" /> <_MSBuildFiles Include="$(MicrosoftAndroidSdkOutDir)K4os.Compression.LZ4.dll" /> - <_MSBuildFiles Include="$(MicrosoftAndroidSdkOutDir)K4os.Hash.xxHash.dll" /> <_MSBuildFiles Include="$(MicrosoftAndroidSdkOutDir)ELFSharp.dll" /> <_MSBuildFiles Include="$(MicrosoftAndroidSdkOutDir)ManifestOverlays\Timing.xml" /> diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 548edd16819..8cde5bb99d6 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -16,6 +16,10 @@ https://github.com/dotnet/emsdk d7ff0aa47c680be543905cc1410e2f62b54dfefe + + https://github.com/dotnet/runtime + 9529803ae29c2804880c6bd8ca710b8c037cb498 + diff --git a/eng/Versions.props b/eng/Versions.props index c8776a79cd2..0a14f1f09ab 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -9,6 +9,7 @@ 8.0.0-preview.2.23113.1 $(MicrosoftNETWorkloadEmscriptenCurrentManifest80100preview2Version) 7.0.100-rc.1.22410.7 + 8.0.0-alpha.1.23080.2 diff --git a/src/Xamarin.Android.Build.Tasks/Utilities/AssemblyStoreIndexEntry.cs b/src/Xamarin.Android.Build.Tasks/Utilities/AssemblyStoreIndexEntry.cs index 59f012f5142..51d2bd8ca77 100644 --- a/src/Xamarin.Android.Build.Tasks/Utilities/AssemblyStoreIndexEntry.cs +++ b/src/Xamarin.Android.Build.Tasks/Utilities/AssemblyStoreIndexEntry.cs @@ -1,8 +1,7 @@ using System; +using System.IO.Hashing; using System.Text; -using K4os.Hash.xxHash; - namespace Xamarin.Android.Tasks { class AssemblyStoreIndexEntry @@ -37,8 +36,8 @@ public AssemblyStoreIndexEntry (string name, uint blobID, uint mappingIndex, uin LocalBlobIndex = localBlobIndex; byte[] nameBytes = Encoding.UTF8.GetBytes (name); - NameHash32 = XXH32.DigestOf (nameBytes, 0, nameBytes.Length); - NameHash64 = XXH64.DigestOf (nameBytes, 0, nameBytes.Length); + NameHash32 = XxHash32.HashToUInt32 (nameBytes); + NameHash64 = XxHash64.HashToUInt64 (nameBytes); } } } diff --git a/src/Xamarin.Android.Build.Tasks/Utilities/LlvmIrGenerator/LlvmIrComposer.cs b/src/Xamarin.Android.Build.Tasks/Utilities/LlvmIrGenerator/LlvmIrComposer.cs index 734ece97e18..374a432e76a 100644 --- a/src/Xamarin.Android.Build.Tasks/Utilities/LlvmIrGenerator/LlvmIrComposer.cs +++ b/src/Xamarin.Android.Build.Tasks/Utilities/LlvmIrGenerator/LlvmIrComposer.cs @@ -1,9 +1,8 @@ using System; using System.IO; +using System.IO.Hashing; using System.Text; -using K4os.Hash.xxHash; - using Xamarin.Android.Tools; namespace Xamarin.Android.Tasks.LLVMIR @@ -45,10 +44,10 @@ protected ulong HashName (string name, bool is64Bit) { byte[] nameBytes = Encoding.UTF8.GetBytes (name); if (is64Bit) { - return XXH64.DigestOf (nameBytes, 0, nameBytes.Length); + return XxHash64.HashToUInt64 (nameBytes); } - return (ulong)XXH32.DigestOf (nameBytes, 0, nameBytes.Length); + return (ulong)XxHash32.HashToUInt32 (nameBytes); } protected virtual void InitGenerator (LlvmIrGenerator generator) diff --git a/src/Xamarin.Android.Build.Tasks/Utilities/TypeMappingReleaseNativeAssemblyGenerator.cs b/src/Xamarin.Android.Build.Tasks/Utilities/TypeMappingReleaseNativeAssemblyGenerator.cs index 1152841c654..bc407b478aa 100644 --- a/src/Xamarin.Android.Build.Tasks/Utilities/TypeMappingReleaseNativeAssemblyGenerator.cs +++ b/src/Xamarin.Android.Build.Tasks/Utilities/TypeMappingReleaseNativeAssemblyGenerator.cs @@ -1,9 +1,9 @@ using System; using System.Collections.Generic; +using System.IO.Hashing; using System.Linq; using System.Text; -using K4os.Hash.xxHash; using Xamarin.Android.Tasks.LLVMIR; namespace Xamarin.Android.Tasks @@ -306,10 +306,10 @@ ulong HashName (string name) ulong HashBytes (byte[] bytes) { if (is64Bit) { - return XXH64.DigestOf (bytes, 0, bytes.Length); + return XxHash64.HashToUInt64 (bytes); } - return (ulong)XXH32.DigestOf (bytes, 0, bytes.Length); + return (ulong)XxHash32.HashToUInt32 (bytes); } } diff --git a/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Build.Tasks.csproj b/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Build.Tasks.csproj index ad980b06223..b677c0ece0e 100644 --- a/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Build.Tasks.csproj +++ b/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Build.Tasks.csproj @@ -52,10 +52,10 @@ + - From ef3e7ce4e0df53930acb02c056f9d03efe9af8e5 Mon Sep 17 00:00:00 2001 From: Jonathan Peppers Date: Wed, 1 Mar 2023 13:00:02 -0600 Subject: [PATCH 03/13] [build] pass `--skip-sign-check` to `dotnet workload` (#7840) Context: https://devdiv.visualstudio.com/DevDiv/_build/results?buildId=7397299&view=logs&j=28f7b402-0b52-5743-3f46-b0c973acb4f8&t=06392762-0cbe-5837-5fae-a131d329206a&l=81 Context: 978b74f69ec049317501bd58f1f4a9073d13db46 Many times on release branches, parts of the .NET installer are signed, and we need to allow unsigned workloads to be installed via the `--skip-sign-check` flag: Rolling back pack Microsoft.Android.Sdk.Windows installation... Workload installation failed: Failed to validate package signing. Verifying Microsoft.Android.Sdk.Windows.34.0.0-ci.darc-release-8-0-1xx-preview2-cef50a92-f62d-4147-9b74-08689588cab8.180 This is testing a local build of the `android` workload, so it will not be signed at this stage. Let's put this change in main, so we don't have to keep doing this release branches. --- build-tools/create-packs/Directory.Build.targets | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/build-tools/create-packs/Directory.Build.targets b/build-tools/create-packs/Directory.Build.targets index 8cb06e245c0..ff6d4f99933 100644 --- a/build-tools/create-packs/Directory.Build.targets +++ b/build-tools/create-packs/Directory.Build.targets @@ -129,6 +129,7 @@ <_InstallArguments Include="android" /> <_InstallArguments Include="android-$(AndroidLatestUnstableApiLevel)" Condition=" '@(_PreviewPacks->Count())' != '0' " /> <_InstallArguments Include="--skip-manifest-update" /> + <_InstallArguments Include="--skip-sign-check" /> <_InstallArguments Include="--verbosity diag" /> <_InstallArguments Include="--source "%(_NuGetSources.Identity)"" /> <_InstallArguments Include="--temp-dir "$(_TempDirectory)"" /> @@ -278,7 +279,7 @@ Overwrite="true" /> From 58c31dca361a6ae7e26dfaa4eb5a88c2bc6597ba Mon Sep 17 00:00:00 2001 From: Peter Collins Date: Wed, 1 Mar 2023 17:45:06 -0500 Subject: [PATCH 04/13] [ci] Use compliance stage template (#7818) Context: https://github.com/xamarin/yaml-templates/blob/b186f6181c088c34bbf5dd210a343598f3e45489/security/full/v0.yml Updates our compliance stage to use the universal compliance template, ensuring that we run all required tasks and their latest versions. The `policheck-rules-db.mdb` file has been replaced with `.gdnsuppress` files, which are generated by the compliance build. These files provide a more convenient way to exclude specific "invalid" PoliCheck failures. If a new PoliCheck failure arises in the future that should be excluded, we can copy the entry for it from the `.gdnsuppress` file produced by the build and add it to the file we have in our sources. --- build-tools/automation/azure-pipelines.yaml | 74 ++---- .../automation/guardian/CHT.gdnsuppress | 26 ++ .../{ => guardian}/CredScanSuppressions.json | 0 .../PoliCheck.Exclusions.xml} | 7 +- .../automation/guardian/source.gdnsuppress | 236 ++++++++++++++++++ .../automation/guardian/tsaoptions-v2.json | 11 + build-tools/automation/policheck-rules-db.mdb | Bin 393216 -> 0 bytes .../BindingDatabase.cs | 22 +- 8 files changed, 312 insertions(+), 64 deletions(-) create mode 100644 build-tools/automation/guardian/CHT.gdnsuppress rename build-tools/automation/{ => guardian}/CredScanSuppressions.json (100%) rename build-tools/automation/{PoliCheckExclusions.xml => guardian/PoliCheck.Exclusions.xml} (51%) create mode 100644 build-tools/automation/guardian/source.gdnsuppress create mode 100644 build-tools/automation/guardian/tsaoptions-v2.json delete mode 100644 build-tools/automation/policheck-rules-db.mdb diff --git a/build-tools/automation/azure-pipelines.yaml b/build-tools/automation/azure-pipelines.yaml index 6e7fa3f3b5c..de78de7422a 100644 --- a/build-tools/automation/azure-pipelines.yaml +++ b/build-tools/automation/azure-pipelines.yaml @@ -1147,54 +1147,26 @@ stages: packageFilter: '*.nupkg;*.msi;*.pkg;*.vsix' GitHub.Token: $(GitHub.Token) -- stage: tenets - dependsOn: [] - displayName: Tenets - jobs: - # Check - "Xamarin.Android (Tenets Code Analysis)" - - job: run_static_analysis - displayName: Code Analysis - pool: - vmImage: $(HostedWinImage) - timeoutInMinutes: 60 - cancelTimeoutInMinutes: 5 - steps: - - checkout: self - submodules: recursive - - - template: security\credscan\v2.yml@yaml-templates - parameters: - suppressionsFile: $(System.DefaultWorkingDirectory)\build-tools\automation\CredScanSuppressions.json - - - template: security\policheck\v1.yml@yaml-templates - parameters: - exclusionFile: $(System.DefaultWorkingDirectory)\build-tools\automation\PoliCheckExclusions.xml - pE: 1|2|3|4 - rulesDBPath: $(System.DefaultWorkingDirectory)\build-tools\automation\policheck-rules-db.mdb - - - task: securedevelopmentteam.vss-secure-development-tools.build-task-antimalware.AntiMalware@3 - displayName: Run AntiMalware (Defender) Scan - inputs: - FileDirPath: $(System.DefaultWorkingDirectory) - EnableServices: true - condition: succeededOrFailed() - - - task: securedevelopmentteam.vss-secure-development-tools.build-task-report.SdtReport@1 - displayName: Create Security Analysis Report - inputs: - CredScan: true - PoliCheck: true - condition: succeededOrFailed() - - - task: securedevelopmentteam.vss-secure-development-tools.build-task-publishsecurityanalysislogs.PublishSecurityAnalysisLogs@2 - displayName: Publish Security Analysis Logs - inputs: - ArtifactName: CodeAnalysisLogs - condition: succeededOrFailed() - - - task: securedevelopmentteam.vss-secure-development-tools.build-task-postanalysis.PostAnalysis@1 - displayName: Fail Job if Security Issues are Detected - inputs: - CredScan: true - PoliCheck: true - condition: succeededOrFailed() +# Check - "Xamarin.Android (Compliance)" +- template: security/full/v0.yml@yaml-templates + parameters: + stageDependsOn: [] + credScanSuppressionFile: $(Build.SourcesDirectory)\build-tools\automation\guardian\CredScanSuppressions.json + sourceGdnSuppressionFile: $(Build.SourcesDirectory)\build-tools\automation\guardian\source.gdnsuppress + tsaConfigFile: $(Build.SourcesDirectory)\build-tools\automation\guardian\tsaoptions-v2.json + policheckLocScanEnabled: true + policheckExclusionFilesFolder: $(Build.SourcesDirectory)\build-tools\automation\guardian + policheckGdnSuppressionFilesFolder: $(Build.SourcesDirectory)\build-tools\automation\guardian + policheckChsScanFolder: $(Build.SourcesDirectory)\Localize\loc\zh-Hans + policheckChtScanFolder: $(Build.SourcesDirectory)\Localize\loc\zh-Hant + policheckCsyScanFolder: $(Build.SourcesDirectory)\Localize\loc\cs + policheckDeuScanFolder: $(Build.SourcesDirectory)\Localize\loc\de + policheckEsnScanFolder: $(Build.SourcesDirectory)\Localize\loc\es + policheckFraScanFolder: $(Build.SourcesDirectory)\Localize\loc\fr + policheckItaScanFolder: $(Build.SourcesDirectory)\Localize\loc\it + policheckJpnScanFolder: $(Build.SourcesDirectory)\Localize\loc\ja + policheckKorScanFolder: $(Build.SourcesDirectory)\Localize\loc\ko + policheckPlkScanFolder: $(Build.SourcesDirectory)\Localize\loc\pl + policheckPtbScanFolder: $(Build.SourcesDirectory)\Localize\loc\pt-BR + policheckRusScanFolder: $(Build.SourcesDirectory)\Localize\loc\ru + policheckTrkScanFolder: $(Build.SourcesDirectory)\Localize\loc\tr diff --git a/build-tools/automation/guardian/CHT.gdnsuppress b/build-tools/automation/guardian/CHT.gdnsuppress new file mode 100644 index 00000000000..4396a9a378a --- /dev/null +++ b/build-tools/automation/guardian/CHT.gdnsuppress @@ -0,0 +1,26 @@ +{ + "version": "latest", + "suppressionSets": { + "default": { + "name": "default", + "createdDate": "2023-02-24 00:05:39Z", + "lastUpdatedDate": "2023-02-24 00:05:39Z" + } + }, + "results": { + "04910d714a13bf4523ffa77350f654f52114fa4fa3d760c9f63186d41716c019": { + "signature": "04910d714a13bf4523ffa77350f654f52114fa4fa3d760c9f63186d41716c019", + "alternativeSignatures": [], + "target": "Localize/loc/zh-Hant/src/Xamarin.Android.Build.Tasks/Properties/Resources.resx.lcl", + "memberOf": [ + "default" + ], + "tool": "policheck", + "ruleId": "64550", + "justification": "Reference to the Android package format APK.", + "createdDate": "2023-02-24 00:05:39Z", + "expirationDate": null, + "type": null + } + } +} diff --git a/build-tools/automation/CredScanSuppressions.json b/build-tools/automation/guardian/CredScanSuppressions.json similarity index 100% rename from build-tools/automation/CredScanSuppressions.json rename to build-tools/automation/guardian/CredScanSuppressions.json diff --git a/build-tools/automation/PoliCheckExclusions.xml b/build-tools/automation/guardian/PoliCheck.Exclusions.xml similarity index 51% rename from build-tools/automation/PoliCheckExclusions.xml rename to build-tools/automation/guardian/PoliCheck.Exclusions.xml index 4ec72dc9b23..3df47bb4a1a 100644 --- a/build-tools/automation/PoliCheckExclusions.xml +++ b/build-tools/automation/guardian/PoliCheck.Exclusions.xml @@ -1,10 +1,13 @@ - NREFACTORY + LICENSE-DATA|NREFACTORY|LOCALIZE - REMAINING-INT-CONSTS.TXT|TAIWANCALENDAR.XML|XAMARIN-ANDROID-SDK-9.XML|SQLITE3.C|MAP.CSV + REMAINING-INT-CONSTS.TXT|TAIWANCALENDAR.XML|XAMARIN-ANDROID-SDK-9.XML|SQLITE3.C|MAP.CSV|METHODMAP.EXT.CSV|EXTERNALWHITELIST.CSV|SYMBOLARCHIVEWHITELIST.CSV|POLICHECK.EXCLUSIONS.xml +|API-10.PARAMS.TXT|API-15.PARAMS.TXT|API-16.PARAMS.TXT|API-17.PARAMS.TXT|API-18.PARAMS.TXT|API-19.PARAMS.TXT|API-20.PARAMS.TXT|API-21.PARAMS.TXT|API-22.PARAMS.TXT|API-23.PARAMS.TXT|API-24.PARAMS.TXT +|API-25.PARAMS.TXT|API-26.PARAMS.TXT|API-27.PARAMS.TXT|API-28.PARAMS.TXT|API-29.PARAMS.TXT|API-30.PARAMS.TXT|API-31.PARAMS.TXT|API-32.PARAMS.TXT|API-33.PARAMS.TXT + diff --git a/build-tools/automation/guardian/source.gdnsuppress b/build-tools/automation/guardian/source.gdnsuppress new file mode 100644 index 00000000000..98123d3e81c --- /dev/null +++ b/build-tools/automation/guardian/source.gdnsuppress @@ -0,0 +1,236 @@ +{ + "version": "latest", + "suppressionSets": { + "default": { + "name": "default", + "createdDate": "2023-02-22 23:55:29Z", + "lastUpdatedDate": "2023-02-22 23:55:29Z" + } + }, + "results": { + "5a0a8690d8a06dfdbf6002c67fa64a60a94f3fc77a594034cce20382e88002aa": { + "signature": "5a0a8690d8a06dfdbf6002c67fa64a60a94f3fc77a594034cce20382e88002aa", + "alternativeSignatures": [], + "target": "src/Xamarin.Android.Build.Tasks/Xamarin.Android.Build.Tasks.csproj", + "memberOf": [ + "default" + ], + "tool": "policheck", + "ruleId": "79459", + "justification": "Reference to an external source file.", + "createdDate": "2023-02-22 23:55:29Z", + "expirationDate": null, + "type": null + }, + "1b319055b8e507b220d0dab341e67e20f49632fd1844a08a4fcc6d4493930ac5": { + "signature": "1b319055b8e507b220d0dab341e67e20f49632fd1844a08a4fcc6d4493930ac5", + "alternativeSignatures": [], + "target": "src/Xamarin.Android.Build.Tasks/Xamarin.Android.Build.Tasks.csproj", + "memberOf": [ + "default" + ], + "tool": "policheck", + "ruleId": "79459", + "justification": "Reference to an external source file.", + "createdDate": "2023-02-22 23:55:29Z", + "expirationDate": null, + "type": null + }, + "6789cab1bdc97b0cc3ad057b7fdd21d63cdf8bc2679391923803fa240ef81292": { + "signature": "6789cab1bdc97b0cc3ad057b7fdd21d63cdf8bc2679391923803fa240ef81292", + "alternativeSignatures": [], + "target": "Documentation/guides/building-apps/build-properties.md", + "memberOf": [ + "default" + ], + "tool": "policheck", + "ruleId": "185843", + "justification": "Reference to an ISCII term.", + "createdDate": "2023-02-22 23:55:29Z", + "expirationDate": null, + "type": null + }, + "bbaf5f946cb72748567e41f0df5f1bae05550f4ba7381e21ec6b26d6c3ecec9f": { + "signature": "bbaf5f946cb72748567e41f0df5f1bae05550f4ba7381e21ec6b26d6c3ecec9f", + "alternativeSignatures": [], + "target": "Documentation/guides/building-apps/build-properties.md", + "memberOf": [ + "default" + ], + "tool": "policheck", + "ruleId": "185837", + "justification": "Reference to an ISCII term.", + "createdDate": "2023-02-22 23:55:29Z", + "expirationDate": null, + "type": null + }, + "db8916a0f0cdca4082c540921dd362e09a9ff413862ab826308411b76ee35789": { + "signature": "db8916a0f0cdca4082c540921dd362e09a9ff413862ab826308411b76ee35789", + "alternativeSignatures": [], + "target": "src/Mono.Android/Android.Util/Log.cs", + "memberOf": [ + "default" + ], + "tool": "policheck", + "ruleId": "80418", + "justification": "Reference to an Android logging function.", + "createdDate": "2023-02-22 23:55:29Z", + "expirationDate": null, + "type": null + }, + "58fab4dfef38677720e955e546a6af108332c65daafb0d043ad9d93442300a30": { + "signature": "58fab4dfef38677720e955e546a6af108332c65daafb0d043ad9d93442300a30", + "alternativeSignatures": [], + "target": "src/Mono.Android/Android.Util/Log.cs", + "memberOf": [ + "default" + ], + "tool": "policheck", + "ruleId": "80418", + "justification": "Reference to an Android logging function.", + "createdDate": "2023-02-22 23:55:29Z", + "expirationDate": null, + "type": null + }, + "b07e75fc8a506b94690dbd06877da06c1228e40e7deda3967f6b882b842f726d": { + "signature": "b07e75fc8a506b94690dbd06877da06c1228e40e7deda3967f6b882b842f726d", + "alternativeSignatures": [], + "target": "src/Mono.Android/Android.Util/Log.cs", + "memberOf": [ + "default" + ], + "tool": "policheck", + "ruleId": "80418", + "justification": "Reference to an Android logging function.", + "createdDate": "2023-02-22 23:55:29Z", + "expirationDate": null, + "type": null + }, + "87d8313310c2dd42021844b95bdcb9121bf10036fea5b212b945e0732a456e5a": { + "signature": "87d8313310c2dd42021844b95bdcb9121bf10036fea5b212b945e0732a456e5a", + "alternativeSignatures": [], + "target": "src/Mono.Android/Android.Util/Log.cs", + "memberOf": [ + "default" + ], + "tool": "policheck", + "ruleId": "80418", + "justification": "Reference to an Android logging function.", + "createdDate": "2023-02-22 23:55:29Z", + "expirationDate": null, + "type": null + }, + "8e5400e0233c8d887ad48bd8a48e8a7be5a579f9eefad521419b6df0828bbfac": { + "signature": "8e5400e0233c8d887ad48bd8a48e8a7be5a579f9eefad521419b6df0828bbfac", + "alternativeSignatures": [], + "target": "src/Mono.Android/Android.Util/Log.cs", + "memberOf": [ + "default" + ], + "tool": "policheck", + "ruleId": "80418", + "justification": "Reference to an Android logging function.", + "createdDate": "2023-02-22 23:55:29Z", + "expirationDate": null, + "type": null + }, + "06af52be6b6f87455b1db2eb6e631e783f1dacaf607c9b5f34cdee669992c8b5": { + "signature": "06af52be6b6f87455b1db2eb6e631e783f1dacaf607c9b5f34cdee669992c8b5", + "alternativeSignatures": [], + "target": "src/Mono.Android/Android.Util/Log.cs", + "memberOf": [ + "default" + ], + "tool": "policheck", + "ruleId": "80418", + "justification": "Reference to an Android logging function.", + "createdDate": "2023-02-22 23:55:29Z", + "expirationDate": null, + "type": null + }, + "a2b4d032c59a9d1211d218c3cd550cf8febb369941d70284d07d03ebee855bc0": { + "signature": "a2b4d032c59a9d1211d218c3cd550cf8febb369941d70284d07d03ebee855bc0", + "alternativeSignatures": [], + "target": "src/monodroid/jni/logger.cc", + "memberOf": [ + "default" + ], + "tool": "policheck", + "ruleId": "79668", + "justification": "Reference to find first set bit function.", + "createdDate": "2023-02-22 23:55:29Z", + "expirationDate": null, + "type": null + }, + "1c87b45a6044d205dc3f3562f349c238f7cabe22b4609da762df9dc44151e9fb": { + "signature": "1c87b45a6044d205dc3f3562f349c238f7cabe22b4609da762df9dc44151e9fb", + "alternativeSignatures": [], + "target": "src/monodroid/jni/logger.cc", + "memberOf": [ + "default" + ], + "tool": "policheck", + "ruleId": "79668", + "justification": "Reference to find first set bit function.", + "createdDate": "2023-02-22 23:55:29Z", + "expirationDate": null, + "type": null + }, + "a6639098c4785509a4215c9e2fc10f82c06fce461915dc11a00227ddec558845": { + "signature": "a6639098c4785509a4215c9e2fc10f82c06fce461915dc11a00227ddec558845", + "alternativeSignatures": [], + "target": "src/monodroid/jni/logger.cc", + "memberOf": [ + "default" + ], + "tool": "policheck", + "ruleId": "79668", + "justification": "Reference to find first set bit function.", + "createdDate": "2023-02-22 23:55:29Z", + "expirationDate": null, + "type": null + }, + "d6b3df0b1d35cb4acec6a954acc145c9ec22041cd463b94ff080682c65a9bd62": { + "signature": "d6b3df0b1d35cb4acec6a954acc145c9ec22041cd463b94ff080682c65a9bd62", + "alternativeSignatures": [], + "target": "src/monodroid/jni/logger.cc", + "memberOf": [ + "default" + ], + "tool": "policheck", + "ruleId": "79668", + "justification": "Reference to find first set bit function.", + "createdDate": "2023-02-22 23:55:29Z", + "expirationDate": null, + "type": null + }, + "b34b42aa41018376a31460c142f2ae910704725d9e9a4470f92b587df682369b": { + "signature": "b34b42aa41018376a31460c142f2ae910704725d9e9a4470f92b587df682369b", + "alternativeSignatures": [], + "target": "src/Xamarin.Android.Build.Tasks/Tasks/Aapt2.cs", + "memberOf": [ + "default" + ], + "tool": "policheck", + "ruleId": "80411", + "justification": "Reference to output from an external tool.", + "createdDate": "2023-02-22 23:55:29Z", + "expirationDate": null, + "type": null + }, + "75474fa652dbbf8f96826100a5fe37ba686a032ca07d61ef68a79c8e4412c150": { + "signature": "75474fa652dbbf8f96826100a5fe37ba686a032ca07d61ef68a79c8e4412c150", + "alternativeSignatures": [], + "target": "src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/Linker.cs", + "memberOf": [ + "default" + ], + "tool": "policheck", + "ruleId": "79459", + "justification": "Reference to an external source file.", + "createdDate": "2023-02-22 23:55:29Z", + "expirationDate": null, + "type": null + } + } +} diff --git a/build-tools/automation/guardian/tsaoptions-v2.json b/build-tools/automation/guardian/tsaoptions-v2.json new file mode 100644 index 00000000000..21ad8c31a7d --- /dev/null +++ b/build-tools/automation/guardian/tsaoptions-v2.json @@ -0,0 +1,11 @@ +{ + "codebaseName": "xamarin.android_main", + "notificationAliases": [ + "dotnet-android-eng@microsoft.com" + ], + "instanceUrl": "https://devdiv.visualstudio.com/", + "projectName": "DevDiv", + "areaPath": "DevDiv\\VS Client - Runtime SDKs\\Android", + "iterationPath": "DevDiv", + "allTools": true +} diff --git a/build-tools/automation/policheck-rules-db.mdb b/build-tools/automation/policheck-rules-db.mdb deleted file mode 100644 index 02956d95da1c30db3126364b14f92131cffa60d2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 393216 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 c?SE nsmap; Dictionary regs; - List asses = new List (); + List assems = new List (); public BindingDatabase (IEnumerable assemblies, Func resolveAssembly) { - foreach (var assfile in assemblies) { - var ass = resolveAssembly (assfile); - if (ass == null) + foreach (var assemfile in assemblies) { + var assem = resolveAssembly (assemfile); + if (assem == null) throw new InvalidOperationException ("Failed to resolve specified assembly"); - asses.Add (ass); + assems.Add (assem); } Initialize (assemblies, resolveAssembly); } - public BindingDatabase (IEnumerable asses) + public BindingDatabase (IEnumerable assems) { - this.asses.AddRange (asses); + this.assems.AddRange (assems); Initialize (null, null); } @@ -43,17 +43,17 @@ void Initialize (IEnumerable assemblies, Func var r = new Dictionary (); regs = r; - foreach (var ass in asses) { - if (!ass.CustomAttributes.Any (a => a.AttributeType.FullName != "Android.Runtime.NamespaceMappingAttribute")) + foreach (var assem in assems) { + if (!assem.CustomAttributes.Any (a => a.AttributeType.FullName != "Android.Runtime.NamespaceMappingAttribute")) continue; // irrelevant assembly. - foreach (var att in ass.CustomAttributes) { + foreach (var att in assem.CustomAttributes) { if (att.AttributeType.FullName != "Android.Runtime.NamespaceMappingAttribute") continue; string java = (string) att.Properties.First (p => p.Name == "Java").Argument.Value; string cs = (string) att.Properties.First (p => p.Name == "Managed").Argument.Value; d [java] = cs; } - foreach (var md in ass.Modules) + foreach (var md in assem.Modules) foreach (var td in md.Types.Where (t => t.IsPublic || t.IsNestedPublic)) foreach (var att in td.CustomAttributes.Where (a => a.AttributeType.FullName == "Android.Runtime.RegisterAttribute")) r [((string) att.ConstructorArguments [0].Value).Replace ('/', '.').Replace ('$', '.')] = td.FullName; From 6e1e6124117ba219c8738043b4e5463fefd6d108 Mon Sep 17 00:00:00 2001 From: VS MobileTools Engineering Service 2 Date: Wed, 1 Mar 2023 22:29:18 -0500 Subject: [PATCH 05/13] Localized file check-in by OneLocBuild Task (#7842) Context: https://aka.ms/onelocbuild Context: https://aka.ms/AllAboutLoc Build definition ID 17928: Build ID 7401514 --- src/Xamarin.Android.Build.Tasks/Properties/Resources.cs.resx | 4 ++++ src/Xamarin.Android.Build.Tasks/Properties/Resources.de.resx | 4 ++++ src/Xamarin.Android.Build.Tasks/Properties/Resources.es.resx | 4 ++++ src/Xamarin.Android.Build.Tasks/Properties/Resources.fr.resx | 4 ++++ src/Xamarin.Android.Build.Tasks/Properties/Resources.it.resx | 4 ++++ src/Xamarin.Android.Build.Tasks/Properties/Resources.ja.resx | 4 ++++ src/Xamarin.Android.Build.Tasks/Properties/Resources.ko.resx | 4 ++++ src/Xamarin.Android.Build.Tasks/Properties/Resources.pl.resx | 4 ++++ .../Properties/Resources.pt-BR.resx | 4 ++++ src/Xamarin.Android.Build.Tasks/Properties/Resources.ru.resx | 4 ++++ src/Xamarin.Android.Build.Tasks/Properties/Resources.tr.resx | 4 ++++ .../Properties/Resources.zh-Hans.resx | 4 ++++ .../Properties/Resources.zh-Hant.resx | 4 ++++ 13 files changed, 52 insertions(+) diff --git a/src/Xamarin.Android.Build.Tasks/Properties/Resources.cs.resx b/src/Xamarin.Android.Build.Tasks/Properties/Resources.cs.resx index 8d44a930d84..fa055e228e5 100644 --- a/src/Xamarin.Android.Build.Tasks/Properties/Resources.cs.resx +++ b/src/Xamarin.Android.Build.Tasks/Properties/Resources.cs.resx @@ -493,6 +493,10 @@ Změňte hodnotu na název typu kvalifikovaného sestavení, který dědí z: {1 The following are literal names and should not be translated: '_Microsoft.Android.Resource.Desinger', 'AndroidUseDesignerAssembly', 'true' {0} - The name of the assembly + + The 'BundleAssemblies' property is deprecated and it has no effect on the application build. Equivalent functionality is implemented by the 'AndroidUseAssemblyStore' and 'AndroidEnableAssemblyCompression' properties. + The following are literal names and should not be translated: 'BundleAssemblies', 'AndroidUseAssemblyStore', 'AndroidEnableAssemblyCompression' + Použití funkce AppDomain.CreateDomain() zjištěné v sestavení: {0}. .NET 6 a vyšší bude podporovat jenom jednu doménu AppDomain, takže toto rozhraní API už nebude dostupné v Xamarin.Android po vydání .NET 6. The following are literal names and should not be translated: AppDomain.CreateDomain(), AppDomain diff --git a/src/Xamarin.Android.Build.Tasks/Properties/Resources.de.resx b/src/Xamarin.Android.Build.Tasks/Properties/Resources.de.resx index e6fba0d9357..9c6d1d8ac53 100644 --- a/src/Xamarin.Android.Build.Tasks/Properties/Resources.de.resx +++ b/src/Xamarin.Android.Build.Tasks/Properties/Resources.de.resx @@ -493,6 +493,10 @@ Bitte ändern Sie den Wert in einen Assembly-basierten Typnamen, der von „{1} The following are literal names and should not be translated: '_Microsoft.Android.Resource.Desinger', 'AndroidUseDesignerAssembly', 'true' {0} - The name of the assembly + + The 'BundleAssemblies' property is deprecated and it has no effect on the application build. Equivalent functionality is implemented by the 'AndroidUseAssemblyStore' and 'AndroidEnableAssemblyCompression' properties. + The following are literal names and should not be translated: 'BundleAssemblies', 'AndroidUseAssemblyStore', 'AndroidEnableAssemblyCompression' + In der Assembly "{0}" wurde die Verwendung von "AppDomain.CreateDomain()" festgestellt. .NET 6 und höher unterstützt nur eine einzelne AppDomain, sodass diese API nach dem Release von .NET 6 nicht mehr in Xamarin.Android verfügbar ist. The following are literal names and should not be translated: AppDomain.CreateDomain(), AppDomain diff --git a/src/Xamarin.Android.Build.Tasks/Properties/Resources.es.resx b/src/Xamarin.Android.Build.Tasks/Properties/Resources.es.resx index d8bf1e7ac06..ff46919289d 100644 --- a/src/Xamarin.Android.Build.Tasks/Properties/Resources.es.resx +++ b/src/Xamarin.Android.Build.Tasks/Properties/Resources.es.resx @@ -493,6 +493,10 @@ Cambie el valor a un nombre de tipo de ensamblado que herede de "{1}" o quite la The following are literal names and should not be translated: '_Microsoft.Android.Resource.Desinger', 'AndroidUseDesignerAssembly', 'true' {0} - The name of the assembly + + The 'BundleAssemblies' property is deprecated and it has no effect on the application build. Equivalent functionality is implemented by the 'AndroidUseAssemblyStore' and 'AndroidEnableAssemblyCompression' properties. + The following are literal names and should not be translated: 'BundleAssemblies', 'AndroidUseAssemblyStore', 'AndroidEnableAssemblyCompression' + Se detectó el uso de AppDomain.CreateDomain() en el ensamblado: {0}. En .NET 6 y versiones posteriores solo se admitirá una instancia de AppDomain, por lo que esta API ya no estará disponible en Xamarin.Android una vez que se haya lanzado .NET 6. The following are literal names and should not be translated: AppDomain.CreateDomain(), AppDomain diff --git a/src/Xamarin.Android.Build.Tasks/Properties/Resources.fr.resx b/src/Xamarin.Android.Build.Tasks/Properties/Resources.fr.resx index 29f009959e9..183fbf61e95 100644 --- a/src/Xamarin.Android.Build.Tasks/Properties/Resources.fr.resx +++ b/src/Xamarin.Android.Build.Tasks/Properties/Resources.fr.resx @@ -493,6 +493,10 @@ Veuillez remplacer la valeur par un nom de type qualifié par l’assembly qui h The following are literal names and should not be translated: '_Microsoft.Android.Resource.Desinger', 'AndroidUseDesignerAssembly', 'true' {0} - The name of the assembly + + The 'BundleAssemblies' property is deprecated and it has no effect on the application build. Equivalent functionality is implemented by the 'AndroidUseAssemblyStore' and 'AndroidEnableAssemblyCompression' properties. + The following are literal names and should not be translated: 'BundleAssemblies', 'AndroidUseAssemblyStore', 'AndroidEnableAssemblyCompression' + Utilisation de AppDomain.CreateDomain() détectée dans l'assembly : {0}. .NET 6 et les versions ultérieures prend uniquement en charge un seul AppDomain. Cette API ne sera donc plus disponible dans Xamarin.Android après la publication de .NET 6. The following are literal names and should not be translated: AppDomain.CreateDomain(), AppDomain diff --git a/src/Xamarin.Android.Build.Tasks/Properties/Resources.it.resx b/src/Xamarin.Android.Build.Tasks/Properties/Resources.it.resx index ea308e8cacf..e74b91a1880 100644 --- a/src/Xamarin.Android.Build.Tasks/Properties/Resources.it.resx +++ b/src/Xamarin.Android.Build.Tasks/Properties/Resources.it.resx @@ -493,6 +493,10 @@ Modificare il valore in un nome di tipo con qualifica assembly che eredita da '{ The following are literal names and should not be translated: '_Microsoft.Android.Resource.Desinger', 'AndroidUseDesignerAssembly', 'true' {0} - The name of the assembly + + The 'BundleAssemblies' property is deprecated and it has no effect on the application build. Equivalent functionality is implemented by the 'AndroidUseAssemblyStore' and 'AndroidEnableAssemblyCompression' properties. + The following are literal names and should not be translated: 'BundleAssemblies', 'AndroidUseAssemblyStore', 'AndroidEnableAssemblyCompression' + È stato rilevato l'uso di AppDomain.CreateDomain() nell'assembly: {0}. .NET 6 e versioni successive supporteranno solo un singolo AppDomain, quindi questa API non sarà più disponibile in Xamarin.Android dopo il rilascio di .NET 6. The following are literal names and should not be translated: AppDomain.CreateDomain(), AppDomain diff --git a/src/Xamarin.Android.Build.Tasks/Properties/Resources.ja.resx b/src/Xamarin.Android.Build.Tasks/Properties/Resources.ja.resx index 193acff865b..e2607384e49 100644 --- a/src/Xamarin.Android.Build.Tasks/Properties/Resources.ja.resx +++ b/src/Xamarin.Android.Build.Tasks/Properties/Resources.ja.resx @@ -493,6 +493,10 @@ In this message, the term "binding" means a piece of generated code that makes i The following are literal names and should not be translated: '_Microsoft.Android.Resource.Desinger', 'AndroidUseDesignerAssembly', 'true' {0} - The name of the assembly + + The 'BundleAssemblies' property is deprecated and it has no effect on the application build. Equivalent functionality is implemented by the 'AndroidUseAssemblyStore' and 'AndroidEnableAssemblyCompression' properties. + The following are literal names and should not be translated: 'BundleAssemblies', 'AndroidUseAssemblyStore', 'AndroidEnableAssemblyCompression' + アセンブリ {0} で AppDomain.CreateDomain() が使用されていることが検出されました。.NET 6 以降では単一の AppDomain のみがサポートされる予定のため、.NET 6 がリリースされるとこの API は Xamarin.Android では使用できなくなります。 The following are literal names and should not be translated: AppDomain.CreateDomain(), AppDomain diff --git a/src/Xamarin.Android.Build.Tasks/Properties/Resources.ko.resx b/src/Xamarin.Android.Build.Tasks/Properties/Resources.ko.resx index 281f217c284..8c291f0b9cd 100644 --- a/src/Xamarin.Android.Build.Tasks/Properties/Resources.ko.resx +++ b/src/Xamarin.Android.Build.Tasks/Properties/Resources.ko.resx @@ -493,6 +493,10 @@ In this message, the term "binding" means a piece of generated code that makes i The following are literal names and should not be translated: '_Microsoft.Android.Resource.Desinger', 'AndroidUseDesignerAssembly', 'true' {0} - The name of the assembly + + The 'BundleAssemblies' property is deprecated and it has no effect on the application build. Equivalent functionality is implemented by the 'AndroidUseAssemblyStore' and 'AndroidEnableAssemblyCompression' properties. + The following are literal names and should not be translated: 'BundleAssemblies', 'AndroidUseAssemblyStore', 'AndroidEnableAssemblyCompression' + 어셈블리에서 AppDomain.CreateDomain()의 사용이 검색되었습니다. {0}. .NET 6 이상에서는 단일 AppDomain만 지원하므로 .NET 6이 릴리스된 후에는 이 API를 Xamarin.Android에서 더 이상 사용할 수 없습니다. The following are literal names and should not be translated: AppDomain.CreateDomain(), AppDomain diff --git a/src/Xamarin.Android.Build.Tasks/Properties/Resources.pl.resx b/src/Xamarin.Android.Build.Tasks/Properties/Resources.pl.resx index a2952077e45..dc7fe4bdcb5 100644 --- a/src/Xamarin.Android.Build.Tasks/Properties/Resources.pl.resx +++ b/src/Xamarin.Android.Build.Tasks/Properties/Resources.pl.resx @@ -493,6 +493,10 @@ Zmień wartość na nazwę typu kwalifikowalnego zestawu, która dziedziczy po The following are literal names and should not be translated: '_Microsoft.Android.Resource.Desinger', 'AndroidUseDesignerAssembly', 'true' {0} - The name of the assembly + + The 'BundleAssemblies' property is deprecated and it has no effect on the application build. Equivalent functionality is implemented by the 'AndroidUseAssemblyStore' and 'AndroidEnableAssemblyCompression' properties. + The following are literal names and should not be translated: 'BundleAssemblies', 'AndroidUseAssemblyStore', 'AndroidEnableAssemblyCompression' + Wykryto użycie metody AppDomain.CreateDomain() w zestawie: {0}. Platforma .NET 6 lub nowsza wersja obsługuje tylko jedną domenę aplikacji, dlatego ten interfejs API nie będzie już dostępny w rozszerzeniu Xamarin.Android po wydaniu platformy .NET 6. The following are literal names and should not be translated: AppDomain.CreateDomain(), AppDomain diff --git a/src/Xamarin.Android.Build.Tasks/Properties/Resources.pt-BR.resx b/src/Xamarin.Android.Build.Tasks/Properties/Resources.pt-BR.resx index b08ac3ff3bf..4dcb7a2b9dc 100644 --- a/src/Xamarin.Android.Build.Tasks/Properties/Resources.pt-BR.resx +++ b/src/Xamarin.Android.Build.Tasks/Properties/Resources.pt-BR.resx @@ -493,6 +493,10 @@ Altere o valor para um nome de tipo qualificado por assembly que herda de "{1}" The following are literal names and should not be translated: '_Microsoft.Android.Resource.Desinger', 'AndroidUseDesignerAssembly', 'true' {0} - The name of the assembly + + The 'BundleAssemblies' property is deprecated and it has no effect on the application build. Equivalent functionality is implemented by the 'AndroidUseAssemblyStore' and 'AndroidEnableAssemblyCompression' properties. + The following are literal names and should not be translated: 'BundleAssemblies', 'AndroidUseAssemblyStore', 'AndroidEnableAssemblyCompression' + O uso de AppDomain.CreateDomain() foi detectado no assembly: {0}. O .NET 6 e superior dará suporte apenas a um único AppDomain, portanto, esta API não estará mais disponível no Xamarin.Android quando o .NET 6 for lançado. The following are literal names and should not be translated: AppDomain.CreateDomain(), AppDomain diff --git a/src/Xamarin.Android.Build.Tasks/Properties/Resources.ru.resx b/src/Xamarin.Android.Build.Tasks/Properties/Resources.ru.resx index 520db7fa520..5a807faa40c 100644 --- a/src/Xamarin.Android.Build.Tasks/Properties/Resources.ru.resx +++ b/src/Xamarin.Android.Build.Tasks/Properties/Resources.ru.resx @@ -493,6 +493,10 @@ In this message, the term "binding" means a piece of generated code that makes i The following are literal names and should not be translated: '_Microsoft.Android.Resource.Desinger', 'AndroidUseDesignerAssembly', 'true' {0} - The name of the assembly + + The 'BundleAssemblies' property is deprecated and it has no effect on the application build. Equivalent functionality is implemented by the 'AndroidUseAssemblyStore' and 'AndroidEnableAssemblyCompression' properties. + The following are literal names and should not be translated: 'BundleAssemblies', 'AndroidUseAssemblyStore', 'AndroidEnableAssemblyCompression' + В сборке обнаружено использование AppDomain.CreateDomain(): {0}. .NET 6 и более поздние версии будут поддерживать только один домен AppDomain, поэтому этот API больше не будет доступен в Xamarin.Android после выпуска .NET 6. The following are literal names and should not be translated: AppDomain.CreateDomain(), AppDomain diff --git a/src/Xamarin.Android.Build.Tasks/Properties/Resources.tr.resx b/src/Xamarin.Android.Build.Tasks/Properties/Resources.tr.resx index 420735cefdc..a013f7e6b8b 100644 --- a/src/Xamarin.Android.Build.Tasks/Properties/Resources.tr.resx +++ b/src/Xamarin.Android.Build.Tasks/Properties/Resources.tr.resx @@ -493,6 +493,10 @@ Lütfen değeri '{1}' türünden devralan derlemeye uygun bir tür adına dönü The following are literal names and should not be translated: '_Microsoft.Android.Resource.Desinger', 'AndroidUseDesignerAssembly', 'true' {0} - The name of the assembly + + The 'BundleAssemblies' property is deprecated and it has no effect on the application build. Equivalent functionality is implemented by the 'AndroidUseAssemblyStore' and 'AndroidEnableAssemblyCompression' properties. + The following are literal names and should not be translated: 'BundleAssemblies', 'AndroidUseAssemblyStore', 'AndroidEnableAssemblyCompression' + {0} bütünleştirilmiş kodunda AppDomain.CreateDomain() metodunun kullanıldığı saptandı. .NET 6 üstünde yalnızca tek bir AppDomain destekleneceğinden bu API, .NET 6 yayımlandıktan sonra artık Xamarin.Android içinde bulunmayacaktır. The following are literal names and should not be translated: AppDomain.CreateDomain(), AppDomain diff --git a/src/Xamarin.Android.Build.Tasks/Properties/Resources.zh-Hans.resx b/src/Xamarin.Android.Build.Tasks/Properties/Resources.zh-Hans.resx index 4d30aab35a2..283b26a8591 100644 --- a/src/Xamarin.Android.Build.Tasks/Properties/Resources.zh-Hans.resx +++ b/src/Xamarin.Android.Build.Tasks/Properties/Resources.zh-Hans.resx @@ -493,6 +493,10 @@ In this message, the term "binding" means a piece of generated code that makes i The following are literal names and should not be translated: '_Microsoft.Android.Resource.Desinger', 'AndroidUseDesignerAssembly', 'true' {0} - The name of the assembly + + The 'BundleAssemblies' property is deprecated and it has no effect on the application build. Equivalent functionality is implemented by the 'AndroidUseAssemblyStore' and 'AndroidEnableAssemblyCompression' properties. + The following are literal names and should not be translated: 'BundleAssemblies', 'AndroidUseAssemblyStore', 'AndroidEnableAssemblyCompression' + 在程序集 {0} 中检测到使用了 AppDomain.CreateDomain()。.NET 6 及更高版本将仅支持一个 AppDomain,因此 .NET 6 发布后,将无法再在 Xamarin.Android 中使用此 API。 The following are literal names and should not be translated: AppDomain.CreateDomain(), AppDomain diff --git a/src/Xamarin.Android.Build.Tasks/Properties/Resources.zh-Hant.resx b/src/Xamarin.Android.Build.Tasks/Properties/Resources.zh-Hant.resx index 44d27e2135c..cffa2c82349 100644 --- a/src/Xamarin.Android.Build.Tasks/Properties/Resources.zh-Hant.resx +++ b/src/Xamarin.Android.Build.Tasks/Properties/Resources.zh-Hant.resx @@ -493,6 +493,10 @@ In this message, the term "binding" means a piece of generated code that makes i The following are literal names and should not be translated: '_Microsoft.Android.Resource.Desinger', 'AndroidUseDesignerAssembly', 'true' {0} - The name of the assembly + + The 'BundleAssemblies' property is deprecated and it has no effect on the application build. Equivalent functionality is implemented by the 'AndroidUseAssemblyStore' and 'AndroidEnableAssemblyCompression' properties. + The following are literal names and should not be translated: 'BundleAssemblies', 'AndroidUseAssemblyStore', 'AndroidEnableAssemblyCompression' + 在下列組件中偵測到使用 AppDomain.CreateDomain(): {0}。.NET 6 及更新版本只支援單一 AppDomain,因此在 .NET 6 發行之後,此 API 就無法再於 Xamarin.Android 中使用。 The following are literal names and should not be translated: AppDomain.CreateDomain(), AppDomain From f007593864da0579ff251a745b01b929f59fb043 Mon Sep 17 00:00:00 2001 From: Alex Hsu Date: Thu, 2 Mar 2023 03:40:30 -0800 Subject: [PATCH 06/13] LEGO: Merge pull request 7845 LEGO: Merge pull request 7845 --- .../Properties/Resources.resx.lcl | 9 +++++++++ .../Properties/Resources.resx.lcl | 9 +++++++++ .../Properties/Resources.resx.lcl | 9 +++++++++ .../Properties/Resources.resx.lcl | 9 +++++++++ .../Properties/Resources.resx.lcl | 9 +++++++++ .../Properties/Resources.resx.lcl | 9 +++++++++ .../Properties/Resources.resx.lcl | 9 +++++++++ .../Properties/Resources.resx.lcl | 9 +++++++++ 8 files changed, 72 insertions(+) diff --git a/Localize/loc/cs/src/Xamarin.Android.Build.Tasks/Properties/Resources.resx.lcl b/Localize/loc/cs/src/Xamarin.Android.Build.Tasks/Properties/Resources.resx.lcl index 5d4023d2cbe..387730c8967 100644 --- a/Localize/loc/cs/src/Xamarin.Android.Build.Tasks/Properties/Resources.resx.lcl +++ b/Localize/loc/cs/src/Xamarin.Android.Build.Tasks/Properties/Resources.resx.lcl @@ -711,6 +711,15 @@ + + + + + + + + + diff --git a/Localize/loc/de/src/Xamarin.Android.Build.Tasks/Properties/Resources.resx.lcl b/Localize/loc/de/src/Xamarin.Android.Build.Tasks/Properties/Resources.resx.lcl index 21b333ab44d..84ec2c4135d 100644 --- a/Localize/loc/de/src/Xamarin.Android.Build.Tasks/Properties/Resources.resx.lcl +++ b/Localize/loc/de/src/Xamarin.Android.Build.Tasks/Properties/Resources.resx.lcl @@ -711,6 +711,15 @@ + + + + + + + + + diff --git a/Localize/loc/es/src/Xamarin.Android.Build.Tasks/Properties/Resources.resx.lcl b/Localize/loc/es/src/Xamarin.Android.Build.Tasks/Properties/Resources.resx.lcl index 4d7b9a4e632..e699ec01daf 100644 --- a/Localize/loc/es/src/Xamarin.Android.Build.Tasks/Properties/Resources.resx.lcl +++ b/Localize/loc/es/src/Xamarin.Android.Build.Tasks/Properties/Resources.resx.lcl @@ -711,6 +711,15 @@ + + + + + + + + + diff --git a/Localize/loc/fr/src/Xamarin.Android.Build.Tasks/Properties/Resources.resx.lcl b/Localize/loc/fr/src/Xamarin.Android.Build.Tasks/Properties/Resources.resx.lcl index 5deff29a644..75ec6dd8de9 100644 --- a/Localize/loc/fr/src/Xamarin.Android.Build.Tasks/Properties/Resources.resx.lcl +++ b/Localize/loc/fr/src/Xamarin.Android.Build.Tasks/Properties/Resources.resx.lcl @@ -711,6 +711,15 @@ + + + + + + + + + diff --git a/Localize/loc/it/src/Xamarin.Android.Build.Tasks/Properties/Resources.resx.lcl b/Localize/loc/it/src/Xamarin.Android.Build.Tasks/Properties/Resources.resx.lcl index 36d61e30342..6bba044e0d6 100644 --- a/Localize/loc/it/src/Xamarin.Android.Build.Tasks/Properties/Resources.resx.lcl +++ b/Localize/loc/it/src/Xamarin.Android.Build.Tasks/Properties/Resources.resx.lcl @@ -711,6 +711,15 @@ + + + + + + + + + diff --git a/Localize/loc/ja/src/Xamarin.Android.Build.Tasks/Properties/Resources.resx.lcl b/Localize/loc/ja/src/Xamarin.Android.Build.Tasks/Properties/Resources.resx.lcl index 19223b02cf7..51901028043 100644 --- a/Localize/loc/ja/src/Xamarin.Android.Build.Tasks/Properties/Resources.resx.lcl +++ b/Localize/loc/ja/src/Xamarin.Android.Build.Tasks/Properties/Resources.resx.lcl @@ -711,6 +711,15 @@ + + + + + + + + + diff --git a/Localize/loc/pt-BR/src/Xamarin.Android.Build.Tasks/Properties/Resources.resx.lcl b/Localize/loc/pt-BR/src/Xamarin.Android.Build.Tasks/Properties/Resources.resx.lcl index e80554b73f6..3586cfb703a 100644 --- a/Localize/loc/pt-BR/src/Xamarin.Android.Build.Tasks/Properties/Resources.resx.lcl +++ b/Localize/loc/pt-BR/src/Xamarin.Android.Build.Tasks/Properties/Resources.resx.lcl @@ -711,6 +711,15 @@ + + + + + + + + + diff --git a/Localize/loc/zh-Hans/src/Xamarin.Android.Build.Tasks/Properties/Resources.resx.lcl b/Localize/loc/zh-Hans/src/Xamarin.Android.Build.Tasks/Properties/Resources.resx.lcl index f62e2475b96..3af991ada7d 100644 --- a/Localize/loc/zh-Hans/src/Xamarin.Android.Build.Tasks/Properties/Resources.resx.lcl +++ b/Localize/loc/zh-Hans/src/Xamarin.Android.Build.Tasks/Properties/Resources.resx.lcl @@ -711,6 +711,15 @@ + + + + + + + + + From 5d4668505038901f93ae4663f0c74ce110a0a50b Mon Sep 17 00:00:00 2001 From: Marek Habersack Date: Thu, 2 Mar 2023 13:44:06 +0100 Subject: [PATCH 07/13] [Mono.Android] Tweak AndroidMessageHandler behavior for WCF support (#7785) Context: https://github.com/xamarin/xamarin-android/issues/7230 Context: https://github.com/dotnet/runtime/issues/80935 When a WCF application invokes an endpoint which returns compressed content, and `AndroidMessageHandler` is doing the network requests ([the default when `$(UseNativeHttpHandler)`=True][0]): var soapClient = new WebServiceSoapClient(WebServiceSoapClient.EndpointConfiguration.WebServiceSoap); //Async test var helloResponse = await soapClient.HelloWorldAsync(); then the method will throw: The formatter threw an exception while trying to deserialize the message: There was an error while trying to deserialize parameter http://tempuri.org/:HelloWorldResponse. ---> There was an error deserializing the object of type ServiceReference1.HelloWorldResponseBody. Unexpected end of file. Following elements are not closed: HelloWorldResult, HelloWorldResponse, Body, Envelope. Line 1, position 298. at System.Runtime.Serialization.XmlObjectSerializer.ReadObjectHandleExceptions(XmlReaderDelegator reader, Boolean verifyObjectName, DataContractResolver dataContractResolver) at System.Runtime.Serialization.XmlObjectSerializer.ReadObjectHandleExceptions(XmlReaderDelegator reader, Boolean verifyObjectName) at System.Runtime.Serialization.DataContractSerializer.ReadObject(XmlDictionaryReader reader, Boolean verifyObjectName) at System.ServiceModel.Dispatcher.DataContractSerializerOperationFormatter.PartInfo.ReadObject(XmlDictionaryReader reader, XmlObjectSerializer serializer) in /_/src/System.Private.ServiceModel/src/System/ServiceModel/Dispatcher/DataContractSerializerOperationFormatter.cs:line 657 at System.ServiceModel.Dispatcher.DataContractSerializerOperationFormatter.PartInfo.ReadObject(XmlDictionaryReader reader) in /_/src/System.Private.ServiceModel/src/System/ServiceModel/Dispatcher/DataContractSerializerOperationFormatter.cs:line 652 at System.ServiceModel.Dispatcher.DataContractSerializerOperationFormatter.DeserializeParameterPart(XmlDictionaryReader reader, PartInfo part, Boolean isRequest) in /_/src/System.Private.ServiceModel/src/System/ServiceModel/Dispatcher/DataContractSerializerOperationFormatter.cs:line 521 The reason for this is that when `AndroidMessageHandler` creates a wrapping decompression stream, it does not update `Content-Length` to match the length of the decoded content, because it doesn't have a way to know what the length is without first reading the stream to the end, and that might prevent the end user to read the content. (Additionally, I think the `Content-Length` header should reflect the *original* content length, for the end user to be able to interpret the response as it was sent.) WCF, on the other hand, looks at the `Content-Length` header and, if found, takes the value and reads only that many bytes from the content stream and no more, which will almost always result in short reads and failure to correctly interpret the response. Workaround this issue by making `AndroidMessageHandler` behave the same way as other handlers implemented in the BCL. What they do in this situation is remove the `Content-Length` header, making WCF read the stream to the end. Additionally, the clients remove the compressed content encoding identifier from the `Content-Encoding` header. var handler = new AndroidMessageHandler { AutomaticDecompression = DecompressionMethods.All }; var client = new HttpClient (handler); var response = await client.GetAsync ("https://httpbin.org/gzip"); // response.Content.Headers won't contain Content-Length, // and response.Content.Headers.ContentEncoding won't contain `gzip`. As a bonus, also adds support for decompression of responses compressed with the `Brotli` compression which use the `br` encoding ID in the `Content-Encoding` header. [0]: https://learn.microsoft.com/en-us/dotnet/core/deploying/trimming/trimming-options?pivots=dotnet-7-0 --- .../AndroidMessageHandler.cs | 154 ++++++++++++++---- .../BuildReleaseArm64XFormsDotNet.apkdesc | 23 +-- .../AndroidMessageHandlerTests.cs | 68 ++++++++ 3 files changed, 203 insertions(+), 42 deletions(-) diff --git a/src/Mono.Android/Xamarin.Android.Net/AndroidMessageHandler.cs b/src/Mono.Android/Xamarin.Android.Net/AndroidMessageHandler.cs index 8971220b68b..7d42441c66e 100644 --- a/src/Mono.Android/Xamarin.Android.Net/AndroidMessageHandler.cs +++ b/src/Mono.Android/Xamarin.Android.Net/AndroidMessageHandler.cs @@ -69,11 +69,46 @@ sealed class RequestRedirectionState public bool MethodChanged; } + /// + /// Some requests require modification to the set of headers returned from the native client. + /// However, the headers collection in it is immutable, so we need to perform the adjustments + /// in CopyHeaders. This class describes the necessary operations. + /// + sealed class ContentState + { + public bool? RemoveContentLengthHeader; + + /// + /// If this is `true`, then `NewContentEncodingHeaderValue` is entirely ignored + /// + public bool? RemoveContentEncodingHeader; + + /// + /// New 'Content-Encoding' header value. Ignored if not null and empty. + /// + public List? NewContentEncodingHeaderValue; + + /// + /// Reset the class to values that indicate there's no action to take. MUST be + /// called BEFORE any of the class members are assigned values and AFTER the state + /// modification is applied + /// + public void Reset () + { + RemoveContentEncodingHeader = null; + RemoveContentLengthHeader = null; + NewContentEncodingHeaderValue = null; + } + } + internal const string LOG_APP = "monodroid-net"; const string GZIP_ENCODING = "gzip"; const string DEFLATE_ENCODING = "deflate"; + const string BROTLI_ENCODING = "br"; const string IDENTITY_ENCODING = "identity"; + const string ContentEncodingHeaderName = "Content-Encoding"; + const string ContentLengthHeaderName = "Content-Length"; static readonly IDictionary headerSeparators = new Dictionary { ["User-Agent"] = " ", @@ -82,9 +117,9 @@ sealed class RequestRedirectionState static readonly HashSet known_content_headers = new HashSet (StringComparer.OrdinalIgnoreCase) { "Allow", "Content-Disposition", - "Content-Encoding", + ContentEncodingHeaderName, "Content-Language", - "Content-Length", + ContentLengthHeaderName, "Content-Location", "Content-MD5", "Content-Range", @@ -571,6 +606,7 @@ internal Task WriteRequestContentToOutputInternal (HttpRequestMessage request, H CancellationTokenRegistration cancelRegistration = default (CancellationTokenRegistration); HttpStatusCode statusCode = HttpStatusCode.OK; Uri? connectionUri = null; + var contentState = new ContentState (); try { cancelRegistration = cancellationToken.Register (() => { @@ -608,13 +644,13 @@ internal Task WriteRequestContentToOutputInternal (HttpRequestMessage request, H if (!IsErrorStatusCode (statusCode)) { if (Logger.LogNet) Logger.Log (LogLevel.Info, LOG_APP, $"Reading..."); - ret.Content = GetContent (httpConnection, httpConnection.InputStream!); + ret.Content = GetContent (httpConnection, httpConnection.InputStream!, contentState); } else { if (Logger.LogNet) Logger.Log (LogLevel.Info, LOG_APP, $"Status code is {statusCode}, reading..."); // For 400 >= response code <= 599 the Java client throws the FileNotFound exception when attempting to read from the input stream. // Instead we try to read the error stream and return an empty string if the error stream isn't readable. - ret.Content = GetErrorContent (httpConnection, new StringContent (String.Empty, Encoding.ASCII)); + ret.Content = GetErrorContent (httpConnection, new StringContent (String.Empty, Encoding.ASCII), contentState); } bool disposeRet; @@ -633,7 +669,7 @@ internal Task WriteRequestContentToOutputInternal (HttpRequestMessage request, H } } - CopyHeaders (httpConnection, ret); + CopyHeaders (httpConnection, ret, contentState); ParseCookies (ret, connectionUri); if (disposeRet) { @@ -661,8 +697,8 @@ internal Task WriteRequestContentToOutputInternal (HttpRequestMessage request, H // We return the body of the response too, but the Java client will throw // a FileNotFound exception if we attempt to access the input stream. // Instead we try to read the error stream and return an default message if the error stream isn't readable. - ret.Content = GetErrorContent (httpConnection, new StringContent ("Unauthorized", Encoding.ASCII)); - CopyHeaders (httpConnection, ret); + ret.Content = GetErrorContent (httpConnection, new StringContent ("Unauthorized", Encoding.ASCII), contentState); + CopyHeaders (httpConnection, ret, contentState); if (ret.Headers.WwwAuthenticate != null) { ProxyAuthenticationRequested = false; @@ -676,7 +712,7 @@ internal Task WriteRequestContentToOutputInternal (HttpRequestMessage request, H return ret; } - CopyHeaders (httpConnection, ret); + CopyHeaders (httpConnection, ret, contentState); ParseCookies (ret, connectionUri); if (Logger.LogNet) @@ -684,29 +720,57 @@ internal Task WriteRequestContentToOutputInternal (HttpRequestMessage request, H return ret; } - HttpContent GetErrorContent (HttpURLConnection httpConnection, HttpContent fallbackContent) + HttpContent GetErrorContent (HttpURLConnection httpConnection, HttpContent fallbackContent, ContentState contentState) { var contentStream = httpConnection.ErrorStream; if (contentStream != null) { - return GetContent (httpConnection, contentStream); + return GetContent (httpConnection, contentStream, contentState); } return fallbackContent; } - HttpContent GetContent (URLConnection httpConnection, Stream contentStream) + Stream GetDecompressionWrapper (URLConnection httpConnection, Stream inputStream, ContentState contentState) { - Stream inputStream = new BufferedStream (contentStream); - if (decompress_here) { - var encodings = httpConnection.ContentEncoding?.Split (','); - if (encodings != null) { - if (encodings.Contains (GZIP_ENCODING, StringComparer.OrdinalIgnoreCase)) - inputStream = new GZipStream (inputStream, CompressionMode.Decompress); - else if (encodings.Contains (DEFLATE_ENCODING, StringComparer.OrdinalIgnoreCase)) - inputStream = new DeflateStream (inputStream, CompressionMode.Decompress); + contentState.Reset (); + if (!decompress_here || String.IsNullOrEmpty (httpConnection.ContentEncoding)) { + return inputStream; + } + + var encodings = new HashSet (httpConnection.ContentEncoding?.Split (','), StringComparer.OrdinalIgnoreCase); + Stream? ret = null; + string? supportedEncoding = null; + if (encodings.Contains (GZIP_ENCODING)) { + supportedEncoding = GZIP_ENCODING; + ret = new GZipStream (inputStream, CompressionMode.Decompress); + } else if (encodings.Contains (DEFLATE_ENCODING)) { + supportedEncoding = DEFLATE_ENCODING; + ret = new DeflateStream (inputStream, CompressionMode.Decompress); + } +#if NETCOREAPP + else if (encodings.Contains (BROTLI_ENCODING)) { + supportedEncoding = BROTLI_ENCODING; + ret = new BrotliStream (inputStream, CompressionMode.Decompress); + } +#endif + if (!String.IsNullOrEmpty (supportedEncoding)) { + contentState.RemoveContentLengthHeader = true; + + encodings.Remove (supportedEncoding!); + if (encodings.Count == 0) { + contentState.RemoveContentEncodingHeader = true; + } else { + contentState.NewContentEncodingHeaderValue = new List (encodings); } } + + return ret ?? inputStream; + } + + HttpContent GetContent (URLConnection httpConnection, Stream contentStream, ContentState contentState) + { + Stream inputStream = GetDecompressionWrapper (httpConnection, new BufferedStream (contentStream), contentState); return new StreamContent (inputStream); } @@ -881,9 +945,13 @@ void ParseCookies (AndroidHttpResponseMessage ret, Uri connectionUri) } } - void CopyHeaders (HttpURLConnection httpConnection, HttpResponseMessage response) + void CopyHeaders (HttpURLConnection httpConnection, HttpResponseMessage response, ContentState contentState) { var headers = httpConnection.HeaderFields; + bool removeContentLength = contentState.RemoveContentLengthHeader ?? false; + bool removeContentEncoding = contentState.RemoveContentEncodingHeader ?? false; + bool setNewContentEncodingValue = !removeContentEncoding && contentState.NewContentEncodingHeaderValue != null && contentState.NewContentEncodingHeaderValue.Count > 0; + foreach (var key in headers!.Keys) { if (key == null) // First header entry has null key, it corresponds to the response message continue; @@ -895,8 +963,25 @@ void CopyHeaders (HttpURLConnection httpConnection, HttpResponseMessage response } else { item_headers = response.Headers; } - item_headers.TryAddWithoutValidation (key, headers [key]); + + IEnumerable values = headers [key]; + if (removeContentLength && String.Compare (ContentLengthHeaderName, key, StringComparison.OrdinalIgnoreCase) == 0) { + removeContentLength = false; + continue; + } + + if ((removeContentEncoding || setNewContentEncodingValue) && String.Compare (ContentEncodingHeaderName, key, StringComparison.OrdinalIgnoreCase) == 0) { + if (removeContentEncoding) { + removeContentEncoding = false; + continue; + } + + setNewContentEncodingValue = false; + values = contentState.NewContentEncodingHeaderValue!; + } + item_headers.TryAddWithoutValidation (key, values); } + contentState.Reset (); } /// @@ -1006,19 +1091,24 @@ void AppendEncoding (string encoding, ref List ? list) List ? accept_encoding = null; decompress_here = false; - if ((AutomaticDecompression & DecompressionMethods.GZip) != 0) { - AppendEncoding (GZIP_ENCODING, ref accept_encoding); - decompress_here = true; - } - - if ((AutomaticDecompression & DecompressionMethods.Deflate) != 0) { - AppendEncoding (DEFLATE_ENCODING, ref accept_encoding); - decompress_here = true; - } - if (AutomaticDecompression == DecompressionMethods.None) { - accept_encoding?.Clear (); AppendEncoding (IDENTITY_ENCODING, ref accept_encoding); // Turns off compression for the Java client + } else { + if ((AutomaticDecompression & DecompressionMethods.GZip) != 0) { + AppendEncoding (GZIP_ENCODING, ref accept_encoding); + decompress_here = true; + } + + if ((AutomaticDecompression & DecompressionMethods.Deflate) != 0) { + AppendEncoding (DEFLATE_ENCODING, ref accept_encoding); + decompress_here = true; + } +#if NETCOREAPP + if ((AutomaticDecompression & DecompressionMethods.Brotli) != 0) { + AppendEncoding (BROTLI_ENCODING, ref accept_encoding); + decompress_here = true; + } +#endif } if (accept_encoding?.Count > 0) diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Resources/Base/BuildReleaseArm64XFormsDotNet.apkdesc b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Resources/Base/BuildReleaseArm64XFormsDotNet.apkdesc index b3fc11fd0e4..6902b06169c 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Resources/Base/BuildReleaseArm64XFormsDotNet.apkdesc +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Resources/Base/BuildReleaseArm64XFormsDotNet.apkdesc @@ -11,13 +11,13 @@ "Size": 7313 }, "assemblies/Java.Interop.dll": { - "Size": 66563 + "Size": 66562 }, "assemblies/Mono.Android.dll": { - "Size": 444617 + "Size": 444972 }, "assemblies/Mono.Android.Runtime.dll": { - "Size": 5897 + "Size": 5822 }, "assemblies/mscorlib.dll": { "Size": 3866 @@ -64,6 +64,9 @@ "assemblies/System.Drawing.Primitives.dll": { "Size": 12010 }, + "assemblies/System.IO.Compression.Brotli.dll": { + "Size": 11871 + }, "assemblies/System.IO.Compression.dll": { "Size": 16858 }, @@ -89,7 +92,7 @@ "Size": 8154 }, "assemblies/System.Private.CoreLib.dll": { - "Size": 814216 + "Size": 814322 }, "assemblies/System.Private.DataContractSerialization.dll": { "Size": 192370 @@ -131,7 +134,7 @@ "Size": 1864 }, "assemblies/UnnamedProject.dll": { - "Size": 5294 + "Size": 5286 }, "assemblies/Xamarin.AndroidX.Activity.dll": { "Size": 5867 @@ -206,7 +209,7 @@ "Size": 93552 }, "lib/arm64-v8a/libmonodroid.so": { - "Size": 379152 + "Size": 380656 }, "lib/arm64-v8a/libmonosgen-2.0.so": { "Size": 3106808 @@ -221,7 +224,7 @@ "Size": 154904 }, "lib/arm64-v8a/libxamarin-app.so": { - "Size": 333760 + "Size": 333840 }, "META-INF/android.support.design_material.version": { "Size": 12 @@ -335,13 +338,13 @@ "Size": 1213 }, "META-INF/BNDLTOOL.SF": { - "Size": 79326 + "Size": 79441 }, "META-INF/com.google.android.material_material.version": { "Size": 10 }, "META-INF/MANIFEST.MF": { - "Size": 79199 + "Size": 79314 }, "META-INF/proguard/androidx-annotations.pro": { "Size": 339 @@ -1976,5 +1979,5 @@ "Size": 341228 } }, - "PackageSize": 7820036 + "PackageSize": 7832413 } \ No newline at end of file diff --git a/tests/Mono.Android-Tests/Xamarin.Android.Net/AndroidMessageHandlerTests.cs b/tests/Mono.Android-Tests/Xamarin.Android.Net/AndroidMessageHandlerTests.cs index c15b8292c36..c240ac94ccb 100644 --- a/tests/Mono.Android-Tests/Xamarin.Android.Net/AndroidMessageHandlerTests.cs +++ b/tests/Mono.Android-Tests/Xamarin.Android.Net/AndroidMessageHandlerTests.cs @@ -1,4 +1,5 @@ using System; +using System.Net; using System.Net.Http; using System.Net.Security; using System.Security.Cryptography.X509Certificates; @@ -19,6 +20,73 @@ protected override HttpMessageHandler CreateHandler () return new AndroidMessageHandler (); } + // We can't test `deflate` for now because it's broken in the BCL for https://httpbin.org/deflate (S.I.Compression.DeflateStream doesn't recognize the compression + // method used by the server) + static readonly object[] DecompressionSource = new object[] { + new object[] { + "gzip", // urlPath + "gzip", // encoding + "gzipped", // jsonFieldName + }, + + new object[] { + "brotli", // urlPath + "br", // encoding + "brotli", // jsonFieldName + }, + }; + +#if NET + [Test] + [TestCaseSource (nameof (DecompressionSource))] + [Retry (5)] + public async Task Decompression (string urlPath, string encoding, string jsonFieldName) + { + // Catch all the exceptions and warn about them or otherwise [Retry] above won't work + try { + DoDecompression (urlPath, encoding, jsonFieldName); + } catch (Exception ex) { + Assert.Warn ("Unexpected exception thrown"); + Assert.Warn (ex.ToString ()); + Assert.Fail ("Exception should have not been thrown"); + } + } + + void DoDecompression (string urlPath, string encoding, string jsonFieldName) + { + var handler = new AndroidMessageHandler { + AutomaticDecompression = DecompressionMethods.All + }; + + var client = new HttpClient (handler); + HttpResponseMessage response = await client.GetAsync ($"https://httpbin.org/{urlPath}"); + + // Failing on error codes other than 2xx will make NUnit retry the test up to the number of times specified in the + // [Retry] attribute above. This may or may not the desired effect if httpbin.org is throttling the requests, thus + // we will sleep a short while before failing the test + if (!response.IsSuccessStatusCode) { + System.Threading.Thread.Sleep (1000); + Assert.Fail ($"Request ended with a failure error code: {response.StatusCode}"); + } + + foreach (string enc in response.Content.Headers.ContentEncoding) { + if (String.Compare (enc, encoding, StringComparison.Ordinal) == 0) { + Assert.Fail ($"Encoding '{encoding}' should have been removed from the Content-Encoding header"); + } + } + + string responseBody = await response.Content.ReadAsStringAsync (); + + Assert.Warn ("-- Retrieved JSON start"); + Assert.Warn (responseBody); + Assert.Warn ("-- Retrieved JSON end"); + + Assert.IsTrue (responseBody.Length > 0, "Response was empty"); + Assert.AreEqual (response.Content.Headers.ContentLength, responseBody.Length, "Retrieved data length is different than the one specified in the Content-Length header"); + Assert.IsTrue (responseBody.Contains ($"\"{jsonFieldName}\"", StringComparison.OrdinalIgnoreCase), $"\"{jsonFieldName}\" should have been in the response JSON"); + } +#endif + [Test] public async Task ServerCertificateCustomValidationCallback_ApproveRequest () { From a983fbb9760cf8d7f14f447324eed5142a211020 Mon Sep 17 00:00:00 2001 From: Jonathan Pryor Date: Thu, 2 Mar 2023 09:40:30 -0500 Subject: [PATCH 08/13] [Mono.Android] Print type & member remapping info (#7844) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Context: f6f11a5a797cd8602854942dccb0f2b1db57c473 Context: f99fc814b0dcc021a441e70bb5a487b2034f6760 How do we diagnose type & member remapping issues? If (when) things don't work as anticipated, what do we do? If a method is remapped *and* the remapped-to method cannot be found, then [Java.Interop will write a message to stderr][0]: warning: For declared method `java/lang/Object.remappedToToString.()Ljava/lang/String;`, could not find requested method `java/lang/Object.toString.()Ljava/lang/String;`! which is a scenario we think/assume Shouldn't Happen™. If it *does* happen, we believe that the above message will be sufficient to fix the problem. However, in the "happy" path in which the replacement method is found *or* the "less-happy" path in which *nothing happens*, how do we get insight to check or verify what's going on? Update `AndroidTypeManager.GetStaticMethodFallbackTypesCore()` and `AndroidTypeManager.GetReplacementMethodInfoCore()` so that they print out *successful* type & member remapping when the "assembly" log category is enabled: adb shell setprop debug.mono.log default,assembly When the assembly log category is enabled, invocations of `AndroidTypeManager.GetStaticMethodFallbackTypesCore()` will print messages such as the following to `adb logcat`: D monodroid-assembly : Remapping type `com/xamarin/interop/RenameClassBase1` to one of { `com/xamarin/interop/DesugarRenameClassBase1`, `com/xamarin/interop/RenameClassBase1$-CC` } When the assembly log category is enabled, invocations of `AndroidTypeManager.GetReplacementMethodInfoCore()` will print messages such as the following to `adb logcat` *when a replacement method will be attempted*: D monodroid-assembly : Remapping method `java/lang/Object.remappedToToString()Ljava/lang/String;` to `java/lang/Object.toString.()Ljava/lang/String;`; param-count: 0; instance-to-static? false This will hopefully provide enough information to reason through type and member remapping behavior. [0]: https://github.com/xamarin/java.interop/blob/77800dda83c2db4d90b501c00069abc9880caaeb/src/Java.Interop/Java.Interop/JniPeerMembers.JniInstanceMethods.cs#L123 --- .../Android.Runtime/AndroidRuntime.cs | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/src/Mono.Android/Android.Runtime/AndroidRuntime.cs b/src/Mono.Android/Android.Runtime/AndroidRuntime.cs index e819369fef9..b2436fb01b6 100644 --- a/src/Mono.Android/Android.Runtime/AndroidRuntime.cs +++ b/src/Mono.Android/Android.Runtime/AndroidRuntime.cs @@ -317,10 +317,16 @@ protected override IEnumerable GetSimpleReferences (Type type) var typeWithPrefix = desugarType.ToString (); var typeWithSuffix = $"{jniSimpleReference}$-CC"; - return new[]{ + var replacements = new[]{ GetReplacementTypeCore (typeWithPrefix) ?? typeWithPrefix, GetReplacementTypeCore (typeWithSuffix) ?? typeWithSuffix, }; + + if (Logger.LogAssembly) { + var message = $"Remapping type `{jniSimpleReference}` to one one of {{ `{replacements[0]}`, `{replacements[1]}` }}"; + Logger.Log (LogLevel.Debug, "monodroid-assembly", message); + } + return replacements; } protected override string? GetReplacementTypeCore (string jniSimpleReference) @@ -350,11 +356,19 @@ protected override IEnumerable GetSimpleReferences (Type type) var method = new JniRemappingReplacementMethod (); method = Marshal.PtrToStructure(retInfo); + var newSignature = jniMethodSignature; int? paramCount = null; if (method.is_static) { paramCount = JniMemberSignature.GetParameterCountFromMethodSignature (jniMethodSignature) + 1; - jniMethodSignature = $"(L{jniSourceType};" + jniMethodSignature.Substring ("(".Length); + newSignature = $"(L{jniSourceType};" + jniMethodSignature.Substring ("(".Length); + } + + if (Logger.LogAssembly) { + var message = $"Remapping method `{jniSourceType}.{jniMethodName}{jniMethodSignature}` to " + + $"`{method.target_type}.{method.target_name}{newSignature}`; " + + $"param-count: {paramCount}; instance-to-static? {method.is_static}"; + Logger.Log (LogLevel.Debug, "monodroid-assembly", message); } return new JniRuntime.ReplacementMethodInfo { @@ -363,7 +377,7 @@ protected override IEnumerable GetSimpleReferences (Type type) SourceJniMethodSignature = jniMethodSignature, TargetJniType = method.target_type, TargetJniMethodName = method.target_name, - TargetJniMethodSignature = jniMethodSignature, + TargetJniMethodSignature = newSignature, TargetJniMethodParameterCount = paramCount, TargetJniMethodInstanceToStatic = method.is_static, }; From c75bbfc102a2dc0c65462fca053d76ff327049cd Mon Sep 17 00:00:00 2001 From: Jonathan Peppers Date: Thu, 2 Mar 2023 12:23:51 -0600 Subject: [PATCH 09/13] [Xamarin.Android.Build.Tasks] guard `AutoImport.props` against empty values (#7837) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit There is an email thread about ASP.NET projects in VS, and something is potentially slowing down builds when optional workloads are installed. One concern is our `AutoImport.props`. Consider this example `foo.targets` file: In this example `$(MonoAndroidResourcePrefix)` and `$(MonoAndroidAssetsPrefix)` will be blank, so when we build: > msbuild foo.targets -bl … MSBUILD : warning MSB5029: The value "\**\.*\**" of the "Exclude" attribute in element in file "foo.targets (13,61)" is a wildcard that results in enumerating all files on the drive, which was likely not intended. Check that referenced properties are always defined. 1 Warning(s) 0 Error(s) Time Elapsed 00:02:45.14 I'm not sure if this is causing an actual problem, but I think it's a good idea to add some safety here. Update `AutoImport.props` to avoid including item groups when `$(MonoAndroidResourcePrefix)` and `$(MonoAndroidAssetsPrefix)` are not set/empty. --- .../Microsoft.Android.Sdk/Sdk/AutoImport.props | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/Sdk/AutoImport.props b/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/Sdk/AutoImport.props index 6d9352695f6..7bde84e8ee2 100644 --- a/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/Sdk/AutoImport.props +++ b/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/Sdk/AutoImport.props @@ -22,7 +22,9 @@ https://github.com/dotnet/designs/blob/4703666296f5e59964961464c25807c727282cae/ - + @@ -35,8 +37,17 @@ https://github.com/dotnet/designs/blob/4703666296f5e59964961464c25807c727282cae/ + + + + + + From 1ca7ac79207b7cf6f217545d58db3334c27c047c Mon Sep 17 00:00:00 2001 From: Peter Collins Date: Thu, 2 Mar 2023 15:36:25 -0500 Subject: [PATCH 10/13] [ci] Allow dynamic`$(NuGetArtifactName)` values (#7848) We want to be able to override the values of `$(NuGetArtifactName)` and `$(LinuxNuGetArtifactName)` in the megapipeline so that artifact names don't overlap. We shouldn't use these variables to determine where local build artifacts are being output to. --- build-tools/automation/yaml-templates/build-linux.yaml | 4 ++-- build-tools/automation/yaml-templates/commercial-build.yaml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/build-tools/automation/yaml-templates/build-linux.yaml b/build-tools/automation/yaml-templates/build-linux.yaml index 9da25139e91..92426376649 100644 --- a/build-tools/automation/yaml-templates/build-linux.yaml +++ b/build-tools/automation/yaml-templates/build-linux.yaml @@ -69,9 +69,9 @@ stages: - script: > df -h && mkdir -p $(System.DefaultWorkingDirectory)/xamarin-android/bin/Build$(XA.Build.Configuration)/nuget-linux && - ln $(System.DefaultWorkingDirectory)/xamarin-android/bin/Build$(XA.Build.Configuration)/$(NuGetArtifactName)/Microsoft.Android.Sdk.Linux*.nupkg + ln $(System.DefaultWorkingDirectory)/xamarin-android/bin/Build$(XA.Build.Configuration)/nuget-unsigned/Microsoft.Android.Sdk.Linux*.nupkg $(System.DefaultWorkingDirectory)/xamarin-android/bin/Build$(XA.Build.Configuration)/nuget-linux && - ln $(System.DefaultWorkingDirectory)/xamarin-android/bin/Build$(XA.Build.Configuration)/$(NuGetArtifactName)/SignList.xml + ln $(System.DefaultWorkingDirectory)/xamarin-android/bin/Build$(XA.Build.Configuration)/nuget-unsigned/SignList.xml $(System.DefaultWorkingDirectory)/xamarin-android/bin/Build$(XA.Build.Configuration)/nuget-linux workingDirectory: $(System.DefaultWorkingDirectory)/xamarin-android displayName: copy linux sdk diff --git a/build-tools/automation/yaml-templates/commercial-build.yaml b/build-tools/automation/yaml-templates/commercial-build.yaml index f5512bdb4a6..41c375d245a 100644 --- a/build-tools/automation/yaml-templates/commercial-build.yaml +++ b/build-tools/automation/yaml-templates/commercial-build.yaml @@ -130,7 +130,7 @@ steps: displayName: upload nupkgs inputs: artifactName: ${{ parameters.nugetArtifactName }} - targetPath: ${{ parameters.xaSourcePath }}/bin/Build$(XA.Build.Configuration)/$(NuGetArtifactName) + targetPath: ${{ parameters.xaSourcePath }}/bin/Build$(XA.Build.Configuration)/nuget-unsigned - script: > mkdir -p bin/Build$(XA.Build.Configuration)/$(InstallerArtifactName) && From 6fec1942fbfafa580239727696dd011e98daf21a Mon Sep 17 00:00:00 2001 From: Jonathan Pobst Date: Thu, 2 Mar 2023 16:30:14 -0600 Subject: [PATCH 11/13] [ci] Reduce overhead for MSBuildIntegration unit test jobs. (#7832) There are 2 opportunities for speeding up the `MSBuildIntegration` unit test stage: removing `SmokeTests` that we also run in a different stage, and opting out of installing dependencies that these jobs do not need. * Don't run `SmokeTests` in this stage, as they are run in the dedicated `Smoke Tests` stage. * Refactor `start emulator` and `stop emulator` into reusable templates, and update them to use `dotnet build` instead of `mono`. * Opt out of installing unneeded dependencies: * nunit-console * .NET 6 * apkdiff * Unneeded Android SDK Platforms: 19,21,26,32 * Mono: theoretically this stage isn't using Mono anymore. Regardless, [Mono is now included in the default Mac VM image](https://github.com/actions/runner-images/pull/6799) (it's a newer version (`6.12.0.188`) than we are installing (`6.12.0.145`)), so we don't need this unless we decide in the future we need a newer version than the default. * By updating our required Mono version to `6.12.0.188`, `xaprepare` will not need to downgrade it anymore on the current Mac images, saving time for *all* jobs that install Mono. --- Configuration.props | 4 +- .../setup-test-environment.yaml | 51 ++++++++------ .../stage-msbuild-emulator-tests.yaml | 67 ++++++++++--------- .../yaml-templates/start-stop-emulator.yaml | 31 +++++++++ .../Emulator.csproj | 4 +- 5 files changed, 101 insertions(+), 56 deletions(-) create mode 100644 build-tools/automation/yaml-templates/start-stop-emulator.yaml diff --git a/Configuration.props b/Configuration.props index c0845f0c472..356f1224664 100644 --- a/Configuration.props +++ b/Configuration.props @@ -109,8 +109,8 @@ armeabi-v7a:arm64-v8a:x86:x86_64 $(MSBuildThisFileDirectory)external\Java.Interop $(MSBuildThisFileDirectory)external\mono - https://xamjenkinsartifact.azureedge.net/build-package-osx-mono/2020-02/151/c633fe923832f0c3db3c4e6aa98e5592bf5a06e7/MonoFramework-MDK-6.12.0.145.macos10.xamarin.universal.pkg - 6.12.0.145 + https://download.mono-project.com/archive/6.12.0/macos-10-universal/MonoFramework-MDK-6.12.0.188.macos10.xamarin.universal.pkg + 6.12.0.188 $(MonoRequiredMinimumVersion) False True diff --git a/build-tools/automation/yaml-templates/setup-test-environment.yaml b/build-tools/automation/yaml-templates/setup-test-environment.yaml index 63dbd94e598..42c113deec0 100644 --- a/build-tools/automation/yaml-templates/setup-test-environment.yaml +++ b/build-tools/automation/yaml-templates/setup-test-environment.yaml @@ -8,6 +8,11 @@ parameters: jdkTestFolder: $(JAVA_HOME_11_X64) remove_dotnet: false installTestSlicer: false + installApkDiff: true + installLegacyDotNet: true + restoreNUnitConsole: true + updateMono: true + androidSdkPlatforms: 19,21,26,32,33 steps: - checkout: self @@ -40,11 +45,12 @@ steps: condition: and(succeeded(), eq(variables['agent.os'], 'Windows_NT')) # Install .NET 6 for legacy tests -- template: use-dot-net.yaml - parameters: - version: 6.0 - quality: GA - remove_dotnet: ${{ parameters.remove_dotnet }} +- ${{ if eq(parameters.installLegacyDotNet, true) }}: + - template: use-dot-net.yaml + parameters: + version: 6.0 + quality: GA + remove_dotnet: ${{ parameters.remove_dotnet }} # Install latest .NET - template: use-dot-net.yaml @@ -56,26 +62,28 @@ steps: custom: build-server arguments: shutdown -- template: run-xaprepare.yaml - parameters: - displayName: run xaprepare-UpdateMono - arguments: --s=UpdateMono --auto-provision=yes --auto-provision-uses-sudo=yes - condition: and(succeeded(), eq(variables['agent.os'], 'Darwin')) - xaSourcePath: ${{ parameters.xaSourcePath }} +- ${{ if eq(parameters.updateMono, true) }}: + - template: run-xaprepare.yaml + parameters: + displayName: run xaprepare-UpdateMono + arguments: --s=UpdateMono --auto-provision=yes --auto-provision-uses-sudo=yes + condition: and(succeeded(), eq(variables['agent.os'], 'Darwin')) + xaSourcePath: ${{ parameters.xaSourcePath }} - template: run-xaprepare.yaml parameters: - arguments: --s=AndroidTestDependencies --android-sdk-platforms="19,21,26,32,33" + arguments: --s=AndroidTestDependencies --android-sdk-platforms="${{ parameters.androidSdkPlatforms }}" xaSourcePath: ${{ parameters.xaSourcePath }} -- task: DotNetCoreCLI@2 - displayName: restore NUnit.Console - inputs: - command: restore - projects: ${{ parameters.xaSourcePath }}/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Xamarin.ProjectTools.csproj - restoreArguments: -bl:${{ parameters.xaSourcePath }}/bin/Test${{ parameters.configuration }}/restore-Xamarin.ProjectTools.binlog - nugetConfigPath: ${{ parameters.xaSourcePath }}/NuGet.config - feedsToUse: config +- ${{ if eq(parameters.restoreNUnitConsole, true) }}: + - task: DotNetCoreCLI@2 + displayName: restore NUnit.Console + inputs: + command: restore + projects: ${{ parameters.xaSourcePath }}/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Xamarin.ProjectTools.csproj + restoreArguments: -bl:${{ parameters.xaSourcePath }}/bin/Test${{ parameters.configuration }}/restore-Xamarin.ProjectTools.binlog + nugetConfigPath: ${{ parameters.xaSourcePath }}/NuGet.config + feedsToUse: config - task: DotNetCoreCLI@2 displayName: build Xamarin.Android.Tools.BootstrapTasks.csproj @@ -101,7 +109,8 @@ steps: projects: ${{ parameters.xaSourcePath }}/build-tools/create-packs/Microsoft.Android.Sdk.proj arguments: -t:ExtractWorkloadPacks -c ${{ parameters.configuration }} -v:n -bl:${{ parameters.xaSourcePath }}/bin/Test${{ parameters.configuration }}/extract-workloads.binlog -- template: install-apkdiff.yaml +- ${{ if eq(parameters.installApkDiff, true) }}: + - template: install-apkdiff.yaml - ${{ if eq(parameters.installTestSlicer, true) }}: - template: install-dotnet-test-slicer.yaml diff --git a/build-tools/automation/yaml-templates/stage-msbuild-emulator-tests.yaml b/build-tools/automation/yaml-templates/stage-msbuild-emulator-tests.yaml index 2438d9af305..35dfd624638 100644 --- a/build-tools/automation/yaml-templates/stage-msbuild-emulator-tests.yaml +++ b/build-tools/automation/yaml-templates/stage-msbuild-emulator-tests.yaml @@ -26,17 +26,24 @@ stages: cancelTimeoutInMinutes: 5 workspace: clean: all + variables: + androidSdkPlatforms: 33 steps: - template: setup-test-environment.yaml parameters: provisionClassic: false provisionatorChannel: ${{ parameters.provisionatorChannel }} installTestSlicer: true + installApkDiff: false + installLegacyDotNet: false + restoreNUnitConsole: false + updateMono: false + androidSdkPlatforms: $(androidSdkPlatforms) - template: run-xaprepare.yaml parameters: displayName: install emulator - arguments: --s=EmulatorTestDependencies --android-sdk-platforms="19,21,26,32,33" + arguments: --s=EmulatorTestDependencies --android-sdk-platforms="$(androidSdkPlatforms)" - task: DownloadPipelineArtifact@2 inputs: @@ -46,18 +53,13 @@ stages: - pwsh: | dotnet-test-slicer ` --test-assembly="$(System.DefaultWorkingDirectory)/bin/Test$(XA.Build.Configuration)/MSBuildDeviceIntegration/${{ parameters.target_framework }}/MSBuildDeviceIntegration.dll" ` - --test-filter="cat != TimeZoneInfo & cat != Localization ${{ parameters.nunit_categories }}" ` + --test-filter="cat != TimeZoneInfo & cat != Localization & cat != SmokeTests ${{ parameters.nunit_categories }}" ` --slice-number=$(System.JobPositionInPhase) ` --total-slices=$(System.TotalJobsInPhase) ` --outfile="$(System.DefaultWorkingDirectory)/bin/Test$(XA.Build.Configuration)/MSBuildDeviceIntegration/${{ parameters.target_framework }}/MSBuildDeviceIntegration.runsettings" displayName: Slice unit tests - - task: MSBuild@1 - displayName: start emulator - inputs: - solution: tests/Mono.Android-Tests/Mono.Android-Tests.csproj - configuration: $(XA.Build.Configuration) - msbuildArguments: /t:AcquireAndroidTarget /bl:$(System.DefaultWorkingDirectory)/bin/Test$(XA.Build.Configuration)/start-emulator.binlog + - template: start-stop-emulator.yaml - template: run-nunit-tests.yaml parameters: @@ -67,15 +69,9 @@ stages: dotNetTestExtraArgs: --settings "$(System.DefaultWorkingDirectory)/bin/Test$(XA.Build.Configuration)/MSBuildDeviceIntegration/${{ parameters.target_framework }}/MSBuildDeviceIntegration.runsettings" testResultsFile: TestResult-MSBuildDeviceIntegration-${{ parameters.job_name }}-$(System.JobPositionInPhase)-$(XA.Build.Configuration).xml - - task: MSBuild@1 - displayName: shut down emulator - inputs: - solution: tests/Mono.Android-Tests/Mono.Android-Tests.csproj - configuration: $(XA.Build.Configuration) - msbuildArguments: >- - /t:AcquireAndroidTarget,ReleaseAndroidTarget - /bl:$(System.DefaultWorkingDirectory)/bin/Test$(XA.Build.Configuration)/shutdown-emulator.binlog - condition: always() + - template: start-stop-emulator.yaml + parameters: + command: stop - template: upload-results.yaml parameters: @@ -94,6 +90,7 @@ stages: avdAbi: x86 avdType: android-wear deviceName: wear_square + androidSdkPlatforms: 33 pool: vmImage: $(HostedMacImage) workspace: @@ -101,7 +98,13 @@ stages: steps: - template: setup-test-environment.yaml parameters: + provisionClassic: false + provisionatorChannel: ${{ parameters.provisionatorChannel }} configuration: $(XA.Build.Configuration) + installApkDiff: false + installLegacyDotNet: false + restoreNUnitConsole: false + androidSdkPlatforms: $(androidSdkPlatforms) - template: run-xaprepare.yaml parameters: @@ -111,7 +114,7 @@ stages: - template: run-xaprepare.yaml parameters: displayName: install emulator - arguments: --s=EmulatorTestDependencies + arguments: --s=EmulatorTestDependencies --android-sdk-platforms="$(androidSdkPlatforms)" - script: echo "##vso[task.setvariable variable=Java8SdkDirectory]$JAVA_HOME_8_X64" displayName: set Java8SdkDirectory @@ -121,12 +124,13 @@ stages: artifactName: $(TestAssembliesArtifactName) downloadPath: $(System.DefaultWorkingDirectory)/bin/Test$(XA.Build.Configuration) - - task: MSBuild@1 - displayName: install and launch emulator - inputs: - solution: tests/Mono.Android-Tests/Mono.Android-Tests.csproj - configuration: $(XA.Build.Configuration) - msbuildArguments: /t:InstallAvdImage;AcquireAndroidTarget /p:TestDeviceName=$(deviceName) /p:TestAvdApiLevel=$(avdApiLevel) /p:TestAvdAbi=$(avdAbi) /p:TestAvdType=$(avdType) /bl:$(System.DefaultWorkingDirectory)/bin/Test$(XA.Build.Configuration)/install-emulator-$(avdApiLevel).binlog + - template: start-stop-emulator.yaml + parameters: + specificImage: true + deviceName: $(deviceName) + avdApiLevel: $(avdApiLevel) + avdAbi: $(avdAbi) + avdType: $(avdType) - template: run-nunit-tests.yaml parameters: @@ -135,13 +139,14 @@ stages: dotNetTestExtraArgs: --filter "TestCategory = WearOS" testResultsFile: TestResult-WearOS--$(XA.Build.Configuration).xml - - task: MSBuild@1 - displayName: shut down emulator - inputs: - solution: tests/Mono.Android-Tests/Mono.Android-Tests.csproj - configuration: $(XA.Build.Configuration) - msbuildArguments: /t:AcquireAndroidTarget,ReleaseAndroidTarget /p:TestDeviceName=$(deviceName) /p:TestAvdApiLevel=$(avdApiLevel) /p:TestAvdAbi=$(avdAbi) /p:TestAvdType=$(avdType) /bl:$(System.DefaultWorkingDirectory)/bin/Test$(XA.Build.Configuration)/shutdown-emulator.binlog - condition: always() + - template: start-stop-emulator.yaml + parameters: + command: stop + specificImage: true + deviceName: $(deviceName) + avdApiLevel: $(avdApiLevel) + avdAbi: $(avdAbi) + avdType: $(avdType) - template: upload-results.yaml parameters: diff --git a/build-tools/automation/yaml-templates/start-stop-emulator.yaml b/build-tools/automation/yaml-templates/start-stop-emulator.yaml new file mode 100644 index 00000000000..200637f1b51 --- /dev/null +++ b/build-tools/automation/yaml-templates/start-stop-emulator.yaml @@ -0,0 +1,31 @@ +parameters: + command: start # 'start' or 'stop' + specificImage: false # 'true' to use a specific emulator AVD image + deviceName: # Device name, like 'wear_square', required if 'specificImage' is 'true' + avdApiLevel: # Device API level, like '30', required if 'specificImage' is 'true' + avdAbi: # Device ABI, like 'x86', required if 'specificImage' is 'true' + avdType: # Device AVD, like 'android-wear', required if 'specificImage' is 'true' + +steps: +- ${{ if eq(parameters.command, 'start') }}: + - task: DotNetCoreCLI@2 + displayName: Start emulator + continueOnError: false + inputs: + projects: src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Emulator.csproj + ${{ if eq(parameters.specificImage, true) }}: + arguments: -c $(XA.Build.Configuration) -t:"InstallAvdImage;AcquireAndroidTarget" -p:TestDeviceName=${{ parameters.deviceName }} -p:TestAvdApiLevel=${{ parameters.avdApiLevel }} -p:TestAvdAbi=${{ parameters.avdAbi }} -p:TestAvdType=${{ parameters.avdType }} -bl:$(System.DefaultWorkingDirectory)/bin/Test$(XA.Build.Configuration)/install-emulator-${{ parameters.avdApiLevel }}.binlog + ${{ else }}: + arguments: -c $(XA.Build.Configuration) -t:AcquireAndroidTarget -bl:$(System.DefaultWorkingDirectory)/bin/Test$(XA.Build.Configuration)/start-emulator.binlog + +- ${{ if eq(parameters.command, 'stop') }}: + - task: DotNetCoreCLI@2 + displayName: Stop emulator + condition: always() + continueOnError: true + inputs: + projects: src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Emulator.csproj + ${{ if eq(parameters.specificImage, true) }}: + arguments: -c $(XA.Build.Configuration) -t:"AcquireAndroidTarget,ReleaseAndroidTarget" -p:TestDeviceName=${{ parameters.deviceName }} -p:TestAvdApiLevel=${{ parameters.avdApiLevel }} -p:TestAvdAbi=${{ parameters.avdAbi }} -p:TestAvdType=${{ parameters.avdType }} -bl:$(System.DefaultWorkingDirectory)/bin/Test$(XA.Build.Configuration)/shutdown-emulator.binlog + ${{ else }}: + arguments: -c $(XA.Build.Configuration) -t:"AcquireAndroidTarget,ReleaseAndroidTarget" -bl:$(System.DefaultWorkingDirectory)/bin/Test$(XA.Build.Configuration)/shutdown-emulator.binlog diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Emulator.csproj b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Emulator.csproj index 2d8b1d786a5..1962bfdcd1a 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Emulator.csproj +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Emulator.csproj @@ -3,6 +3,6 @@ netstandard2.0 false - - + + \ No newline at end of file From 2363e5c4089a144fa49ccc13c275b49eb86cdfc5 Mon Sep 17 00:00:00 2001 From: Alex Hsu Date: Fri, 3 Mar 2023 03:37:20 -0800 Subject: [PATCH 12/13] LEGO: Merge pull request 7852 LEGO: Merge pull request 7852 --- .../Properties/Resources.resx.lcl | 9 +++++++++ .../Properties/Resources.resx.lcl | 9 +++++++++ .../Properties/Resources.resx.lcl | 9 +++++++++ .../Properties/Resources.resx.lcl | 9 +++++++++ .../Properties/Resources.resx.lcl | 9 +++++++++ 5 files changed, 45 insertions(+) diff --git a/Localize/loc/ko/src/Xamarin.Android.Build.Tasks/Properties/Resources.resx.lcl b/Localize/loc/ko/src/Xamarin.Android.Build.Tasks/Properties/Resources.resx.lcl index 1443f892c48..9339042aef5 100644 --- a/Localize/loc/ko/src/Xamarin.Android.Build.Tasks/Properties/Resources.resx.lcl +++ b/Localize/loc/ko/src/Xamarin.Android.Build.Tasks/Properties/Resources.resx.lcl @@ -711,6 +711,15 @@ + + + + + + + + + diff --git a/Localize/loc/pl/src/Xamarin.Android.Build.Tasks/Properties/Resources.resx.lcl b/Localize/loc/pl/src/Xamarin.Android.Build.Tasks/Properties/Resources.resx.lcl index 79e14419ac6..c753eb4ab7a 100644 --- a/Localize/loc/pl/src/Xamarin.Android.Build.Tasks/Properties/Resources.resx.lcl +++ b/Localize/loc/pl/src/Xamarin.Android.Build.Tasks/Properties/Resources.resx.lcl @@ -711,6 +711,15 @@ + + + + + + + + + diff --git a/Localize/loc/ru/src/Xamarin.Android.Build.Tasks/Properties/Resources.resx.lcl b/Localize/loc/ru/src/Xamarin.Android.Build.Tasks/Properties/Resources.resx.lcl index 0c0b9892df9..da4a7ce0ca0 100644 --- a/Localize/loc/ru/src/Xamarin.Android.Build.Tasks/Properties/Resources.resx.lcl +++ b/Localize/loc/ru/src/Xamarin.Android.Build.Tasks/Properties/Resources.resx.lcl @@ -711,6 +711,15 @@ + + + + + + + + + diff --git a/Localize/loc/tr/src/Xamarin.Android.Build.Tasks/Properties/Resources.resx.lcl b/Localize/loc/tr/src/Xamarin.Android.Build.Tasks/Properties/Resources.resx.lcl index dfd24cad1bf..d189a40c3c1 100644 --- a/Localize/loc/tr/src/Xamarin.Android.Build.Tasks/Properties/Resources.resx.lcl +++ b/Localize/loc/tr/src/Xamarin.Android.Build.Tasks/Properties/Resources.resx.lcl @@ -711,6 +711,15 @@ + + + + + + + + + diff --git a/Localize/loc/zh-Hant/src/Xamarin.Android.Build.Tasks/Properties/Resources.resx.lcl b/Localize/loc/zh-Hant/src/Xamarin.Android.Build.Tasks/Properties/Resources.resx.lcl index 9d5d8eacbfa..7283f5b62f9 100644 --- a/Localize/loc/zh-Hant/src/Xamarin.Android.Build.Tasks/Properties/Resources.resx.lcl +++ b/Localize/loc/zh-Hant/src/Xamarin.Android.Build.Tasks/Properties/Resources.resx.lcl @@ -711,6 +711,15 @@ + + + + + + + + + From e7db44ebcbd50fd3bebbc0776c4e9e466658dfc8 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Fri, 3 Mar 2023 21:36:21 -0600 Subject: [PATCH 13/13] Bump to dotnet/installer/main@632ddca 8.0.100-preview.3.23128.1 (#7836) Changes: https://github.com/dotnet/installer/compare/e3ab0b5...632ddca Changes: https://github.com/dotnet/runtime/compare/ff7c19f...2bdc3cb Updates: * Microsoft.Dotnet.Sdk.Internal: from 8.0.100-preview.2.23123.10 to 8.0.100-preview.3.23128.1 * Microsoft.NET.ILLink.Tasks: from 8.0.0-preview.2.23123.4 to 8.0.0-preview.2.23127.4 * Microsoft.NETCore.App.Ref: from 8.0.0-preview.2.23123.4 to 8.0.0-preview.2.23127.4 ~~ Other changes ~~ * Keep `$(DotNetMonoManifestVersionBand)` on preview.2 * Keep `$(DotNetEmscriptenManifestVersionBand)` on preview.2 * Changes for the linker's new dependency: `Microsoft.DotNet.Cecil` * Update `BuildReleaseArm64XFormsDotNet.apkdesc` apkdiff: File 'assemblies/System.IO.Compression.dll' has changed by -875 bytes (-5.47 %). This exceeds the threshold of 5.00 %. * Update to MSBuild.StructuredLogger 2.1.787 System.NotSupportedException : Unsupported log file format. Latest supported version is 15, the log file has version 16. Co-authored-by: Jonathan Peppers --- NuGet.config | 1 + eng/Version.Details.xml | 16 ++-- eng/Versions.props | 11 +-- .../Microsoft.Android.Sdk.ILLink.csproj | 1 - .../BuildReleaseArm64XFormsDotNet.apkdesc | 82 +++++++++---------- .../MSBuildDeviceIntegration.csproj | 2 +- 6 files changed, 59 insertions(+), 54 deletions(-) diff --git a/NuGet.config b/NuGet.config index 1e45ad9f6d6..5e5f9f5e6a7 100644 --- a/NuGet.config +++ b/NuGet.config @@ -7,6 +7,7 @@ + diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 8cde5bb99d6..d439cfbac5a 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -1,21 +1,25 @@ - + https://github.com/dotnet/installer - e3ab0b5b8c29d8d882ab1bfe6a5a99a703622c7e + 632ddca23b8ec1393a1ec26607650236290276f1 - + https://github.com/dotnet/runtime - ff7c19f266c835e3694a088c4a9e4e5a1ffb1b74 + 2bdc3cb8dd3500aa2b3a51b558782560b26b5973 - + https://github.com/dotnet/runtime - ff7c19f266c835e3694a088c4a9e4e5a1ffb1b74 + 2bdc3cb8dd3500aa2b3a51b558782560b26b5973 https://github.com/dotnet/emsdk d7ff0aa47c680be543905cc1410e2f62b54dfefe + + https://github.com/dotnet/cecil + 68e0c35d0b4b6651b9a062a52e7dd694d7a43927 + https://github.com/dotnet/runtime 9529803ae29c2804880c6bd8ca710b8c037cb498 diff --git a/eng/Versions.props b/eng/Versions.props index 0a14f1f09ab..27ee25f6445 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -1,14 +1,15 @@ - 8.0.100-preview.2.23123.10 - 8.0.0-preview.2.23123.4 - 8.0.0-preview.2.23123.4 + 8.0.100-preview.3.23128.1 + 8.0.0-preview.2.23127.4 + 8.0.0-preview.2.23127.4 7.0.0-beta.22103.1 7.0.0-beta.22103.1 8.0.0-preview.2.23113.1 $(MicrosoftNETWorkloadEmscriptenCurrentManifest80100preview2Version) 7.0.100-rc.1.22410.7 + 0.11.4-alpha.23113.1 8.0.0-alpha.1.23080.2 @@ -18,7 +19,7 @@ $(DotNetPreviewVersionBand) $(DotNetPreviewVersionBand) - $(DotNetPreviewVersionBand) - $(DotNetPreviewVersionBand) + 8.0.100-preview.2 + 8.0.100-preview.2 diff --git a/src/Microsoft.Android.Sdk.ILLink/Microsoft.Android.Sdk.ILLink.csproj b/src/Microsoft.Android.Sdk.ILLink/Microsoft.Android.Sdk.ILLink.csproj index fcb1091f3da..aa8694c7a3c 100644 --- a/src/Microsoft.Android.Sdk.ILLink/Microsoft.Android.Sdk.ILLink.csproj +++ b/src/Microsoft.Android.Sdk.ILLink/Microsoft.Android.Sdk.ILLink.csproj @@ -7,7 +7,6 @@ $(MicrosoftAndroidSdkOutDir) - diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Resources/Base/BuildReleaseArm64XFormsDotNet.apkdesc b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Resources/Base/BuildReleaseArm64XFormsDotNet.apkdesc index 6902b06169c..eb2fe1d1bbf 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Resources/Base/BuildReleaseArm64XFormsDotNet.apkdesc +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Resources/Base/BuildReleaseArm64XFormsDotNet.apkdesc @@ -11,19 +11,19 @@ "Size": 7313 }, "assemblies/Java.Interop.dll": { - "Size": 66562 + "Size": 66563 }, "assemblies/Mono.Android.dll": { - "Size": 444972 + "Size": 445325 }, "assemblies/Mono.Android.Runtime.dll": { - "Size": 5822 + "Size": 5895 }, "assemblies/mscorlib.dll": { - "Size": 3866 + "Size": 3868 }, "assemblies/netstandard.dll": { - "Size": 5579 + "Size": 5580 }, "assemblies/rc.bin": { "Size": 1182 @@ -32,109 +32,109 @@ "Size": 11561 }, "assemblies/System.Collections.dll": { - "Size": 15271 + "Size": 15405 }, "assemblies/System.Collections.NonGeneric.dll": { - "Size": 7499 + "Size": 7501 }, "assemblies/System.ComponentModel.dll": { "Size": 1973 }, "assemblies/System.ComponentModel.Primitives.dll": { - "Size": 2595 + "Size": 2596 }, "assemblies/System.ComponentModel.TypeConverter.dll": { - "Size": 6081 + "Size": 6083 }, "assemblies/System.Console.dll": { "Size": 6623 }, "assemblies/System.Core.dll": { - "Size": 1992 + "Size": 1994 }, "assemblies/System.Diagnostics.TraceSource.dll": { - "Size": 6591 + "Size": 6590 }, "assemblies/System.dll": { - "Size": 2347 + "Size": 2349 }, "assemblies/System.Drawing.dll": { - "Size": 2032 + "Size": 2034 }, "assemblies/System.Drawing.Primitives.dll": { - "Size": 12010 + "Size": 12011 }, "assemblies/System.IO.Compression.Brotli.dll": { - "Size": 11871 + "Size": 11031 }, "assemblies/System.IO.Compression.dll": { - "Size": 16858 + "Size": 15983 }, "assemblies/System.IO.IsolatedStorage.dll": { - "Size": 10011 + "Size": 10013 }, "assemblies/System.Linq.dll": { - "Size": 19453 + "Size": 19455 }, "assemblies/System.Linq.Expressions.dll": { - "Size": 164141 + "Size": 164140 }, "assemblies/System.Net.Http.dll": { - "Size": 66153 + "Size": 65497 }, "assemblies/System.Net.Primitives.dll": { - "Size": 22487 + "Size": 22480 }, "assemblies/System.Net.Requests.dll": { - "Size": 3630 + "Size": 3632 }, "assemblies/System.ObjectModel.dll": { - "Size": 8154 + "Size": 8155 }, "assemblies/System.Private.CoreLib.dll": { - "Size": 814322 + "Size": 814504 }, "assemblies/System.Private.DataContractSerialization.dll": { - "Size": 192370 + "Size": 192382 }, "assemblies/System.Private.Uri.dll": { - "Size": 42897 + "Size": 42896 }, "assemblies/System.Private.Xml.dll": { - "Size": 216180 + "Size": 216178 }, "assemblies/System.Private.Xml.Linq.dll": { - "Size": 16673 + "Size": 16674 }, "assemblies/System.Runtime.dll": { - "Size": 2774 + "Size": 2776 }, "assemblies/System.Runtime.InteropServices.dll": { - "Size": 3760 + "Size": 3762 }, "assemblies/System.Runtime.Serialization.dll": { - "Size": 1950 + "Size": 1952 }, "assemblies/System.Runtime.Serialization.Formatters.dll": { - "Size": 2517 + "Size": 2518 }, "assemblies/System.Runtime.Serialization.Primitives.dll": { - "Size": 3802 + "Size": 3804 }, "assemblies/System.Security.Cryptography.dll": { - "Size": 7781 + "Size": 7776 }, "assemblies/System.Text.RegularExpressions.dll": { - "Size": 157123 + "Size": 157124 }, "assemblies/System.Xml.dll": { - "Size": 1839 + "Size": 1841 }, "assemblies/System.Xml.Linq.dll": { - "Size": 1864 + "Size": 1866 }, "assemblies/UnnamedProject.dll": { - "Size": 5286 + "Size": 5294 }, "assemblies/Xamarin.AndroidX.Activity.dll": { "Size": 5867 @@ -209,10 +209,10 @@ "Size": 93552 }, "lib/arm64-v8a/libmonodroid.so": { - "Size": 380656 + "Size": 380736 }, "lib/arm64-v8a/libmonosgen-2.0.so": { - "Size": 3106808 + "Size": 3107296 }, "lib/arm64-v8a/libSystem.IO.Compression.Native.so": { "Size": 723840 @@ -224,7 +224,7 @@ "Size": 154904 }, "lib/arm64-v8a/libxamarin-app.so": { - "Size": 333840 + "Size": 333880 }, "META-INF/android.support.design_material.version": { "Size": 12 diff --git a/tests/MSBuildDeviceIntegration/MSBuildDeviceIntegration.csproj b/tests/MSBuildDeviceIntegration/MSBuildDeviceIntegration.csproj index cf067e4e5b5..a9f9b4d3621 100644 --- a/tests/MSBuildDeviceIntegration/MSBuildDeviceIntegration.csproj +++ b/tests/MSBuildDeviceIntegration/MSBuildDeviceIntegration.csproj @@ -38,7 +38,7 @@ - +