Skip to content

Commit a9ca3d4

Browse files
[Xamarin.Android.Build.Tasks] allow multiple r-classes.jar files (#5691)
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.
1 parent 18723b8 commit a9ca3d4

File tree

6 files changed

+50
-10
lines changed

6 files changed

+50
-10
lines changed

src/Xamarin.Android.Build.Tasks/Tasks/CheckDuplicateJavaLibraries.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,11 @@ namespace Xamarin.Android.Tasks
99
{
1010
public class CheckDuplicateJavaLibraries : AndroidTask
1111
{
12+
readonly static string [] ExcludedFiles = new [] {
13+
"classes.jar",
14+
"r-classes.jar",
15+
};
16+
1217
public override string TaskPrefix => "CDJ";
1318

1419
public ITaskItem [] JavaSourceFiles { get; set; }
@@ -26,7 +31,7 @@ public override bool RunTask ()
2631

2732
// Remove duplicate identical jars by name, size and content, and reject any jars that conflicts by name (i.e. different content).
2833
var jars = MonoAndroidHelper.DistinctFilesByContent (jarFilePaths).ToArray ();
29-
var dups = MonoAndroidHelper.GetDuplicateFileNames (jars, new string [] {"classes.jar"});
34+
var dups = MonoAndroidHelper.GetDuplicateFileNames (jars, ExcludedFiles);
3035
if (dups.Any ()) {
3136
Log.LogCodedError ("XA1014", Properties.Resources.XA1014, String.Join (", ", dups.ToArray ()));
3237
return false;

src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/BindingBuildTest.cs

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -650,5 +650,42 @@ public void LibraryProjectZipWithLint ()
650650
"`lint.jar` should not be extracted!");
651651
}
652652
}
653+
654+
/// <summary>
655+
/// Tests two .aar files with r-classes.jar
656+
/// </summary>
657+
[Test]
658+
public void AarWithRClassesJar ()
659+
{
660+
var path = Path.Combine ("temp", TestName);
661+
var lib1 = new XamarinAndroidBindingProject {
662+
ProjectName = "Library1",
663+
AndroidClassParser = "class-parse",
664+
Jars = {
665+
new AndroidItem.LibraryProjectZip ("Library1.aar") {
666+
BinaryContent = () => ResourceData.Library1Aar
667+
}
668+
},
669+
};
670+
var lib2 = new XamarinAndroidBindingProject {
671+
ProjectName = "Library2",
672+
AndroidClassParser = "class-parse",
673+
Jars = {
674+
new AndroidItem.LibraryProjectZip ("Library2.aar") {
675+
BinaryContent = () => ResourceData.Library2Aar
676+
}
677+
},
678+
};
679+
var app = new XamarinAndroidApplicationProject ();
680+
app.AddReference (lib1);
681+
app.AddReference (lib2);
682+
using (var lib1Builder = CreateDllBuilder (Path.Combine (path, lib1.ProjectName)))
683+
using (var lib2Builder = CreateDllBuilder (Path.Combine (path, lib2.ProjectName)))
684+
using (var appBuilder = CreateApkBuilder (Path.Combine (path, app.ProjectName))) {
685+
Assert.IsTrue (lib1Builder.Build (lib1), "Library1 build should have succeeded.");
686+
Assert.IsTrue (lib2Builder.Build (lib2), "Library2 build should have succeeded.");
687+
Assert.IsTrue (appBuilder.Build (app), "App build should have succeeded.");
688+
}
689+
}
653690
}
654691
}

src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Utilities/ResourceData.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,18 @@ static class ResourceData
1212
static Lazy<byte[]> javaSourceJarTestJar = new Lazy<byte[]>(() => GetResourceData ("javasourcejartest.jar"));
1313
static Lazy<byte[]> javaSourceJarTestSourcesJar = new Lazy<byte[]>(() => GetResourceData ("javasourcejartest-sources.jar"));
1414
static Lazy<byte[]> javaSourceJarTestJavadocJar = new Lazy<byte[]>(() => GetResourceData ("javasourcejartest-javadoc.jar"));
15+
static Lazy<byte []> library1Aar = new Lazy<byte []> (() => GetResourceData ("library1.aar"));
16+
static Lazy<byte []> library2Aar = new Lazy<byte []> (() => GetResourceData ("library2.aar"));
1517

1618
public static byte[] JavaSourceJarTestJar => javaSourceJarTestJar.Value;
1719
public static byte[] JavaSourceJarTestSourcesJar => javaSourceJarTestSourcesJar.Value;
1820
public static byte[] JavaSourceJarTestJavadocJar => javaSourceJarTestJavadocJar.Value;
21+
public static byte [] Library1Aar => library1Aar.Value;
22+
public static byte [] Library2Aar => library2Aar.Value;
1923

2024
static byte[] GetResourceData (string name)
2125
{
22-
using var s = typeof (InlineData).Assembly.GetManifestResourceStream (name);
26+
using var s = typeof (ResourceData).Assembly.GetManifestResourceStream (name);
2327
using var m = new MemoryStream (checked ((int) s.Length));
2428
s.CopyTo (m);
2529
return m.ToArray ();

src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Xamarin.Android.Build.Tests.csproj

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -43,14 +43,8 @@
4343
</ItemGroup>
4444

4545
<ItemGroup>
46-
<EmbeddedResource Include="Resources\javasourcejartest.jar">
47-
<LogicalName>javasourcejartest.jar</LogicalName>
48-
</EmbeddedResource>
49-
<EmbeddedResource Include="Resources\javasourcejartest-sources.jar">
50-
<LogicalName>javasourcejartest-sources.jar</LogicalName>
51-
</EmbeddedResource>
52-
<EmbeddedResource Include="Resources\javasourcejartest-javadoc.jar">
53-
<LogicalName>javasourcejartest-javadoc.jar</LogicalName>
46+
<EmbeddedResource Include="Resources\*">
47+
<LogicalName>%(FileName)%(Extension)</LogicalName>
5448
</EmbeddedResource>
5549
</ItemGroup>
5650

0 commit comments

Comments
 (0)