From 89f5e6345d70c3cbac6edf8d0cdff00f1d2fc89e Mon Sep 17 00:00:00 2001 From: Dean Ellis Date: Thu, 10 Aug 2023 15:14:42 +0100 Subject: [PATCH] Fix error detection on Windows. Update docs --- Documentation/guides/messages/apt2264.md | 18 +++++---- .../Properties/Resources.resx | 2 +- .../Tasks/Aapt2.cs | 40 +++++++++++-------- 3 files changed, 35 insertions(+), 25 deletions(-) diff --git a/Documentation/guides/messages/apt2264.md b/Documentation/guides/messages/apt2264.md index d058a29a74f..8d264efa562 100644 --- a/Documentation/guides/messages/apt2264.md +++ b/Documentation/guides/messages/apt2264.md @@ -9,27 +9,29 @@ ms.date: 12/16/2022 The tool `aapt2` is unable to resolve one of the files it was passed. This is generally caused by the path being longer than the Maximum Path -length allowed on windows. +length allowed on windows. Alternately it might be due to non-ASCII +characters in the project name or the path to the project. ## Solution The best way to avoid this is to ensure that your project is not located -deep in the folder structure. For example if you create all of your -projects in folders such as +deep in the folder structure and does not contain non-ASCII characters. +For example if you create all of your projects in folders such as -`C:\Users\shelly\Visual Studio\Android\MyProjects\Com.SomeReallyLongCompanyName.MyBrillantApplication\MyBrilliantApplicaiton.Android\` +`C:\Users\shëlly\Visual Studio\Android\MyProjects\Com.SomeReallyLongCompanyName.MyBrillantApplication\MyBrilliantApplicaiton.Android\` you may well encounter problems with not only `aapt2` but also Ahead of Time -compilation. Keeping your project names and folder structures short and -concise will help work around these issues. For example instead of the above +compilation. Keeping your project names and folder structures short, concise and +ASCII will help work around these issues. For example instead of the above you could use `C:\Work\Android\MyBrilliantApp` Which is much shorter and much less likely to encounter path issues. -However this is no always possible. Sometimes a project or a environment requires -deep folder structures. In this case enabling long path support in Windows *might* +However this is not always possible. Sometimes a project or a environment requires +deep folder structures. For non-ASCII paths there is no work around. +In the long path case, enabling long path support in Windows *might* be enough to get your project working. Details on how to do this can be found [here](https://learn.microsoft.com/windows/win32/fileio/maximum-file-path-limitation?tabs=registry#enable-long-paths-in-windows-10-version-1607-and-later). diff --git a/src/Xamarin.Android.Build.Tasks/Properties/Resources.resx b/src/Xamarin.Android.Build.Tasks/Properties/Resources.resx index dfb964b4851..7409bfc460f 100644 --- a/src/Xamarin.Android.Build.Tasks/Properties/Resources.resx +++ b/src/Xamarin.Android.Build.Tasks/Properties/Resources.resx @@ -542,7 +542,7 @@ Either change the value in the AndroidManifest.xml to match the $(SupportedOSPla {0} - The assembly name - This is probably caused by the project exceeding the Windows maximum path length limitation. See https://learn.microsoft.com/xamarin/android/errors-and-warnings/apt2264 for details. + This is probably caused by the project having non-ASCII characters in it path or exceeding the Windows maximum path length limitation. See https://learn.microsoft.com/xamarin/android/errors-and-warnings/apt2264 for details. The following are literal names and should not be translated: diff --git a/src/Xamarin.Android.Build.Tasks/Tasks/Aapt2.cs b/src/Xamarin.Android.Build.Tasks/Tasks/Aapt2.cs index 34dd70fb1a6..abba06c73e6 100644 --- a/src/Xamarin.Android.Build.Tasks/Tasks/Aapt2.cs +++ b/src/Xamarin.Android.Build.Tasks/Tasks/Aapt2.cs @@ -138,22 +138,8 @@ protected bool LogAapt2EventsFromOutput (string singleLine, MessageImportance me LogCodedError ("APT0001", Properties.Resources.APT0001, message.Substring ("unknown option '".Length).TrimEnd ('.', '\'')); return false; } - if (message.Contains ("in APK") && message.Contains ("is compressed.")) { - LogMessage (singleLine, messageImportance); + if (LogNotesOrWarnings (message, singleLine, messageImportance)) return true; - } - if (message.Contains ("fakeLogOpen")) { - LogMessage (singleLine, messageImportance); - return true; - } - if (message.Contains ("note:")) { - LogMessage (singleLine, messageImportance); - return true; - } - if (message.Contains ("warn:")) { - LogCodedWarning (GetErrorCode (singleLine), singleLine); - return true; - } if (level.Contains ("note")) { LogMessage (message, messageImportance); return true; @@ -199,6 +185,8 @@ protected bool LogAapt2EventsFromOutput (string singleLine, MessageImportance me if (!apptResult) { var message = string.Format ("{0} \"{1}\".", singleLine.Trim (), singleLine.Substring (singleLine.LastIndexOfAny (new char [] { '\\', '/' }) + 1)); + if (LogNotesOrWarnings (message, singleLine, messageImportance)) + return true; var errorCode = GetErrorCode (message); LogCodedError (errorCode, AddAdditionalErrorText (errorCode, message), ToolName); } else { @@ -207,6 +195,27 @@ protected bool LogAapt2EventsFromOutput (string singleLine, MessageImportance me return true; } + bool LogNotesOrWarnings (string message, string singleLine, MessageImportance messageImportance) + { + if (message.Contains ("in APK") && message.Contains ("is compressed.")) { + LogMessage (singleLine, messageImportance); + return true; + } + if (message.Contains ("fakeLogOpen")) { + LogMessage (singleLine, messageImportance); + return true; + } + if (message.Contains ("note:")) { + LogMessage (singleLine, messageImportance); + return true; + } + if (message.Contains ("warn:")) { + LogCodedWarning (GetErrorCode (singleLine), singleLine); + return true; + } + return false; + } + static string AddAdditionalErrorText (string errorCode, string message) { var sb = new StringBuilder (); @@ -226,7 +235,6 @@ static string GetErrorCode (string message) if (message.IndexOf (tuple.Item2, StringComparison.OrdinalIgnoreCase) >= 0) return tuple.Item1; - Console.WriteLine ($"DEBUG could not match '${message}'"); return "APT2000"; }