From 4b0624b52d582394b565ae6514eccd3c051fbe48 Mon Sep 17 00:00:00 2001 From: Jonathan Peppers Date: Tue, 27 Oct 2026 09:45:39 -0500 Subject: [PATCH] [Xamarin.Android.Build.Tasks] Enable MT library imports cache reads Allow to run in process during multithreaded MSBuild builds. Use the task environment to resolve the cache file instead of the shared process working directory. Preserve empty and missing cache behavior, output items, metadata and logging. Add relative-path and missing-cache tests to the existing migration test fixture. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- .../Tasks/ReadLibraryProjectImportsCache.cs | 11 +++--- .../Tasks/MultiThreadedMigrationTests.cs | 35 +++++++++++++++++++ 2 files changed, 39 insertions(+), 7 deletions(-) diff --git a/src/Xamarin.Android.Build.Tasks/Tasks/ReadLibraryProjectImportsCache.cs b/src/Xamarin.Android.Build.Tasks/Tasks/ReadLibraryProjectImportsCache.cs index ebfb1f75f35..d5de08609ff 100644 --- a/src/Xamarin.Android.Build.Tasks/Tasks/ReadLibraryProjectImportsCache.cs +++ b/src/Xamarin.Android.Build.Tasks/Tasks/ReadLibraryProjectImportsCache.cs @@ -24,17 +24,15 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. #nullable enable -using System; using System.IO; -using System.Linq; using System.Xml.Linq; -using Microsoft.Build.Utilities; using Microsoft.Build.Framework; using Microsoft.Android.Build.Tasks; namespace Xamarin.Android.Tasks { - public class ReadLibraryProjectImportsCache : AndroidTask + [MSBuildMultiThreadableTask] + public class ReadLibraryProjectImportsCache : MultithreadedAndroidTask { public override string TaskPrefix => "RLC"; @@ -66,11 +64,11 @@ public override bool RunTask () { Log.LogDebugMessage ("Task ReadLibraryProjectImportsCache"); Log.LogDebugMessage (" CacheFile: {0}", CacheFile); - if (!File.Exists (CacheFile)) { + if (CacheFile.IsNullOrEmpty () || !File.Exists (TaskEnvironment.GetAbsolutePath (CacheFile))) { Log.LogDebugMessage ("{0} does not exist. No Project Library Imports found", CacheFile); return !Log.HasLoggedErrors; } - var doc = XDocument.Load (CacheFile); + var doc = XDocument.Load (TaskEnvironment.GetAbsolutePath (CacheFile)); Jars = doc.GetPathsAsTaskItems ("Jars", "Jar"); ResolvedAssetDirectories = doc.GetPathsAsTaskItems ("ResolvedAssetDirectories", "ResolvedAssetDirectory"); ResolvedResourceDirectories = doc.GetPathsAsTaskItems ("ResolvedResourceDirectories", "ResolvedResourceDirectory"); @@ -84,4 +82,3 @@ public override bool RunTask () } } } - diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Tasks/MultiThreadedMigrationTests.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Tasks/MultiThreadedMigrationTests.cs index ba7ae2c2763..dbc65453b7a 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Tasks/MultiThreadedMigrationTests.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Tasks/MultiThreadedMigrationTests.cs @@ -8,6 +8,7 @@ using Microsoft.Build.Framework; using Mono.Cecil; using NUnit.Framework; +using Xamarin.Android.Tasks; using Xamarin.ProjectTools; namespace Xamarin.Android.Build.Tests @@ -15,6 +16,40 @@ namespace Xamarin.Android.Build.Tests [TestFixture] public class MultiThreadedMigrationTests { + [Test] + public void ReadLibraryProjectImportsCacheUsesProjectDirectory () + { + var directory = Path.Combine (Path.GetTempPath (), Path.GetRandomFileName ()); + Directory.CreateDirectory (directory); + try { + var cacheFile = Path.GetRandomFileName (); + File.WriteAllText (Path.Combine (directory, cacheFile), "a.jar"); + var task = new ReadLibraryProjectImportsCache { + BuildEngine = new MockBuildEngine (TextWriter.Null), + TaskEnvironment = TaskEnvironment.CreateWithProjectDirectoryAndEnvironment (directory, new Dictionary ()), + CacheFile = cacheFile, + }; + Assert.IsTrue (task.Execute ()); + Assert.AreEqual ("a.jar", task.Jars?.Single ().ItemSpec); + } finally { + Directory.Delete (directory, recursive: true); + } + } + + [TestCase ("")] + [TestCase ("missing.xml")] + public void ReadLibraryProjectImportsCacheMissingFile (string cacheFile) + { + var task = new ReadLibraryProjectImportsCache { + BuildEngine = new MockBuildEngine (TextWriter.Null), + TaskEnvironment = TaskEnvironment.CreateWithProjectDirectoryAndEnvironment ( + Path.Combine (Path.GetTempPath (), Path.GetRandomFileName ()), new Dictionary ()), + CacheFile = cacheFile, + }; + Assert.IsTrue (task.Execute ()); + Assert.IsNull (task.Jars); + } + [Test] public void MigratedTasksHaveDirectAttribute () {