Skip to content

Commit f1cee97

Browse files
[Xamarin.Android.Build.Tasks] _AddMultiDexDependencyJars only runs for apps
Context: dotnet/android-libraries#247 When porting AndroidX to .NET 6, I noticed something odd... I was getting `.aar` files in the build output that appeared to contain the contents of `android-support-multidex.jar`. Then I noticed: https://github.com/xamarin/AndroidX/blob/16b02ae51980f7bab7be395d44f9998eea9bf32f/source/AndroidXProject.cshtml#L18 The AndroidX binding projects are setting `$(AndroidEnableMultiDex)`? This is surely not intentional to be set in a class library, but this causes `_AddMultiDexDependencyJars` to run: <Target Name="_AddMultiDexDependencyJars"> <!-- ... --> <ItemGroup Condition=" '$(AndroidEnableMultiDex)' == 'True' AND '$(AndroidMultiDexSupportJar)' == '' "> <AndroidJavaLibrary Include="$(MonoAndroidToolsDirectory)\android-support-multidex.jar" /> </ItemGroup> </Target> If this was added to `@(AndroidJavaLibrary)`, then the `<CreateAar/>` MSBuild task would happily package it in a .NET 6 class library! I think the solution here is that the `_AddMultiDexDependencyJars` MSBuild target shouldn't actually run unless `$(AndroidApplication)` is `true`. I added updated an existing test for this scenario.
1 parent dc1f7ba commit f1cee97

File tree

2 files changed

+23
-1
lines changed

2 files changed

+23
-1
lines changed

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

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,9 +175,30 @@ public void ClassLibraryHasNoWarnings ()
175175
//NOTE: these properties should not affect class libraries at all
176176
proj.SetProperty ("AndroidPackageFormat", "aab");
177177
proj.SetProperty ("AotAssemblies", "true");
178+
proj.SetProperty ("AndroidEnableMultiDex", "true");
178179
using (var b = CreateDllBuilder ()) {
179180
Assert.IsTrue (b.Build (proj), "Build should have succeeded.");
180181
Assert.IsTrue (StringAssertEx.ContainsText (b.LastBuildOutput, " 0 Warning(s)"), "Should have no MSBuild warnings.");
182+
183+
// $(AndroidEnableMultiDex) should not add android-support-multidex.jar!
184+
if (Builder.UseDotNet) {
185+
var aarPath = Path.Combine (Root, b.ProjectDirectory, proj.OutputPath, $"{proj.ProjectName}.aar");
186+
using var zip = Xamarin.Tools.Zip.ZipArchive.Open (aarPath, FileMode.Open);
187+
Assert.IsFalse (zip.Any (e => e.FullName.EndsWith (".jar", StringComparison.OrdinalIgnoreCase)),
188+
$"{aarPath} should not contain a .jar file!");
189+
} else {
190+
var assemblyPath = Path.Combine (Root, b.ProjectDirectory, proj.OutputPath, $"{proj.ProjectName}.dll");
191+
using var assembly = AssemblyDefinition.ReadAssembly (assemblyPath);
192+
const string libraryProjects = "__AndroidLibraryProjects__.zip";
193+
var resource = assembly.MainModule.Resources.OfType<EmbeddedResource> ()
194+
.FirstOrDefault (e => e.Name == libraryProjects);
195+
Assert.IsNotNull (resource, $"{assemblyPath} should contain {libraryProjects}");
196+
197+
using var stream = resource.GetResourceStream ();
198+
using var zip = Xamarin.Tools.Zip.ZipArchive.Open (stream);
199+
Assert.IsFalse (zip.Any (e => e.FullName.EndsWith (".jar", StringComparison.OrdinalIgnoreCase)),
200+
$"{resource.Name} should not contain a .jar file!");
201+
}
181202
}
182203
}
183204

src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.targets

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1021,7 +1021,8 @@ because xbuild doesn't support framework reference assemblies.
10211021
</ItemGroup>
10221022
</Target>
10231023

1024-
<Target Name="_AddMultiDexDependencyJars">
1024+
<Target Name="_AddMultiDexDependencyJars"
1025+
Condition=" '$(AndroidApplication)' == 'true' ">
10251026
<ItemGroup Condition=" '$(AndroidEnableMultiDex)' == 'True' AND '$(AndroidMultiDexSupportJar)' != '' ">
10261027
<AndroidJavaLibrary Include="$(_AndroidSdkDirectory)\$(AndroidMultiDexSupportJar)" />
10271028
</ItemGroup>

0 commit comments

Comments
 (0)