From 8f8903a0824da236932a29faa78f6a4c758d6b77 Mon Sep 17 00:00:00 2001 From: Jonathan Peppers Date: Tue, 4 Sep 2018 16:49:10 -0500 Subject: [PATCH] [Xamarin.Android.Build.Tasks] ignore aapt/AndroidManifest.xml Context: https://stackoverflow.com/questions/41592744/function-of-aapt-androidmanifest-xml-in-aar Fixes: https://github.com/xamarin/xamarin-android/issues/2141 Apparently Android Studio is now shipping a duplicate, pre-formatted `AndroidManifest.xml` file, inside of AAR files. Its purpose is to be used with `aapt` invocations, since errors may be thrown related to `{` or `}` characters. Since this file may exist in AAR files used by Xamarin.Android, we should ignore `aapt/AndroidManifest.xml` files the same way we ignore them inside `manifest` or `bin` directories. Changes: - Added a `IgnoredManifestDirectories` list, since we are getting to a point where `!= && != && !=` would be a lot of noise. - Switched the LINQ expression to simple `foreach` loop, which should also give a slight performance benefit. --- .../Tasks/GetImportedLibraries.cs | 21 ++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/src/Xamarin.Android.Build.Tasks/Tasks/GetImportedLibraries.cs b/src/Xamarin.Android.Build.Tasks/Tasks/GetImportedLibraries.cs index c1381885de8..153c76a1680 100644 --- a/src/Xamarin.Android.Build.Tasks/Tasks/GetImportedLibraries.cs +++ b/src/Xamarin.Android.Build.Tasks/Tasks/GetImportedLibraries.cs @@ -14,6 +14,12 @@ namespace Xamarin.Android.Tasks { public class GetImportedLibraries : Task { + static readonly string [] IgnoredManifestDirectories = new [] { + "bin", + "manifest", + "aapt", + }; + [Required] public string TargetDirectory { get; set; } @@ -37,13 +43,14 @@ public override bool Execute () return true; } // there could be ./AndroidManifest.xml and bin/AndroidManifest.xml, which will be the same. So, ignore "bin" ones. - ManifestDocuments = Directory.GetFiles (TargetDirectory, "AndroidManifest.xml", SearchOption.AllDirectories) - .Where (f => { - var directory = Path.GetFileName (Path.GetDirectoryName (f)); - return directory != "bin" && directory != "manifest"; - }) - .Select (p => new TaskItem (p)) - .ToArray (); + var manifestDocuments = new List (); + foreach (var f in Directory.EnumerateFiles (TargetDirectory, "AndroidManifest.xml", SearchOption.AllDirectories)) { + var directory = Path.GetFileName (Path.GetDirectoryName (f)); + if (IgnoredManifestDirectories.Contains (directory)) + continue; + manifestDocuments.Add (new TaskItem (f)); + } + ManifestDocuments = manifestDocuments.ToArray (); NativeLibraries = Directory.GetFiles (TargetDirectory, "*.so", SearchOption.AllDirectories) .Where (p => MonoAndroidHelper.GetNativeLibraryAbi (p) != null) .Select (p => new TaskItem (p)).ToArray ();