Skip to content
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

Conflicting libraries when using generated and packed Xamarin.Android Bindings. #5627

Closed
tugcearar opened this issue Feb 15, 2021 · 11 comments · Fixed by #5691
Closed

Conflicting libraries when using generated and packed Xamarin.Android Bindings. #5627

tugcearar opened this issue Feb 15, 2021 · 11 comments · Fixed by #5691
Assignees
Labels
Area: App+Library Build Issues when building Library projects or Application projects. Area: Bindings Issues in Java Library Binding projects. bug Component does not function as intended.

Comments

@tugcearar
Copy link

tugcearar commented Feb 15, 2021

Steps to Reproduce

  1. Create a binding library of two different .aar library that each of them contains libs/r-classes.jar files in it.
  2. Create nuget packages.
  3. Adding nuget packages into Xamarin.Android demo project.
  4. Build.

Expected Behavior

Build succssfully.

Actual Behavior

Below error occurred and break the build.

"JAR library references with identical file names but different contents were found: r-classes.jar. Please remove any conflicting libraries from EmbeddedJar, InputJar and AndroidJavaLibrary."

Version Information

Microsoft Visual Studio Community 2019
Version 16.8.4
VisualStudio.16.Release/16.8.4+30907.101
Microsoft .NET Framework
Version 4.7.03190

Installed Version: Community

Visual C++ 2019 00435-60000-00000-AA613
Microsoft Visual C++ 2019

ASP.NET and Web Tools 2019 16.8.557.25636
ASP.NET and Web Tools 2019

ASP.NET Core Razor Language Services 16.1.0.2052803+84e121f1403378489b842e1797df2f3f5a49ac3c
Provides languages services for ASP.NET Core Razor.

ASP.NET Web Frameworks and Tools 2012 16.8.557.25636
For additional information, visit https://www.asp.net/

ASP.NET Web Frameworks and Tools 2019 16.8.557.25636
For additional information, visit https://www.asp.net/

Azure App Service Tools v3.0.0 16.8.557.25636
Azure App Service Tools v3.0.0

Azure Functions and Web Jobs Tools 16.8.557.25636
Azure Functions and Web Jobs Tools

C# Tools 3.8.0-5.20604.10+9ed4b774d20940880de8df1ca8b07508aa01c8cd
C# components used in the IDE. Depending on your project type and settings, a different version of the compiler may be used.

Cake for Visual Studio 0.1.2.0
Adds support for the Cake build tool in Visual Studio 2017 and 2019. Includes support for the Task Runner Explorer, new templates and bootstrapping important Cake files.

Common Azure Tools 1.10
Provides common services for use by Azure Mobile Services and Microsoft Azure Tools.

Extensibility Message Bus 1.2.6 (master@34d6af2)
Provides common messaging-based MEF services for loosely coupled Visual Studio extension components communication and integration.

GitHub.VisualStudio 2.11.102.28613
A Visual Studio Extension that brings the GitHub Flow into Visual Studio.

IntelliCode Extension 1.0
IntelliCode Visual Studio Extension Detailed Info

Microsoft Azure Tools 2.9
Microsoft Azure Tools for Microsoft Visual Studio 2019 - v2.9.30924.1

Microsoft Continuous Delivery Tools for Visual Studio 0.4
Simplifying the configuration of Azure DevOps pipelines from within the Visual Studio IDE.

Microsoft JVM Debugger 1.0
Provides support for connecting the Visual Studio debugger to JDWP compatible Java Virtual Machines

Microsoft Library Manager 2.1.113+g422d40002e.RR
Install client-side libraries easily to any web project

Microsoft MI-Based Debugger 1.0
Provides support for connecting Visual Studio to MI compatible debuggers

Microsoft Visual C++ Wizards 1.0
Microsoft Visual C++ Wizards

Microsoft Visual Studio Tools for Containers 1.1
Develop, run, validate your ASP.NET Core applications in the target environment. F5 your application directly into a container with debugging, or CTRL + F5 to edit & refresh your app without having to rebuild the container.

Microsoft Visual Studio VC Package 1.0
Microsoft Visual Studio VC Package

Mono Debugging for Visual Studio 16.8.43 (00471f8)
Support for debugging Mono processes with Visual Studio.

NuGet Package Manager 5.8.1
NuGet Package Manager in Visual Studio. For more information about NuGet, visit https://docs.nuget.org/

ProjectServicesPackage Extension 1.0
ProjectServicesPackage Visual Studio Extension Detailed Info

SQL Server Data Tools 16.0.62012.31170
Microsoft SQL Server Data Tools

Syntax Visualizer 1.0
An extension for visualizing Roslyn SyntaxTrees.

TypeScript Tools 16.0.21016.2001
TypeScript Tools for Microsoft Visual Studio

Visual Basic Tools 3.8.0-5.20604.10+9ed4b774d20940880de8df1ca8b07508aa01c8cd
Visual Basic components used in the IDE. Depending on your project type and settings, a different version of the compiler may be used.

Visual F# Tools 16.8.0-beta.20507.4+da6be68280c89131cdba2045525b80890401defd
Microsoft Visual F# Tools

Visual Studio Code Debug Adapter Host Package 1.0
Interop layer for hosting Visual Studio Code debug adapters in Visual Studio

Visual Studio Container Tools Extensions 1.0
View, manage, and diagnose containers within Visual Studio.

Visual Studio Tools for Containers 1.0
Visual Studio Tools for Containers

VisualStudio.DeviceLog 1.0
Information about my package

VisualStudio.Foo 1.0
Information about my package

VisualStudio.Mac 1.0
Mac Extension for Visual Studio

Xamarin 16.8.000.261 (d16-8@bb99248)
Visual Studio extension to enable development for Xamarin.iOS and Xamarin.Android.

Xamarin Designer 16.8.0.507 (remotes/origin/d16-8@e87b24884)
Visual Studio extension to enable Xamarin Designer tools in Visual Studio.

Xamarin Templates 16.8.112 (86385a3)
Templates for building iOS, Android, and Windows apps with Xamarin and Xamarin.Forms.

Xamarin.Android SDK 11.1.0.26 (d16-8/a36ce73)
Xamarin.Android Reference Assemblies and MSBuild support.
Mono: 5e9cb6d
Java.Interop: xamarin/java.interop/d16-8@79d9533
ProGuard: Guardsquare/proguard@ebe9000
SQLite: xamarin/sqlite@1a3276b
Xamarin.Android Tools: xamarin/xamarin-android-tools/d16-8@2fb1cbc

Xamarin.iOS and Xamarin.Mac SDK 14.8.0.3 (c51fabee8)
Xamarin.iOS and Xamarin.Mac Reference Assemblies and MSBuild support.

Log File

Not working because build phase is failed.

@grendello grendello added Area: App+Library Build Issues when building Library projects or Application projects. Area: Bindings Issues in Java Library Binding projects. labels Feb 16, 2021
@grendello grendello added this to the Under Consideration milestone Feb 16, 2021
@grendello
Copy link
Contributor

@stugcearar Please provide a verbose build log for the broken build. You can generate a binlog by building the project from the command line using the following command:

msbuild /bl

This will generate the msbuild.binlog file, please attach it here, thanks!

@jonathanpeppers
Copy link
Member

jonathanpeppers commented Feb 16, 2021

I think the problem is step 1:

  1. Create a binding library of two different .aar library that each of them contains libs/r-classes.jar files in it.

Is r-classes.jar a special name for a reason? Can they be named classes.jar as .aar files normally contain?

It seems only classes.jar is currently allowed:

https://github.com/xamarin/xamarin-android/blob/de5c8f89d18fcc8b39dd8e6ec1ccf51724dbadd0/src/Xamarin.Android.Build.Tasks/Tasks/CheckDuplicateJavaLibraries.cs#L29

We could also try removing this check completely, it seems like it was added because of:

The thing is, before this change things like ViewPagerIndicator in
monodroid-samples would be broken and users don't know why. It is because
android-support-v4.jar is now embedded in Mono.Android.Support.v4.dll and
its content is inconsistent with the jar which is explicitly added as
AndroidJavaLibrary for old style reference. Since their content are
different, they are regarded as different jars and thus conflict occurs.

https://github.com/xamarin/monodroid/commit/f53f25ecb3f8deaca84674beb592cb608953ec90

I don't think this is an issue anymore, Mono.Android.Support.v4.dll is long gone, because the Xamarin.Android.Support.* libraries are distributed from NuGet.

@tugcearar
Copy link
Author

tugcearar commented Feb 16, 2021

Yes, the problem occured in here:

<Target Name="_CheckDuplicateJavaLibraries" DependsOnTargets="_GetLibraryImports">
  <CheckDuplicateJavaLibraries
    JavaSourceFiles="@(AndroidJavaSource)"
    JavaLibraries="@(AndroidJavaLibrary)"
    LibraryProjectJars="@(ExtractedJarImports)" />
</Target>

But r-classes.jar is located in native android libraries. I did not add them. I can manage the build the application with the binding libraries but I changed the jar names manually. Shouldn't this be handled automatically by Xamarin.Android and not by the user?

@jonathanpeppers
Copy link
Member

@stugcearar do you know why they are named r-classes.jar? Is this something Android Studio did by default?

@tugcearar
Copy link
Author

I think the developers of the native library add resources like static strings in r-classes.jar. But they gave the same name this kind of classes in different .aar files. So when I used them together as nugets, the conflict happens on application project.

@jonathanpeppers
Copy link
Member

@stugcearar can you attach the .aar files here? Or perhaps just the r-classes.jar?

@tugcearar
Copy link
Author

@jonathanpeppers I created a sample .aar and binding library for the error and attached the zip file.
sample.zip

jonathanpeppers added a commit to jonathanpeppers/xamarin-android that referenced this issue Mar 1, 2021
Fixes: dotnet#5627

WIP as I am getting this error from d8:

    Unsupported class file major version 59
@jonathanpeppers
Copy link
Member

@stugcearar how did you create the .aar files in your example, was it the project template in Android Studio?

I have a fix for the original error you were getting, but it seems incomplete: 55c29ed

I get Unsupported class file major version 59, which I think is because the r-classes.jar files are Java 14.

@jonathanpeppers
Copy link
Member

Wait, or is this somehow Java 15?

https://stackoverflow.com/questions/9170832/list-of-java-class-file-format-major-version-numbers

I don't see how Java 15 would work on Android, how did you create the .aar files?

@tugcearar
Copy link
Author

Yes I used Android Studio template for .aar files but I think maybe cause of the error is .jar files. I created them with jar and r-classes.jar with javac commands with CLI. I can create them again if you like?

@jonathanpeppers
Copy link
Member

Ok that makes sense, thanks.

I’ll make new ones for this test, no worries.

jonathanpeppers added a commit to jonathanpeppers/xamarin-android that referenced this issue Mar 4, 2021
Fixes: dotnet#5627

In some cases, Android Studio projects can produce `.aar` files that
contain:

    libs/r-classes.jar

Reviewing the contents of one of these `r-classes.jar` files:

    com/test/R.class

It appears they are potentially moving any `R.java` files into this
new `r-classes.jar` file.

So if you have two `.aar` files that contain a `r-classes.jar` in a
Xamarin.Android application, you would currently run into the error:

    JAR library references with identical file names but different contents were found: r-classes.jar.
    Please remove any conflicting libraries from EmbeddedJar, InputJar and AndroidJavaLibrary.

We should make the `<CheckDuplicateJavaLibraries/>` MSBuild task
ignore this issue for `r-classes.jar`. I can't find any good links to
explain this new file, or why it exists.

I added a test for this scenario.
jonpryor pushed a commit that referenced this issue Mar 5, 2021
Fixes: #5627

In some cases, Android Studio projects can produce `.aar` files that
contain:

	libs/r-classes.jar

Reviewing the contents of one of these `r-classes.jar` files:

	$ jar tf libs/r-classes.jar
	com/test/R.class

It appears Android Studio is potentially moving any `R.java` files
into this new `r-classes.jar` file.

If you have two `.aar` files that contain a `r-classes.jar` in a
Xamarin.Android application, you would currently run into the error:

	JAR library references with identical file names but different contents were found: r-classes.jar.
	Please remove any conflicting libraries from EmbeddedJar, InputJar and AndroidJavaLibrary.

Make the `<CheckDuplicateJavaLibraries/>` MSBuild task
ignore this issue for `r-classes.jar`, as it does for `classes.jar`.

I can't find any good links to explain this new file, or why it exists.

I added a test for this scenario.
@jonpryor jonpryor added the bug Component does not function as intended. label Apr 13, 2021
@ghost ghost locked as resolved and limited conversation to collaborators Jun 3, 2022
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
Area: App+Library Build Issues when building Library projects or Application projects. Area: Bindings Issues in Java Library Binding projects. bug Component does not function as intended.
Projects
None yet
5 participants