diff --git a/src/Xamarin.Android.Build.Tasks/Tasks/R8.cs b/src/Xamarin.Android.Build.Tasks/Tasks/R8.cs
index fbf66e7bf48..b11d504734f 100644
--- a/src/Xamarin.Android.Build.Tasks/Tasks/R8.cs
+++ b/src/Xamarin.Android.Build.Tasks/Tasks/R8.cs
@@ -34,6 +34,7 @@ public class R8 : D8
public string? ProguardGeneratedApplicationConfiguration { get; set; }
public string? ProguardCommonXamarinConfiguration { get; set; }
public string? ProguardMappingFileOutput { get; set; }
+ public string? BuildMetadataFileOutput { get; set; }
public string []? ProguardConfigurationFiles { get; set; }
protected override string MainClass => "com.android.tools.r8.R8";
@@ -63,6 +64,11 @@ protected override string CreateResponseFile ()
// Now append R8-specific arguments to the response file
using var response = new StreamWriter (responseFile, append: true, encoding: Files.UTF8withoutBOM);
+ if (!BuildMetadataFileOutput.IsNullOrEmpty ()) {
+ WriteArg (response, "--build-metadata-output");
+ WriteArg (response, Path.GetFullPath (BuildMetadataFileOutput));
+ }
+
if (EnableMultiDex) {
if (MinSdkVersion >= 21) {
if (CustomMainDexListFiles?.Length > 0) {
diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/PackagingTest.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/PackagingTest.cs
index d987bad2987..617ef224248 100644
--- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/PackagingTest.cs
+++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/PackagingTest.cs
@@ -17,7 +17,7 @@ namespace Xamarin.Android.Build.Tests
public class PackagingTest : BaseTest
{
[Test]
- public void CheckProguardMappingFileExists ()
+ public void CheckR8MetadataFilesExist ()
{
var proj = new XamarinAndroidApplicationProject {
IsRelease = true,
@@ -25,11 +25,23 @@ public void CheckProguardMappingFileExists ()
proj.SetProperty (proj.ReleaseProperties, KnownProperties.AndroidLinkTool, "r8");
// Projects must set $(AndroidCreateProguardMappingFile) to true to opt in
proj.SetProperty (proj.ReleaseProperties, "AndroidCreateProguardMappingFile", true);
+ proj.SetProperty ("AndroidPackageFormat", "aab");
using (var b = CreateApkBuilder ()) {
string mappingFile = Path.Combine (Root, b.ProjectDirectory, proj.OutputPath, "mapping.txt");
Assert.IsTrue (b.Build (proj), "build should have succeeded.");
FileAssert.Exists (mappingFile, $"'{mappingFile}' should have been generated.");
+ var aab = Path.Combine (Root, b.ProjectDirectory, proj.OutputPath, $"{proj.PackageName}-Signed.aab");
+ FileAssert.Exists (aab, $"'{aab}' should have been generated.");
+ using (var zip = ZipHelper.OpenZip (aab)) {
+ Assert.IsTrue (zip.Any (e => e.FullName == "BUNDLE-METADATA/com.android.tools.build.obfuscation/proguard.map"), $"AAB file `{aab}` should contain the ProGuard mapping.");
+ Assert.IsTrue (zip.Any (e => e.FullName == "BUNDLE-METADATA/com.android.tools/r8.json"), $"AAB file `{aab}` should contain the R8 build metadata.");
+ }
+
+ Assert.IsTrue (b.Build (proj), "second build should have succeeded.");
+ foreach (var target in new [] { "_CompileToDalvik", "_BuildApkEmbed" }) {
+ Assert.IsTrue (b.Output.IsTargetSkipped (target), $"`{target}` should be skipped!");
+ }
}
}
diff --git a/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.targets b/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.targets
index b2956f39da6..eafdb06f3aa 100644
--- a/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.targets
+++ b/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.targets
@@ -230,6 +230,7 @@ Copyright (C) 2011-2012 Xamarin. All rights reserved.
<_AndroidLibraryFlatArchivesDirectory>$(IntermediateOutputPath)flata\
<_AndroidLibraryFlatFilesDirectory>$(IntermediateOutputPath)flat\
<_AndroidStampDirectory>$(IntermediateOutputPath)stamp\
+ <_AndroidR8BuildMetadataFile>$(IntermediateOutputPath)r8.json
<_AndroidApplicationSharedLibraryPath>$(IntermediateOutputPath)app_shared_libraries\
<_ResolvedUserAssembliesHashFile>$(IntermediateOutputPath)resolvedassemblies.hash
<_AndroidResolvedResourcesHashFile>$(IntermediateOutputPath)_AndroidResolvedResources.hash
@@ -2270,6 +2271,10 @@ because xbuild doesn't support framework reference assemblies.
Condition=" Exists('$(AndroidProguardMappingFile)') "
Include="com.android.tools.build.obfuscation/proguard.map:$(AndroidProguardMappingFile)"
/>
+
diff --git a/src/Xamarin.Android.Build.Tasks/Xamarin.Android.D8.targets b/src/Xamarin.Android.Build.Tasks/Xamarin.Android.D8.targets
index 0796e933155..5f197b76ffa 100644
--- a/src/Xamarin.Android.Build.Tasks/Xamarin.Android.D8.targets
+++ b/src/Xamarin.Android.Build.Tasks/Xamarin.Android.D8.targets
@@ -73,6 +73,7 @@ Copyright (C) 2018 Xamarin. All rights reserved.
ProguardGeneratedReferenceConfiguration="$(_ProguardProjectConfiguration)"
ProguardGeneratedApplicationConfiguration="$(IntermediateOutputPath)proguard\proguard_project_primary.cfg"
ProguardMappingFileOutput="$(AndroidProguardMappingFile)"
+ BuildMetadataFileOutput="$(_AndroidR8BuildMetadataFile)"
ProguardConfigurationFiles="@(_ProguardConfiguration)"
EnableShrinking="$(_R8EnableShrinking)"
EnableMultiDex="$(AndroidEnableMultiDex)"
@@ -109,6 +110,7 @@ Copyright (C) 2018 Xamarin. All rights reserved.
+