forked from dotnet/android
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit 908668f
committed
Bump to xamarin/xamarin-android-tools/main@76c076fc
Context: dotnet/maui#11605
Context: 8bc7a3e
Changes: http://github.com/xamarin/xamarin-android-tools/compare/9f02d77692bca8c6585941de03750d5eaaca5c5a...47f95ab99f6201d956eecfa1c7b2fd5fa7e43946
* dotnet/android-tools@47f95ab: Fix CS0121 ambiguity errors. (dotnet/android-tools#200)
* dotnet/android-tools@76c076f: Add support for Project Specific RegisterTaskObject. (dotnet/android-tools#199)
In dotnet/maui#11605, when `$(AndroidEnableMarshalMethods)`=True
(8bc7a3e), the build may fail if the `.sln` contains more than one
Android "App" project. We tracked this down to "undesired sharing"
between project builds; the `obj` provided to
[`IBuildEngine4.RegisterTaskObject()`][0] can be visible across
project builds. Consider [`<GeneratePackageManagerJava/>`][1]:
var marshalMethodsState = BuildEngine4.GetRegisteredTaskObjectAssemblyLocal<MarshalMethodsState> (".:!MarshalMethods!:.", RegisteredTaskObjectLifetime.Build);
Further consider a `.sln` with two "App" projects, as the "App"
project build hits `<GeneratePackageManagerJava/>`.
The lifetime of `.Build` is *not* tied to the the `Build` target of a
given `.csproj`; rather, it's for the *build process*. This can
result in:
1. `dotnet build Project.sln` is run; `Project.sln` references
`App1.csproj` and `App2.csproj`.
2. `App1.csproj` is built.
3. `App1.csproj` calls `<GeneratePackageManagerJava/>`.
4. `App2.csproj` is later built as part in the process, and *also*
calls `<GeneratePackageManagerJava/>`.
In particular note the key within `<GeneratePackageManagerJava/>`:
`".:!MarshalMethods!:."`. This value is unchanged, and means that
that when `App2.csproj` is built, it will be using the same key as
was used with `App1.csproj`, and thus could be inadvertently using
data intended for `App1.csproj`!
This could result build errors:
…\Xamarin.Android.Common.targets(1717,3): error XAGPM7009: System.InvalidOperationException: Unable to translate assembly name 'Xamarin.AndroidX.Activity' to its index
…\Xamarin.Android.Common.targets(1717,3): error XAGPM7009: at Xamarin.Android.Tasks.MarshalMethodsNativeAssemblyGenerator.WriteNativeMethods(LlvmIrGenerator generator, Dictionary`2 asmNameToIndex, LlvmIrVariableReference get_function_pointer_ref)
…\Xamarin.Android.Common.targets(1717,3): error XAGPM7009: at Xamarin.Android.Tasks.MarshalMethodsNativeAssemblyGenerator.Write(LlvmIrGenerator generator)
…\Xamarin.Android.Common.targets(1717,3): error XAGPM7009: at Xamarin.Android.Tasks.LLVMIR.LlvmIrComposer.Write(AndroidTargetArch arch, StreamWriter output, String fileName)
…\Xamarin.Android.Common.targets(1717,3): error XAGPM7009: at Xamarin.Android.Tasks.GeneratePackageManagerJava.AddEnvironment()
…\Xamarin.Android.Common.targets(1717,3): error XAGPM7009: at Xamarin.Android.Tasks.GeneratePackageManagerJava.RunTask()
The sharing of `RegisterTaskObject()` data across project builds is
rarely desirable. There are a few instances where it is safe to share
the registered objects between projects, e.g. `java` version
information (keyed on `java` path). However, most of the time it is
specific to the project that is being built. Historically we have
probably got away with this because "most" users only have one project.
dotnet/android-tools@76c076f updated the `MSBuildExtensions`
extension methods so that [`IBuildEngine.ProjectFileOfTaskNode`][2]
would be part of the `RegisterTaskObject()` key.
Review use of the `.RegisterTaskObjectAssemblyLocal()`,
`.GetRegisteredTaskObjectAssemblyLocal()`, and
`.UnregisterTaskObjectAssemblyLocal()` extension methods to ensure
that `IBuildEngine.ProjectFileOfTaskNode` is used or excluded,
as appropriate. This should fix the XAGPM7009 build errors.
TODO: add unit test to trigger this build scenario.
[0]: https://learn.microsoft.com/en-us/dotnet/api/microsoft.build.framework.ibuildengine4.registertaskobject?view=msbuild-17-netcore
[1]: https://github.com/xamarin/xamarin-android/blob/c92ae5eb9fdcb3a2fd7c20f5b42dddf8b3ea781a/src/Xamarin.Android.Build.Tasks/Tasks/GeneratePackageManagerJava.cs#L407
[2]: https://learn.microsoft.com/en-us/dotnet/api/microsoft.build.framework.ibuildengine.projectfileoftasknode?view=msbuild-17-netcore1 parent 8c24b8f commit 908668fCopy full SHA for 908668f
1 file changed
+1
-1
lines changedexternal/xamarin-android-tools
Copy file name to clipboardSubmodule xamarin-android-tools updated from 9f02d77 to 47f95ab
0 commit comments