-
Notifications
You must be signed in to change notification settings - Fork 561
[Xamarin.Android.Build.Tasks] error for Android.Support #8629
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
b8192ff to
74ba84d
Compare
|
If we have a place where we document .NET 9 breaking changes, we should add this one to it. |
74ba84d to
d374370
Compare
| <ItemGroup Condition=" '$(_InstantRunEnabled)' == 'True' and '@(_AndroidTypeMapping->Count())' == '0' "> | ||
| <_AndroidTypeMapping Include="$(_NativeAssemblySourceDir)typemaps\*" /> | ||
| </ItemGroup> |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
See d374370 for what's going on here.
Context: #8478 Some hardcoded paths/properties in Xamarin.AndroidX.Migration cause tests failures in #8478 such as: (_AndroidXCecilfy target) -> /Users/runner/.nuget/packages/xamarin.androidx.migration/1.0.8/buildTransitive/monoandroid90/Xamarin.AndroidX.Migration.targets(227,9): error : Source assembly does not exist: 'obj/Debug/android/assets/UnnamedProject.dll'. Where `$(MonoAndroidIntermediateAssetsDir)` does not account for a new architecture in the path: <ItemGroup> <_AndroidXFileToCecilfy Include="@(ResolvedUserAssemblies->'$(MonoAndroidIntermediateAssetsDir)%(Filename)%(Extension)')" Condition="('%(ResolvedUserAssemblies.TargetFrameworkIdentifier)' == 'MonoAndroid' or '%(ResolvedUserAssemblies.HasMonoAndroidReference)' == 'true') and ('%(ResolvedUserAssemblies.AndroidXSkipAndroidXMigration)' != 'true')" /> </ItemGroup> We don't really *support* the old Android.Support libraries or AndroidX.Migration, but we don't have any build warnings or errors in place for this. Introduce a `XA1039` error in .NET 9 if any packages are found matching: * `Xamarin.Android.Support.*` * `Xamarin.Android.Arch.*` The biggest impact here is going to be many of our old tests, which use the support libraries in various forms. Improvements & general cleanup: * Removed all old/unused packages in `KnownPackages.cs` * Updated `KnownPackages.cs` to latest versions, including Xamarin.Forms * Android Wear tests are now migrated from support to AndroidX: https://android-developers.googleblog.com/2016/04/build-beautifully-for-android-wear.html * `CheckEmbeddedSupportLibraryResources` -> moved to AndroidX * `BuildHasNoWarnings` was not appropriately applying `IsRelease`. * `Android.Support.v8.RenderScript` removed in favor of inline `.so` file. * A few tests that used support libraries to create a project large numbers of dependencies, moved to `XamarinFormsAndroidApplicationProject`. * `ResolveLibraryProjectImports` -> sorted comparisions * `XamarinFormsAndroidApplicationProject` has a workaround for Guava: dotnet/android-libraries#535 Removed tests: * `AndroidXMigration`, `AndroidXMigrationBug` * `ResolveLibraryImportsWithReadonlyFiles`, seemed duplicate of other Android Wear tests, and used support libraries. * `ExtraAaptManifest` as it depends on `Xamarin.Android.Fabric` and `Xamarin.Android.Crashlytics`. These are deprecated and depend on support libraries. * `BuildProguardEnabledProjectSource` now only tests `Release` mode. Since updating to AndroidX, `Debug` mode was triggering multi-dex. Making it difficult to assert contents of `*.dex` files. In a future PR, we will backport these changes, but downgrade the error to a warning: --<AndroidError Code="XA1039" ++<AndroidWarning Code="XA1039" ResourceName="XA1039" FormatArguments="9" Condition=" '@(_AndroidUnsupportedPackages->Count())' != '0' " />
…ssemblies::Dexes`
The app at runtime in the `ApplicationRunsWithDebuggerAndBreaks` test
was crashing at runtime with:
01-16 13:11:42.395 4273 4273 E monodroid-assembly: typemap: failed to stat TypeMap index file '/data/user/0/com.xamarin.applicationrunswithdebuggerandbreaks/files/.__override__/typemaps/typemap.index': No such file or directory
01-16 13:11:42.395 4273 4273 F monodroid-assembly: typemap: unable to load TypeMap data index from '/data/user/0/com.xamarin.applicationrunswithdebuggerandbreaks/files/.__override__/typemaps/typemap.index'
This only happens when `AndroidFastDeploymentType=Assemblies::Dexes` is
used, as it is the case when typemap files like this are fast deployed
and used at runtime.
What was even more odd, was the file seems to exist after a
`-t:Install`, but ends up missing after `-t:Run`:
> adb shell run-as com.xamarin.applicationrunswithdebuggerandbreaks ls -la files/.__override__/typemaps/typemap.index
ls: files/.__override__/typemaps/typemap.index: No such file or directory
It appears that `-t:Install` successfully deploys the file:
Pushed 3969 to /data/local/tmp/.xatools/typemap.index
DEBUG RunShellCommand emulator-5554 "run-as" "com.xamarin.applicationrunswithdebuggerandbreaks" "--user" "0" "files/.__tools__/xamarin.cp" "/data/local/tmp/.xatools/typemap.index" "files/.__override__/typemaps/typemap.index" "1705432079367" [5ms]
files/.__tools__/xamarin.cp returned: moved [/data/local/tmp/.xatools/typemap.index] to [files/.__override__/typemaps/typemap.index] modifieddate [1705432079367]
moved /data/local/tmp/.xatools/typemap.index to files/.__override__/typemaps/typemap.index
Installed files/.__override__/typemaps/typemap.index. [12ms]
NotifySync CopyFile obj\Debug\android\typemaps\typemap.index. [0ms]
But then `-t:Run` deletes the file!
Remove redundant file files/.__override__/typemaps/typemap.index
DEBUG RunShellCommand 0A041FDD400327 "run-as" "com.xamarin.applicationrunswithdebuggerandbreaks" "rm" "-Rf" "files/.__override__/typemaps/typemap.index" [29ms]
This happens because the `@(_AndroidTypeMapping)` item group is empty
during an incremental build:
* The `<GenerateJavaStubs/>` MSBuild task, during the first build
outputs `@(_AndroidTypeMapping)` items
* During an incremental build, the `_GenerateJavaStubs` MSBuild *target*
is skipped, and so the `@(_AndroidTypeMapping)` item group is empty!
* The `<FastDeploy/>` task happily deletes files that it thinks should
be removed.
For now, let's add logic to the `_GenerateJavaStubs` target to fill in
the `@(_AndroidTypeMapping)` item group during incremental builds:
<ItemGroup Condition=" '$(_InstantRunEnabled)' == 'True' and '@(_AndroidTypeMapping->Count())' == '0' ">
<_AndroidTypeMapping Include="$(_NativeAssemblySourceDir)typemaps\*" />
</ItemGroup>
`<ItemGroup>`s are still evaluated when a target is *skipped*, solving
the problem.
I assume this is working in `main`, because Xamarin.AndroidX.Migration
package was involved. It likely was running the `_GenerateJavaStubs`
target on every build. Will verify.
d374370 to
a286263
Compare
|
|
||
| [Test] | ||
| [Category ("XamarinBuildDownload")] | ||
| public void ExtraAaptManifest () |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why is this test removed? It doesn't appear to (directly?) use the Support libraries; presumably it's because it starts with Xamarin.Android. Is there not a newer Crashytics? It looks like there's a Xamarin.Firebase.Crashlytics package which exists…
This test is also weird, in that it's the only test that uses Crashlytics.HandleManagedExceptions()…
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I was able to put it back, using:
Xamarin.Firebase.CrashlyticsNuGetFirebase.Crashlytics.FirebaseCrashlytics.Instance.SendUnsentReports()- Look for
firebaseinitproviderin theAndroidManifest.xml
|
Draft comit message: [Xamarin.Android.Build.Tasks] XA1039 error for Android.Support (#8629)
Context: c92702619f5fabcff0ed88e09160baf9edd70f41
Context: 68368189d67c46ddbfed4e90e622f635c4aff11e
Context: 929e7012410233e6814af369db582f238ba185ad
Context: https://github.com/xamarin/xamarin-android/pull/8478
Context: https://github.com/xamarin/xamarin-android/issues/8155
Context: https://github.com/xamarin/xamarin-android/issues/8168
Our build process has a bit of a "consistent sanity" problem: large
portions of the build process assume that the output of a `.csproj`
is a single assembly, and that single assembly is (eventually)
embedded into the `.apk`, to be loaded at runtime.
Unfortunately, that wasn't strictly true starting with .NET 5:
there were *multiple* `System.Private.CoreLib.dll` assemblies, which
needed to be treated specially; see also c9270261.
We discovered that this assumption was even *less* true because of
the linker, which would quite happily *replace* `IntPtr.get_Size()`
method invocations with a *constant*, specific for the target ABI;
see also 68368189, 929e7012. This in turn could be responsible for
all sorts of weirdness if e.g. a 64-bit assembly were used in a
32-bit process, or vice versa.
Which brings us to the original assumption: there is (usually) only
one "source" assembly, which is (optionally) linked into one "linked"
assembly, which is packaged into one assembly in the `.apk`.
With the linker, though, we can have one "source" assembly, which
when linked becomes *N* assemblies, which *should be* separately
packaged as per-ABI assemblies within the `.apk`, but
*probably aren't*, which we *think* is the "root cause" of #8155.
PR #8478 is attempting fix this assumption, imbuing the build system
with knowledge that the linker may produce *multiple outputs* for a
single input assembly.
Unfortunately, in trying to fix things, various intermediate assembly
locations have *changed*, which in turn breaks
[AndroidX Migration in Xamarin.Forms][0], as it makes assumptions
about where various assemblies are located within `obj`:
(_AndroidXCecilfy target) ->
/Users/runner/.nuget/packages/xamarin.androidx.migration/1.0.8/buildTransitive/monoandroid90/Xamarin.AndroidX.Migration.targets(227,9): error : Source assembly does not exist: 'obj/Debug/android/assets/UnnamedProject.dll'.
as [`@(_AndroidXFileToCecilfy)`][1] uses
`$(MonoAndroidIntermediateAssetsDir)`, which does not account for the
ABI which is now in the path:
<ItemGroup>
<_AndroidXFileToCecilfy Include="@(ResolvedUserAssemblies->'$(MonoAndroidIntermediateAssetsDir)%(Filename)%(Extension)')"
Condition="('%(ResolvedUserAssemblies.TargetFrameworkIdentifier)' == 'MonoAndroid' or '%(ResolvedUserAssemblies.HasMonoAndroidReference)' == 'true') and ('%(ResolvedUserAssemblies.AndroidXSkipAndroidXMigration)' != 'true')" />
</ItemGroup>
Given that AndroidX Migration is mostly for Xamarin.Forms customers
(and *kinda* buggy, and unmaintained), and MAUI doesn't support the
Android Support libraries, and thus doesn't need AndroidX Migration,
we'd like to just *not worry about this*.
The problem? The above error message is not actionable, and doesn't
tell anybody how to fix it.
Introduce a new `XA1039` *actionable* error in .NET 9:
error XA1039: The Android Support libraries are not supported in .NET 9 and later,
please migrate to AndroidX. See https://aka.ms/xamarin/androidx for more details.
The XA1039 error is generated if any NuGet packages are found matching:
* `Xamarin.Android.Support.*`
* `Xamarin.Android.Arch.*`
TODO: "port" XA1039 to .NET 8 *as a warning*, so that customers will
have some time to migrate off of the Android Support libraries before
.NET 9 is released in 2024-Nov.
--<AndroidError Code="XA1039"
++<AndroidWarning Code="XA1039"
ResourceName="XA1039"
Condition=" '@(_AndroidUnsupportedPackages->Count())' != '0' "
/>
The biggest impact here is going to be many of our old tests, which
use the support libraries in various forms.
Improvements & general cleanup:
* Removed all old/unused packages in `KnownPackages.cs`
* Updated `KnownPackages.cs` to latest versions, including Xamarin.Forms
* [Android Wear tests are now migrated from support to AndroidX][2]
* `AndroidUpdateResourcesTest.CheckEmbeddedSupportLibraryResources()`
is renamed to `.CheckEmbeddedAndroidXResources()`.
* `BuildTest2.BuildHasNoWarnings()` was not appropriately applying
`IsRelease`.
* `Android.Support.v8.RenderScript` removed in favor of an inline
`.so` file.
* A few tests that used support libraries to create a project large
numbers of dependencies, moved to
`XamarinFormsAndroidApplicationProject`.
* `IncrementalBuildTest.ResolveLibraryProjectImports()` now sorts
items before comparing them.
* `XamarinFormsAndroidApplicationProject` has a workaround for Guava:
<https://github.com/xamarin/AndroidX/issues/535>
* Fix a bug in `AndroidFastDeploymentType=Assemblies::Dexes`;
see "AndroidFastDeploymentType=Assemblies::Dexes" section, below.
Removed tests:
* `AndroidXMigration`, `AndroidXMigrationBug`
* `ResolveLibraryImportsWithReadonlyFiles`, seemed duplicate of other
Android Wear tests, and used support libraries.
* `ExtraAaptManifest` as it depends on `Xamarin.Android.Fabric` and
`Xamarin.Android.Crashlytics`. These are deprecated and depend on
support libraries.
* `BuildProguardEnabledProjectSource` now only tests `Release` mode.
Since updating to AndroidX, `Debug` mode was triggering multi-dex.
Making it difficult to assert contents of `*.dex` files.
~~ AndroidFastDeploymentType=Assemblies::Dexes ~~
The runtime test in `ApplicationRunsWithDebuggerAndBreaks()` was
crashing at runtime with:
E monodroid-assembly: typemap: failed to stat TypeMap index file '/data/user/0/com.xamarin.applicationrunswithdebuggerandbreaks/files/.__override__/typemaps/typemap.index': No such file or directory
F monodroid-assembly: typemap: unable to load TypeMap data index from '/data/user/0/com.xamarin.applicationrunswithdebuggerandbreaks/files/.__override__/typemaps/typemap.index'
This only happens when `AndroidFastDeploymentType=Assemblies::Dexes` is
used, as it is the case when typemap files like this are fast deployed
and used at runtime.
What was even more odd, was the file seems to exist after a
`-t:Install`, but ends up missing after `-t:Run`:
> adb shell run-as com.xamarin.applicationrunswithdebuggerandbreaks ls -la files/.__override__/typemaps/typemap.index
ls: files/.__override__/typemaps/typemap.index: No such file or directory
It appears that `-t:Install` successfully deploys the file:
Pushed 3969 to /data/local/tmp/.xatools/typemap.index
DEBUG RunShellCommand emulator-5554 "run-as" "com.xamarin.applicationrunswithdebuggerandbreaks" "--user" "0" "files/.__tools__/xamarin.cp" "/data/local/tmp/.xatools/typemap.index" "files/.__override__/typemaps/typemap.index" "1705432079367" [5ms]
files/.__tools__/xamarin.cp returned: moved [/data/local/tmp/.xatools/typemap.index] to [files/.__override__/typemaps/typemap.index] modifieddate [1705432079367]
moved /data/local/tmp/.xatools/typemap.index to files/.__override__/typemaps/typemap.index
Installed files/.__override__/typemaps/typemap.index. [12ms]
NotifySync CopyFile obj\Debug\android\typemaps\typemap.index. [0ms]
But then `-t:Run` deletes the file!
Remove redundant file files/.__override__/typemaps/typemap.index
DEBUG RunShellCommand 0A041FDD400327 "run-as" "com.xamarin.applicationrunswithdebuggerandbreaks" "rm" "-Rf" "files/.__override__/typemaps/typemap.index" [29ms]
This happens because the `@(_AndroidTypeMapping)` item group is empty
during an incremental build:
* The `<GenerateJavaStubs/>` MSBuild task, during the first build
outputs `@(_AndroidTypeMapping)` items
* During an incremental build, the `_GenerateJavaStubs` MSBuild
*target* is skipped, and so the `@(_AndroidTypeMapping)` item
group is empty!
* The `<FastDeploy/>` task happily deletes files that it thinks
should be removed.
For now, let's add logic to the `_GenerateJavaStubs` target to fill
in the `@(_AndroidTypeMapping)` item group during incremental builds:
<ItemGroup Condition=" '$(_InstantRunEnabled)' == 'True' and '@(_AndroidTypeMapping->Count())' == '0' ">
<_AndroidTypeMapping Include="$(_NativeAssemblySourceDir)typemaps\*" />
</ItemGroup>
`<ItemGroup>`s are still evaluated when a target is *skipped*,
solving the problem.
I assume this is working in `main`, because Xamarin.AndroidX.Migration
package was involved. It likely was running the `_GenerateJavaStubs`
target on every build.
[0]: https://learn.microsoft.com/xamarin/xamarin-forms/platform/android/androidx-migration
[1]: https://github.com/xamarin/AndroidX/blob/17e596fafe20331d7feb69240c38e0fbdc3ea640/source/migration/BuildTasks/Xamarin.AndroidX.Migration.targets#L205-L206
[2]: https://android-developers.googleblog.com/2016/04/build-beautifully-for-android-wear.html |
I added information here: https://github.com/xamarin/xamarin-android/wiki/Planned-Future-Deprecations-and-Removals I'm working on the backport PR for .NET 8 next, where it will be a warning that you can opt out of. When that change ships, we can decide if we need to do more if we get lots of customer feedback. |
* main: [Xamarin.Android.Build.Tasks] XA1039 error for Android.Support (#8629)
* main: Localized file check-in by OneLocBuild Task (#8668) [Xamarin.Android.build.Tasks] `<CheckDuplicateJavaLibraries/>` ignores `repackaged.jar` (#8664) LEGO: Merge pull request 8665 [Xamarin.Android.Build.Tasks] parse JDK `release` file directly (#8663) Bump to dotnet/installer@f91d4ca399 9.0.100-alpha.1.24070.3 (#8635) [.github] Re-enable locking issues after 30 days of inactivity (#8655) Localized file check-in by OneLocBuild Task (#8657) LEGO: Merge pull request 8656 Localized file check-in by OneLocBuild Task (#8652) Bump to xamarin/xamarin-android-tools/main@b175674 (#8644) [Xamarin.Android.Build.Tasks] remove checks for `$(UsingAndroidNETSdk)` (#8647) [Xamarin.Android.Build.Tasks] XA1039 error for Android.Support (#8629)
Context: #8478
Some hardcoded paths/properties in Xamarin.AndroidX.Migration cause tests failures in #8478 such as:
Where
$(MonoAndroidIntermediateAssetsDir)does not account for a new architecture in the path:We don't really support the old Android.Support libraries or AndroidX.Migration, but we don't have any build warnings or errors in place for this.
Introduce a
XA1039error in .NET 9 if any packages are found matching:Xamarin.Android.Support.*Xamarin.Android.Arch.*The biggest impact here is going to be many of our old tests, which use the support libraries in various forms.
Improvements & general cleanup:
Removed all old/unused packages in
KnownPackages.csUpdated
KnownPackages.csto latest versions, including Xamarin.FormsAndroid Wear tests are now migrated from support to AndroidX:
https://android-developers.googleblog.com/2016/04/build-beautifully-for-android-wear.html
CheckEmbeddedSupportLibraryResources-> moved to AndroidXBuildHasNoWarningswas not appropriately applyingIsRelease.Android.Support.v8.RenderScriptremoved in favor of inline.sofile.A few tests that used support libraries to create a project large numbers of dependencies, moved to
XamarinFormsAndroidApplicationProject.ResolveLibraryProjectImports-> sorted comparisionsXamarinFormsAndroidApplicationProjecthas a workaround for Guava:dotnet/android-libraries#535
Removed tests:
AndroidXMigration,AndroidXMigrationBugResolveLibraryImportsWithReadonlyFiles, seemed duplicate of other Android Wear tests, and used support libraries.ExtraAaptManifestas it depends onXamarin.Android.FabricandXamarin.Android.Crashlytics. These are deprecated and depend on support libraries.BuildProguardEnabledProjectSourcenow only testsReleasemode. Since updating to AndroidX,Debugmode was triggering multi-dex. Making it difficult to assert contents of*.dexfiles.In a future PR, we will backport these changes to .NET 8, but downgrade the error to a warning: