From 761b401ddb76666352c3a36c3f5ab372b8ff0e15 Mon Sep 17 00:00:00 2001 From: Jonathan Peppers Date: Tue, 23 Jan 2024 09:17:11 -0600 Subject: [PATCH] [Xamarin.Android.build.Tasks] `` ignores `repackaged.jar` Context: https://maven.google.com/androidx/emoji2/emoji2/1.4.0/emoji2-1.4.0.aar Context: https://maven.google.com/androidx/health/connect/connect-client/1.1.0-alpha07/connect-client-1.1.0-alpha07.aar When using the two AARs linked above, you get the build error: Xamarin.Android.Common.targets(845,3): error XA1014: JAR library references with identical file names but different contents were found: repackaged.jar. Please remove any conflicting libraries from EmbeddedJar, InputJar and AndroidJavaLibrary. They both contain `libs/repackaged.jar`, which I'm not able to find any information about. I can reproduce this problem in an MSBuild test. Unfortunately, the only way to workaround the error message is to: * Unzip the `.aar` * Rename `libs/repackaged.jar` to `libs/repackaged-emoji2-1.4.0.jar`, for example * Re-zip the `.aar` a9ca3d46 had a similar problem with `r-classes.jar`. Let's expand upon this change by introducing a private item group: <_AndroidExcludedDuplicateJavaLibraries Include="classes.jar" /> <_AndroidExcludedDuplicateJavaLibraries Include="r-classes.jar" /> <_AndroidExcludedDuplicateJavaLibraries Include="repackaged.jar" /> So if this occurs in the future, we can add future files to this list without rebuilding the Android workload. --- .../Tasks/CheckDuplicateJavaLibraries.cs | 6 +---- .../BindingBuildTest.cs | 24 +++++++++++++++---- .../Xamarin.Android.Common.targets | 9 ++++++- 3 files changed, 28 insertions(+), 11 deletions(-) diff --git a/src/Xamarin.Android.Build.Tasks/Tasks/CheckDuplicateJavaLibraries.cs b/src/Xamarin.Android.Build.Tasks/Tasks/CheckDuplicateJavaLibraries.cs index 2f7f199111c..5739e3cf40d 100644 --- a/src/Xamarin.Android.Build.Tasks/Tasks/CheckDuplicateJavaLibraries.cs +++ b/src/Xamarin.Android.Build.Tasks/Tasks/CheckDuplicateJavaLibraries.cs @@ -9,16 +9,12 @@ namespace Xamarin.Android.Tasks { public class CheckDuplicateJavaLibraries : AndroidTask { - readonly static string [] ExcludedFiles = new [] { - "classes.jar", - "r-classes.jar", - }; - public override string TaskPrefix => "CDJ"; public ITaskItem [] JavaSourceFiles { get; set; } public ITaskItem[] JavaLibraries { get; set; } public ITaskItem[] LibraryProjectJars { get; set; } + public string [] ExcludedFiles { get; set; } public override bool RunTask () { diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/BindingBuildTest.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/BindingBuildTest.cs index 66a14fe783b..d4e24312561 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/BindingBuildTest.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/BindingBuildTest.cs @@ -722,31 +722,45 @@ public void LibraryProjectZipWithLint () } /// - /// Tests two .aar files with r-classes.jar + /// Tests two .aar files with r-classes.jar, repackaged.jar /// [Test] - public void AarWithRClassesJar () + public void CheckDuplicateJavaLibraries () { var path = Path.Combine ("temp", TestName); var lib1 = new XamarinAndroidBindingProject { ProjectName = "Library1", AndroidClassParser = "class-parse", Jars = { + // r-classes.jar new AndroidItem.LibraryProjectZip ("Library1.aar") { BinaryContent = () => ResourceData.Library1Aar - } + }, + // repackaged.jar + new AndroidItem.AndroidLibrary ("emoji2-1.4.0.aar") { + MetadataValues = "Bind=false", + WebContent = "https://maven.google.com/androidx/emoji2/emoji2/1.4.0/emoji2-1.4.0.aar", + }, }, }; var lib2 = new XamarinAndroidBindingProject { ProjectName = "Library2", AndroidClassParser = "class-parse", Jars = { + // r-classes.jar new AndroidItem.LibraryProjectZip ("Library2.aar") { BinaryContent = () => ResourceData.Library2Aar - } + }, + // repackaged.jar + new AndroidItem.AndroidLibrary ("connect-client-1.1.0-alpha07.aar") { + MetadataValues = "Bind=false", + WebContent = "https://maven.google.com/androidx/health/connect/connect-client/1.1.0-alpha07/connect-client-1.1.0-alpha07.aar", + }, }, }; - var app = new XamarinAndroidApplicationProject (); + var app = new XamarinAndroidApplicationProject { + SupportedOSPlatformVersion = "30", // androidx.health requires minSdkVersion="30" + }; app.AddReference (lib1); app.AddReference (lib2); using (var lib1Builder = CreateDllBuilder (Path.Combine (path, lib1.ProjectName))) diff --git a/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.targets b/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.targets index d8919b2e499..df067734e59 100644 --- a/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.targets +++ b/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.targets @@ -842,10 +842,17 @@ because xbuild doesn't support framework reference assemblies. + + <_AndroidExcludedDuplicateJavaLibraries Include="classes.jar" /> + <_AndroidExcludedDuplicateJavaLibraries Include="r-classes.jar" /> + <_AndroidExcludedDuplicateJavaLibraries Include="repackaged.jar" /> + + LibraryProjectJars="@(ExtractedJarImports)" + ExcludedFiles="@(_AndroidExcludedDuplicateJavaLibraries)" + />