diff --git a/src/Xamarin.Android.Build.Tasks/Tasks/Aapt2.cs b/src/Xamarin.Android.Build.Tasks/Tasks/Aapt2.cs index 193a72e630f..270cba59190 100644 --- a/src/Xamarin.Android.Build.Tasks/Tasks/Aapt2.cs +++ b/src/Xamarin.Android.Build.Tasks/Tasks/Aapt2.cs @@ -84,7 +84,7 @@ public override bool Execute () DaemonMaxInstanceCount = maxInstances; else DaemonMaxInstanceCount = Math.Min (DaemonMaxInstanceCount, maxInstances); - daemon = Aapt2Daemon.GetInstance (BuildEngine4, GenerateFullPathToTool (), + daemon = Aapt2Daemon.GetInstance (BuildEngine4, LogDebugMessage, GenerateFullPathToTool (), DaemonMaxInstanceCount, GetRequiredDaemonInstances (), registerInDomain: DaemonKeepInDomain); return base.Execute (); } diff --git a/src/Xamarin.Android.Build.Tasks/Utilities/Aapt2Daemon.cs b/src/Xamarin.Android.Build.Tasks/Utilities/Aapt2Daemon.cs index ec6aa25a035..7454f024c41 100644 --- a/src/Xamarin.Android.Build.Tasks/Utilities/Aapt2Daemon.cs +++ b/src/Xamarin.Android.Build.Tasks/Utilities/Aapt2Daemon.cs @@ -19,13 +19,13 @@ internal class Aapt2Daemon : IDisposable internal static object RegisterTaskObjectKey => TypeFullName; - public static Aapt2Daemon GetInstance (IBuildEngine4 engine, string aapt2, int numberOfInstances, int initalNumberOfDaemons, bool registerInDomain = false) + public static Aapt2Daemon GetInstance (IBuildEngine4 engine, Action log, string aapt2, int numberOfInstances, int initalNumberOfDaemons, bool registerInDomain = false) { var area = registerInDomain ? RegisteredTaskObjectLifetime.AppDomain : RegisteredTaskObjectLifetime.Build; var daemon = engine.GetRegisteredTaskObjectAssemblyLocal (RegisterTaskObjectKey, area); if (daemon == null) { - daemon = new Aapt2Daemon (aapt2, numberOfInstances, initalNumberOfDaemons); + daemon = new Aapt2Daemon (aapt2, numberOfInstances, initalNumberOfDaemons, log); engine.RegisterTaskObjectAssemblyLocal (RegisterTaskObjectKey, daemon, area, allowEarlyCollection: false); } return daemon; @@ -66,6 +66,7 @@ public void Complete (bool result) long jobsRunning = 0; long jobId = 0; int maxInstances = 0; + Action logger = null; public CancellationToken Token => tcs.Token; @@ -86,10 +87,11 @@ public bool JobsRunning public int CurrentInstances => daemons.Count; - public Aapt2Daemon (string aapt2, int maxNumberOfInstances, int initalNumberOfDaemons) + public Aapt2Daemon (string aapt2, int maxNumberOfInstances, int initalNumberOfDaemons, Action log) { Aapt2 = aapt2; maxInstances = maxNumberOfInstances; + logger = log; for (int i = 0; i < initalNumberOfDaemons; i++) { SpawnAapt2Daemon (); } @@ -271,9 +273,19 @@ private void Aapt2DaemonStart () { // Ignore this error. It occurs when the Task is cancelled. } - aapt2.StandardInput.WriteLine ("quit"); - aapt2.StandardInput.WriteLine (); - aapt2.WaitForExit ((int)TimeSpan.FromSeconds (5).TotalMilliseconds); + try { + aapt2.StandardInput.WriteLine ("quit"); + aapt2.StandardInput.WriteLine (); + aapt2.WaitForExit ((int)TimeSpan.FromSeconds (5).TotalMilliseconds); + } catch (IOException) { + // Ignore this error. It occurs when the Build it cancelled. + try { + logger?.Invoke ($"{nameof (Aapt2Daemon)}: Ignoring IOException. Build was cancelled."); + } catch { + // The Logger might not exist if the daemon exits after the logger has been + // collected. + } + } } bool IsAapt2Warning (string singleLine)