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. +