-
Notifications
You must be signed in to change notification settings - Fork 538
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[Xamarin.Android.Build.Tasks] missing resource error handling (#8066)
Context: mono/SkiaSharp#2444 Context: mono/SkiaSharp#2465 Context: fcd7cf8 Context: dc3ccf2 Context: 3ec1b15 In Classic Xamarin.Android, `@(AndroidResource)` files were embedded into assemblies as `@(EmbeddedResource)` entries. While convenient, this slowed down build times (as every assembly needed to be checked to see if it had embedded resources), and this functionality was removed for .NET 6 in fcd7cf8. The replacement was to use `.aar` files, typically located in the same directory as the assembly. Unfortunately, it was easy to incorrectly migrate from the old system to the new system, which was the case for the [SkiaSharp.Views (v2.88.3) NuGet Package][0], which *uses* an [`@attr/ignorePixelScaling`][1] resource, but did not package it. In .NET 6 and 7, this was "fine" *so long as* that resource value was never used. If it *was* used, then the results were undefined: a "garbage" resource id value would be used, which would either be invalid or refer to a *different* resource altogether! .NET 8 introduces the Resource Designer Assembly (dc3ccf2), which involves *rewriting non-.NET 8 assemblies* to use the Resource Designer Assembly, which in turn requires that all resources exist. Which brings us to mono/SkiaSharp#2444: because the `SkiaSharp.Views` NuGet package references but did not redistribute the `@attr/ignorePixelScaling` resource, the assembly rewriter would *skip over* the missing resource name, resulting in an invalid assembly. This in turn would result in a *runtime crash*: System.BadImageFormatException: 'Invalid field token 0x040000a1' We decided that instead of ignoring missing resource fields, we should error out. Update `FixLegacyResourceDesignerStep` to report an error if we cannot find the required Resource Designer Assembly property which matches a "legacy" field. In Debug builds, this will result in an XA8000 error: error XA8000: Could not find Android Resource '@attr/ignorePixelScaling'. Please update @(AndroidResource) to add the missing resource. For Release builds, this instead results in an IL8000 error: error IL8000: Could not find Android Resource '@attr/ignorePixelScaling'. Please update @(AndroidResource) to add the missing resource. Note that this only moves a runtime error to a compile-time error. The fix for mono/SkiaSharp#2444 is mono/SkiaSharp#2465, which adds `SkiaSharp.Views.Android.aar` to the `SkiaSharp.Views` NuGet package. This should be fixed in the (forthcoming) SkaSharp.Views 2.88.4. [A *workaround* for mono/SkiaSharp#2444][3] is to define the `@attr/ignorePixelScaling` resource within your app project. Additionally, we found another problem while investigating mono/SkiaSharp#2444 around resource name case sensitivity. Not all Android Resource names need to be lowercase; generally only those that are based on *filenames* need to be lowercase, e.g. `@layout/main`. Resources which are defined within XML containers, such as [string resources][2], may contain uppercase letters. While looking at the output for the test app, it turns out the final assembly does NOT include the expected `anim` based resources. Looking at the IL we found that the properties were NOT being fixed up to use the correct casing, e.g. we have `enterfromright` instead of `EnterFromRight`. Further investigation tracked the issue down to the `RTxtParser`; This class uses the `case_map.txt` file for lookup. The `case_map.txt` file contains entries such as: animation/enterfromleft;animation/EnterFromLeft animation/enterfromright;animation/EnterFromRight these allow us to map the "android" lower cased items to the C# cased items. The problem was we were not mapping `anim` to `animation`. There is a method called `ResourceParser.GetNestedTypeName()` which is used to map the android resource type to the managed resource type. For example it maps `anim` to `Animation` and `bool` to `Boolean`. This was not being called when we tried to map the resource. As a result we never found the correct cased entry. This would result in the final Resource Designer Assembly containing the lower cased "android" naming of the property and not the correctly cased one which the C#/IL would be using; the fields were never fixed up. The fix is to make sure we call `ResourceParser.GetNestedTypeName()` when calculating the final property name in the `RTxtParser`. [0]: https://www.nuget.org/packages/SkiaSharp/2.88.3 [1]: https://github.com/mono/SkiaSharp/blob/99c2437b1055dc6eb8ee25e90e5ad4afa695aa89/source/SkiaSharp.Views/SkiaSharp.Views.Android/Resources/values/attrs.xml#L4 [2]: https://developer.android.com/guide/topics/resources/string-resource [3]: mono/SkiaSharp#2444 (comment)
- Loading branch information
1 parent
e97ad2f
commit 3481881
Showing
15 changed files
with
288 additions
and
73 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
--- | ||
title: Xamarin.Android warning XA8000/IL8000 | ||
description: XA8000/IL8000 error code | ||
ms.date: 06/01/2023 | ||
--- | ||
# Xamarin.Android error XA8000/IL8000 | ||
|
||
## Issue | ||
|
||
``` | ||
Could not find Android Resource '@anim/enterfromright'. Please update @(AndroidResource) to add the missing resource. | ||
``` | ||
|
||
## Solution | ||
|
||
When trying to upgrade older nuget package references to use the | ||
more recent Resource Designer Assembly, the system might encounter | ||
fields which cannot be upgraded because the resource is missing | ||
from either the dependency or the app. | ||
|
||
To fix this issue the missing `AndroidResource` needs to be added to the application. Or the Nuget should be upgraded to use .net 8 or later. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,4 +1,3 @@ | ||
#!/bin/bash | ||
./build-tools/scripts/nunit3-console bin/TestRelease/net472/Xamarin.Android.Build.Tests.dll --test=Xamarin.Android.Build.Tests.BuildTest2.BuildReleaseArm64 | ||
./dotnet-local.sh test bin/TestRelease/net7.0/Xamarin.Android.Build.Tests.dll --filter=Name~BuildReleaseArm64 | ||
cp bin/TestRelease/BuildReleaseArm64*.apkdesc src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Resources/Base/ |
25 changes: 17 additions & 8 deletions
25
src/Microsoft.Android.Sdk.ILLink/Properties/Resources.Designer.cs
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
9 changes: 9 additions & 0 deletions
9
src/Xamarin.Android.Build.Tasks/Properties/Resources.Designer.cs
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.