dotnet / android

.NET for Android provides open-source bindings of the Android SDK for use with .NET managed languages such as C#
MIT License
1.92k stars 526 forks source link

Starting in Xamarin.Android 11.0, "error APT2144: invalid file path" can prevent building successfully because Android resources in unrecognized subdirectories are no longer silently ignored #5052

Open brendanzagaeski opened 4 years ago

brendanzagaeski commented 4 years ago

Context: https://developercommunity.visualstudio.com/content/problem/1156349/index.html

Steps to reproduce

  1. Create a new Mobile App (Xamarin.Forms) > Master-Detail project that targets Android.
  2. In the Solution Explorer, under the Resources\drawable directory, add a subdirectory like subdirectory.
  3. Copy the existing _xamarinlogo.png resource from Resources\drawable into the new subdirectory.
  4. Build the project.

Alternatively, extract the attached test case and build it on the command line:

msbuild -restore

Test case: AndroidResourcesSubdirectory.zip

Expected behavior

The build should succeed.

For example, the build succeeds in Visual Studio 2019 version 16.6.5 with Xamarin.Android SDK version 10.3.1.4 (d16-6@3a10de9).

I think the relevant invocation of Aapt2Compile from the diagnostic build output is:

Task "Aapt2Compile"
  Task Parameter:FlatArchivesDirectory=obj\Debug\90\flata\
  Task Parameter:ResourceDirectories=obj\Debug\90\res\
  Task Parameter:ResourceNameCaseMap=layout\Tabbar.xml|layout\tabbar.xml;layout\Toolbar.xml|layout\toolbar.xml;
  Task Parameter:ToolPath=C:\Program Files
  Executing compile -o obj\Debug\90\flata\compiled.flata --dir obj\Debug\90\res
Done executing task "Aapt2Compile".

It appears _drawable\subdirectory\xamarinlogo.png is ignored in this case. It seems only _drawable\xamarinlogo.png is packaged into the app:

C:\> "%VSINSTALLDIR%\MSBuild\Xamarin\Android\aapt2.exe" dump resources C:\Temp\AndroidResourcesSubdirectory\MobileAppXamarinForms1\MobileAppXamarinForms1.Android\bin\Debug\com.companyname.mobileappxamarinforms1.apk | findstr xamarin_logo
    resource 0x7f070076 drawable/xamarin_logo
      () (file) res/drawable/xamarin_logo.png type=PNG

Related: https://stackoverflow.com/questions/1077357/can-the-android-drawable-directory-contain-subdirectories

Actual behavior

In Visual Studio 2019 version 16.7.2 with Xamarin.Android SDK version 11.0.2.0, the build fails:

error APT2144: invalid file path 'C:\Temp\AndroidResourcesSubdirectory\MobileAppXamarinForms1\MobileAppXamarinForms1.Android\obj\Debug\90\res\drawable\subdirectory\xamarin_logo.png'

It looks like the difference is that Aapt2Compile now passes each resource path individually to AAPT2:

Task "Aapt2Compile"
  Task Parameter:DaemonMaxInstanceCount=0
  Task Parameter:DaemonKeepInDomain=False
  Task Parameter:FlatFilesDirectory=obj\Debug\90\flat\
  Task Parameter:FlatArchivesDirectory=obj\Debug\90\flata\
  Task Parameter:
      ResourcesToCompile=

(I'll omit the full list of items from ResourcesToCompile for compactness.)

  Task Parameter:ResourceDirectories=obj\Debug\90\res\
  Task Parameter:ResourceNameCaseMap=layout\Tabbar.xml|layout\tabbar.xml;layout\Toolbar.xml|layout\toolbar.xml;
  Task Parameter:ToolPath=C:\Program Files
  Executing compile -o C:\Temp\AndroidResourcesSubdirectory\MobileAppXamarinForms1\MobileAppXamarinForms1.Android\obj\Debug\90\lp\12\jl\res\..\flat\12.flata --dir C:\Temp\AndroidResourcesSubdirectory\MobileAppXamarinForms1\MobileAppXamarinForms1.Android\obj\Debug\90\lp\12\jl\res
  Executing compile -o C:\Temp\AndroidResourcesSubdirectory\MobileAppXamarinForms1\MobileAppXamarinForms1.Android\obj\Debug\90\lp\26\jl\res\..\flat\26.flata --dir C:\Temp\AndroidResourcesSubdirectory\MobileAppXamarinForms1\MobileAppXamarinForms1.Android\obj\Debug\90\lp\26\jl\res
  Executing compile -o C:\Temp\AndroidResourcesSubdirectory\MobileAppXamarinForms1\MobileAppXamarinForms1.Android\obj\Debug\90\lp\32\jl\res\..\flat\32.flata --dir C:\Temp\AndroidResourcesSubdirectory\MobileAppXamarinForms1\MobileAppXamarinForms1.Android\obj\Debug\90\lp\32\jl\res
  Executing compile -o C:\Temp\AndroidResourcesSubdirectory\MobileAppXamarinForms1\MobileAppXamarinForms1.Android\obj\Debug\90\lp\33\jl\res\..\flat\33.flata --dir C:\Temp\AndroidResourcesSubdirectory\MobileAppXamarinForms1\MobileAppXamarinForms1.Android\obj\Debug\90\lp\33\jl\res
  Executing compile -o C:\Temp\AndroidResourcesSubdirectory\MobileAppXamarinForms1\MobileAppXamarinForms1.Android\obj\Debug\90\flat\ C:\Temp\AndroidResourcesSubdirectory\MobileAppXamarinForms1\MobileAppXamarinForms1.Android\obj\Debug\90\res\drawable\subdirectory\xamarin_logo.png
  Executing compile -o C:\Temp\AndroidResourcesSubdirectory\MobileAppXamarinForms1\MobileAppXamarinForms1.Android\obj\Debug\90\lp\13\jl\res\..\flat\13.flata --dir C:\Temp\AndroidResourcesSubdirectory\MobileAppXamarinForms1\MobileAppXamarinForms1.Android\obj\Debug\90\lp\13\jl\res
  Executing compile -o C:\Temp\AndroidResourcesSubdirectory\MobileAppXamarinForms1\MobileAppXamarinForms1.Android\obj\Debug\90\lp\17\jl\res\..\flat\17.flata --dir C:\Temp\AndroidResourcesSubdirectory\MobileAppXamarinForms1\MobileAppXamarinForms1.Android\obj\Debug\90\lp\17\jl\res
  Executing compile -o C:\Temp\AndroidResourcesSubdirectory\MobileAppXamarinForms1\MobileAppXamarinForms1.Android\obj\Debug\90\lp\34\jl\res\..\flat\34.flata --dir C:\Temp\AndroidResourcesSubdirectory\MobileAppXamarinForms1\MobileAppXamarinForms1.Android\obj\Debug\90\lp\34\jl\res
  Executing compile -o C:\Temp\AndroidResourcesSubdirectory\MobileAppXamarinForms1\MobileAppXamarinForms1.Android\obj\Debug\90\lp\38\jl\res\..\flat\ C:\Temp\AndroidResourcesSubdirectory\MobileAppXamarinForms1\MobileAppXamarinForms1.Android\obj\Debug\90\lp\38\jl\res\xml\xamarin_essentials_fileprovider_file_paths.xml
  Executing compile -o C:\Temp\AndroidResourcesSubdirectory\MobileAppXamarinForms1\MobileAppXamarinForms1.Android\obj\Debug\90\lp\39\jl\res\..\flat\ C:\Temp\AndroidResourcesSubdirectory\MobileAppXamarinForms1\MobileAppXamarinForms1.Android\obj\Debug\90\lp\39\jl\res\anim\enterfromleft.xml
  Executing compile -o C:\Temp\AndroidResourcesSubdirectory\MobileAppXamarinForms1\MobileAppXamarinForms1.Android\obj\Debug\90\lp\39\jl\res\..\flat\ C:\Temp\AndroidResourcesSubdirectory\MobileAppXamarinForms1\MobileAppXamarinForms1.Android\obj\Debug\90\lp\39\jl\res\anim\exittoleft.xml
  Executing compile -o C:\Temp\AndroidResourcesSubdirectory\MobileAppXamarinForms1\MobileAppXamarinForms1.Android\obj\Debug\90\lp\39\jl\res\..\flat\ C:\Temp\AndroidResourcesSubdirectory\MobileAppXamarinForms1\MobileAppXamarinForms1.Android\obj\Debug\90\lp\39\jl\res\anim\exittoright.xml
  Executing compile -o C:\Temp\AndroidResourcesSubdirectory\MobileAppXamarinForms1\MobileAppXamarinForms1.Android\obj\Debug\90\lp\39\jl\res\..\flat\ C:\Temp\AndroidResourcesSubdirectory\MobileAppXamarinForms1\MobileAppXamarinForms1.Android\obj\Debug\90\lp\39\jl\res\layout\bottomtablayout.xml
  Executing compile -o C:\Temp\AndroidResourcesSubdirectory\MobileAppXamarinForms1\MobileAppXamarinForms1.Android\obj\Debug\90\lp\39\jl\res\..\flat\ C:\Temp\AndroidResourcesSubdirectory\MobileAppXamarinForms1\MobileAppXamarinForms1.Android\obj\Debug\90\lp\39\jl\res\layout\flyoutcontent.xml
  Executing compile -o C:\Temp\AndroidResourcesSubdirectory\MobileAppXamarinForms1\MobileAppXamarinForms1.Android\obj\Debug\90\lp\39\jl\res\..\flat\ C:\Temp\AndroidResourcesSubdirectory\MobileAppXamarinForms1\MobileAppXamarinForms1.Android\obj\Debug\90\lp\39\jl\res\layout\rootlayout.xml
  Executing compile -o C:\Temp\AndroidResourcesSubdirectory\MobileAppXamarinForms1\MobileAppXamarinForms1.Android\obj\Debug\90\lp\39\jl\res\..\flat\ C:\Temp\AndroidResourcesSubdirectory\MobileAppXamarinForms1\MobileAppXamarinForms1.Android\obj\Debug\90\lp\39\jl\res\layout\shellcontent.xml
  Executing compile -o C:\Temp\AndroidResourcesSubdirectory\MobileAppXamarinForms1\MobileAppXamarinForms1.Android\obj\Debug\90\lp\39\jl\res\..\flat\ C:\Temp\AndroidResourcesSubdirectory\MobileAppXamarinForms1\MobileAppXamarinForms1.Android\obj\Debug\90\lp\39\jl\res\values\styles.xml
  Executing compile -o C:\Temp\AndroidResourcesSubdirectory\MobileAppXamarinForms1\MobileAppXamarinForms1.Android\obj\Debug\90\lp\30\jl\res\..\flat\30.flata --dir C:\Temp\AndroidResourcesSubdirectory\MobileAppXamarinForms1\MobileAppXamarinForms1.Android\obj\Debug\90\lp\30\jl\res
  Executing compile -o C:\Temp\AndroidResourcesSubdirectory\MobileAppXamarinForms1\MobileAppXamarinForms1.Android\obj\Debug\90\flat\ C:\Temp\AndroidResourcesSubdirectory\MobileAppXamarinForms1\MobileAppXamarinForms1.Android\obj\Debug\90\res\layout\toolbar.xml
  Executing compile -o C:\Temp\AndroidResourcesSubdirectory\MobileAppXamarinForms1\MobileAppXamarinForms1.Android\obj\Debug\90\flat\ C:\Temp\AndroidResourcesSubdirectory\MobileAppXamarinForms1\MobileAppXamarinForms1.Android\obj\Debug\90\res\layout\tabbar.xml
  Executing compile -o C:\Temp\AndroidResourcesSubdirectory\MobileAppXamarinForms1\MobileAppXamarinForms1.Android\obj\Debug\90\flat\ C:\Temp\AndroidResourcesSubdirectory\MobileAppXamarinForms1\MobileAppXamarinForms1.Android\obj\Debug\90\res\values\colors.xml
  Executing compile -o C:\Temp\AndroidResourcesSubdirectory\MobileAppXamarinForms1\MobileAppXamarinForms1.Android\obj\Debug\90\flat\ C:\Temp\AndroidResourcesSubdirectory\MobileAppXamarinForms1\MobileAppXamarinForms1.Android\obj\Debug\90\res\mipmap-anydpi-v26\icon.xml
  Executing compile -o C:\Temp\AndroidResourcesSubdirectory\MobileAppXamarinForms1\MobileAppXamarinForms1.Android\obj\Debug\90\flat\ C:\Temp\AndroidResourcesSubdirectory\MobileAppXamarinForms1\MobileAppXamarinForms1.Android\obj\Debug\90\res\mipmap-anydpi-v26\icon_round.xml
  Executing compile -o C:\Temp\AndroidResourcesSubdirectory\MobileAppXamarinForms1\MobileAppXamarinForms1.Android\obj\Debug\90\flat\ C:\Temp\AndroidResourcesSubdirectory\MobileAppXamarinForms1\MobileAppXamarinForms1.Android\obj\Debug\90\res\mipmap-hdpi\icon.png
  Executing compile -o C:\Temp\AndroidResourcesSubdirectory\MobileAppXamarinForms1\MobileAppXamarinForms1.Android\obj\Debug\90\flat\ C:\Temp\AndroidResourcesSubdirectory\MobileAppXamarinForms1\MobileAppXamarinForms1.Android\obj\Debug\90\res\mipmap-hdpi\launcher_foreground.png
  Executing compile -o C:\Temp\AndroidResourcesSubdirectory\MobileAppXamarinForms1\MobileAppXamarinForms1.Android\obj\Debug\90\flat\ C:\Temp\AndroidResourcesSubdirectory\MobileAppXamarinForms1\MobileAppXamarinForms1.Android\obj\Debug\90\res\values\styles.xml
  Executing compile -o C:\Temp\AndroidResourcesSubdirectory\MobileAppXamarinForms1\MobileAppXamarinForms1.Android\obj\Debug\90\flat\ C:\Temp\AndroidResourcesSubdirectory\MobileAppXamarinForms1\MobileAppXamarinForms1.Android\obj\Debug\90\res\mipmap-mdpi\launcher_foreground.png
  Executing compile -o C:\Temp\AndroidResourcesSubdirectory\MobileAppXamarinForms1\MobileAppXamarinForms1.Android\obj\Debug\90\flat\ C:\Temp\AndroidResourcesSubdirectory\MobileAppXamarinForms1\MobileAppXamarinForms1.Android\obj\Debug\90\res\mipmap-xhdpi\icon.png
  Executing compile -o C:\Temp\AndroidResourcesSubdirectory\MobileAppXamarinForms1\MobileAppXamarinForms1.Android\obj\Debug\90\flat\ C:\Temp\AndroidResourcesSubdirectory\MobileAppXamarinForms1\MobileAppXamarinForms1.Android\obj\Debug\90\res\mipmap-xhdpi\launcher_foreground.png
  Executing compile -o C:\Temp\AndroidResourcesSubdirectory\MobileAppXamarinForms1\MobileAppXamarinForms1.Android\obj\Debug\90\flat\ C:\Temp\AndroidResourcesSubdirectory\MobileAppXamarinForms1\MobileAppXamarinForms1.Android\obj\Debug\90\res\mipmap-xxhdpi\icon.png
  Executing compile -o C:\Temp\AndroidResourcesSubdirectory\MobileAppXamarinForms1\MobileAppXamarinForms1.Android\obj\Debug\90\flat\ C:\Temp\AndroidResourcesSubdirectory\MobileAppXamarinForms1\MobileAppXamarinForms1.Android\obj\Debug\90\res\mipmap-mdpi\icon.png
  Executing compile -o C:\Temp\AndroidResourcesSubdirectory\MobileAppXamarinForms1\MobileAppXamarinForms1.Android\obj\Debug\90\flat\ C:\Temp\AndroidResourcesSubdirectory\MobileAppXamarinForms1\MobileAppXamarinForms1.Android\obj\Debug\90\res\mipmap-xxhdpi\launcher_foreground.png
  Executing compile -o C:\Temp\AndroidResourcesSubdirectory\MobileAppXamarinForms1\MobileAppXamarinForms1.Android\obj\Debug\90\lp\19\jl\res\..\flat\19.flata --dir C:\Temp\AndroidResourcesSubdirectory\MobileAppXamarinForms1\MobileAppXamarinForms1.Android\obj\Debug\90\lp\19\jl\res
  Executing compile -o C:\Temp\AndroidResourcesSubdirectory\MobileAppXamarinForms1\MobileAppXamarinForms1.Android\obj\Debug\90\lp\39\jl\res\..\flat\ C:\Temp\AndroidResourcesSubdirectory\MobileAppXamarinForms1\MobileAppXamarinForms1.Android\obj\Debug\90\lp\39\jl\res\anim\enterfromright.xml
  Executing compile -o C:\Temp\AndroidResourcesSubdirectory\MobileAppXamarinForms1\MobileAppXamarinForms1.Android\obj\Debug\90\flat\ C:\Temp\AndroidResourcesSubdirectory\MobileAppXamarinForms1\MobileAppXamarinForms1.Android\obj\Debug\90\res\mipmap-xxxhdpi\icon.png
  Executing compile -o C:\Temp\AndroidResourcesSubdirectory\MobileAppXamarinForms1\MobileAppXamarinForms1.Android\obj\Debug\90\flat\ C:\Temp\AndroidResourcesSubdirectory\MobileAppXamarinForms1\MobileAppXamarinForms1.Android\obj\Debug\90\res\mipmap-xxxhdpi\launcher_foreground.png
  Executing compile -o C:\Temp\AndroidResourcesSubdirectory\MobileAppXamarinForms1\MobileAppXamarinForms1.Android\obj\Debug\90\flat\ C:\Temp\AndroidResourcesSubdirectory\MobileAppXamarinForms1\MobileAppXamarinForms1.Android\obj\Debug\90\res\drawable\xamarin_logo.png
C:\Program Files: error APT2144: invalid file path 'C:\Temp\AndroidResourcesSubdirectory\MobileAppXamarinForms1\MobileAppXamarinForms1.Android\obj\Debug\90\res\drawable\subdirectory\xamarin_logo.png'. [C:\Temp\AndroidResourcesSubdirectory\MobileAppXamarinForms1\MobileAppXamarinForms1.Android\MobileAppXamarinForms1.Android.csproj]
Done executing task "Aapt2Compile" -- FAILED.

Since it seems that files in unrecognized Resources\drawable subdirectories were previously silently ignored by AAPT2, this new behavior could arguably be considered more useful to help users avoid unexpected behaviors, so it might be OK to close this issue as a desirable change.

VS bug #1180521

brendanzagaeski commented 4 years ago

Workaround

Move any Android resources mentioned in the error APT2144: invalid file path errors out of the unrecognized subdirectories and into the single level of canonical directories that are supported:

(In most cases, this is probably in fact the recommended way to fix the issue and not just a workaround.)

Enovale commented 1 year ago

I'm having this issue but it is because I'm trying to make a shared library with EmbeddedResources target android so as to avoid this bug from happening: xamarin/xamarin-macios#16401

Because it is an existing shared library that was initially structured without android in mind I'd rather not rename the top level resource folders. That being said, I have tried renaming the Resources folder entirely and changing all the references but somehow I still get this error. Weirder still the error doesn't come from the Shared Library but rather the Xamarin project that references it. I don't know whats going on.

EDIT: To be clear, I do not want any of my shared library's resources to interact with android at all. If there is a way I can exclude them entirely that would be great.

dellis1972 commented 1 year ago

You can try adding the following to your project

<EnableDefaultAndroidItems>False</EnableDefaultAndroidItems>

This will disable ALL the defailt android Items including .jar file inclusions etc. I am assuming you are targeting .net7.0 btw. If that does not work, try this.

<ItemGroup>
<AndroidResource Remove="$(MonoAndroidResourcePrefix)/*/*.*" />
</ItemGroup>