diff --git a/src/Xamarin.Android.Build.Tasks/Tasks/GenerateJavaStubs.cs b/src/Xamarin.Android.Build.Tasks/Tasks/GenerateJavaStubs.cs index 4053a0f9b1e..d82c2f10b00 100644 --- a/src/Xamarin.Android.Build.Tasks/Tasks/GenerateJavaStubs.cs +++ b/src/Xamarin.Android.Build.Tasks/Tasks/GenerateJavaStubs.cs @@ -217,7 +217,6 @@ void Run (DirectoryAssemblyResolver res, bool useMarshalMethods) if ((!useMarshalMethods && !userAssemblies.ContainsKey (td.Module.Assembly.Name.Name)) || JavaTypeScanner.ShouldSkipJavaCallableWrapperGeneration (td, cache)) { continue; } - javaTypes.Add (td); } @@ -283,16 +282,20 @@ void Run (DirectoryAssemblyResolver res, bool useMarshalMethods) TypeDefinition conflict; bool hasConflict = false; if (managed.TryGetValue (managedKey, out conflict)) { - if (!managedConflicts.TryGetValue (managedKey, out var list)) - managedConflicts.Add (managedKey, list = new List { conflict.GetPartialAssemblyName (cache) }); - list.Add (type.GetPartialAssemblyName (cache)); + if (!conflict.Module.Name.Equals (type.Module.Name)) { + if (!managedConflicts.TryGetValue (managedKey, out var list)) + managedConflicts.Add (managedKey, list = new List { conflict.GetPartialAssemblyName (cache) }); + list.Add (type.GetPartialAssemblyName (cache)); + } hasConflict = true; } if (java.TryGetValue (javaKey, out conflict)) { - if (!javaConflicts.TryGetValue (javaKey, out var list)) - javaConflicts.Add (javaKey, list = new List { conflict.GetAssemblyQualifiedName (cache) }); - list.Add (type.GetAssemblyQualifiedName (cache)); - success = false; + if (!conflict.Module.Name.Equals (type.Module.Name)) { + if (!javaConflicts.TryGetValue (javaKey, out var list)) + javaConflicts.Add (javaKey, list = new List { conflict.GetAssemblyQualifiedName (cache) }); + list.Add (type.GetAssemblyQualifiedName (cache)); + success = false; + } hasConflict = true; } if (!hasConflict) { diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Tasks/LinkerTests.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Tasks/LinkerTests.cs index 530a3de0f07..0a630a47619 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Tasks/LinkerTests.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Tasks/LinkerTests.cs @@ -509,5 +509,39 @@ public void AndroidUseNegotiateAuthentication ([Values (true, false, null)] bool } } } + + [Test] + public void DoNotErrorOnPerArchJavaTypeDuplicates () + { + if (!Builder.UseDotNet) + Assert.Ignore ("Test only valid on .NET"); + + var path = Path.Combine (Root, "temp", TestName); + var lib = new XamarinAndroidLibraryProject { IsRelease = true, ProjectName = "Lib1" }; + lib.SetProperty ("IsTrimmable", "true"); + lib.Sources.Add (new BuildItem.Source ("Library1.cs") { + TextContent = () => @" +namespace Lib1; +public class Library1 : Java.Lang.Object { + private static bool Is64Bits = IntPtr.Size >= 8; + + public static bool Is64 () { + return Is64Bits; + } +}", + }); + var proj = new XamarinAndroidApplicationProject { IsRelease = true, ProjectName = "App1" }; + proj.References.Add(new BuildItem.ProjectReference (Path.Combine ("..", "Lib1", "Lib1.csproj"), "Lib1")); + proj.MainActivity = proj.DefaultMainActivity.Replace ( + "base.OnCreate (bundle);", + "base.OnCreate (bundle);\n" + + "if (Lib1.Library1.Is64 ()) Console.WriteLine (\"Hello World!\");"); + + + using var lb = CreateDllBuilder (Path.Combine (path, "Lib1")); + using var b = CreateApkBuilder (Path.Combine (path, "App1")); + Assert.IsTrue (lb.Build (lib), "build should have succeeded."); + Assert.IsTrue (b.Build (proj), "build should have succeeded."); + } } }