diff --git a/src/Xamarin.Android.Build.Tasks/MSBuild/Xamarin/Android/Xamarin.Android.Aapt2.targets b/src/Xamarin.Android.Build.Tasks/MSBuild/Xamarin/Android/Xamarin.Android.Aapt2.targets
index 5cd02d6aca5..2e9bea69a7d 100644
--- a/src/Xamarin.Android.Build.Tasks/MSBuild/Xamarin/Android/Xamarin.Android.Aapt2.targets
+++ b/src/Xamarin.Android.Build.Tasks/MSBuild/Xamarin/Android/Xamarin.Android.Aapt2.targets
@@ -156,6 +156,7 @@ Copyright (C) 2011-2012 Xamarin. All rights reserved.
Condition="'$(_AndroidUseAapt2)' == 'True'">
--no-version-vectors $(AndroidAapt2LinkExtraArgs)
+ <_Aapt2ProguardRules Condition=" '$(AndroidLinkTool)' != '' ">$(IntermediateOutputPath)aapt_rules.txt
+
+
+
+
diff --git a/src/Xamarin.Android.Build.Tasks/Tasks/Aapt2Link.cs b/src/Xamarin.Android.Build.Tasks/Tasks/Aapt2Link.cs
index e7d131ab517..a8b3fb6e9d0 100644
--- a/src/Xamarin.Android.Build.Tasks/Tasks/Aapt2Link.cs
+++ b/src/Xamarin.Android.Build.Tasks/Tasks/Aapt2Link.cs
@@ -74,6 +74,8 @@ public class Aapt2Link : Aapt2 {
public bool ProtobufFormat { get; set; }
+ public string ProguardRuleOutput { get; set; }
+
AssemblyIdentityMap assemblyMap = new AssemblyIdentityMap ();
List tempFiles = new List ();
@@ -185,6 +187,9 @@ string GenerateCommandLineCommands (string ManifestFile, string currentAbi, stri
if (!string.IsNullOrWhiteSpace (assetDir) && Directory.Exists (assetDir))
cmd.AppendSwitchIfNotNull ("-A ", assetDir);
}
+ if (!string.IsNullOrEmpty (ProguardRuleOutput)) {
+ cmd.AppendSwitchIfNotNull ("--proguard ", ProguardRuleOutput);
+ }
cmd.AppendSwitchIfNotNull ("-o ", currentResourceOutputFile);
return cmd.ToString ();
}
diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/BuildTest.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/BuildTest.cs
index 421f7ea1ec6..4ac2242ce89 100644
--- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/BuildTest.cs
+++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/BuildTest.cs
@@ -1011,7 +1011,7 @@ public void BuildAotApplicationAndBundleAndÜmläüts (string supportedAbis, boo
[Test]
public void BuildProguardEnabledProject ([Values (true, false)] bool isRelease, [Values ("dx", "d8")] string dexTool, [Values ("", "proguard", "r8")] string linkTool)
{
- var proj = new XamarinAndroidApplicationProject {
+ var proj = new XamarinFormsAndroidApplicationProject {
IsRelease = isRelease,
DexTool = dexTool,
LinkTool = linkTool,
@@ -1023,6 +1023,11 @@ public void BuildProguardEnabledProject ([Values (true, false)] bool isRelease,
var proguardProjectPrimary = Path.Combine (Root, b.ProjectDirectory, proj.IntermediateOutputPath, "proguard", "proguard_project_primary.cfg");
FileAssert.Exists (proguardProjectPrimary);
Assert.IsTrue (StringAssertEx.ContainsText (File.ReadAllLines (proguardProjectPrimary), $"-keep class {proj.JavaPackageName}.MainActivity"), $"`{proj.JavaPackageName}.MainActivity` should exist in `proguard_project_primary.cfg`!");
+
+ var toolbar_class = "android.support.v7.widget.Toolbar";
+ var aapt_rules = b.Output.GetIntermediaryPath ("aapt_rules.txt");
+ FileAssert.Exists (aapt_rules);
+ Assert.IsTrue (StringAssertEx.ContainsText (File.ReadAllLines (aapt_rules), $"-keep class {toolbar_class}"), $"`{toolbar_class}` should exist in `{aapt_rules}`!");
}
var dexFile = b.Output.GetIntermediaryPath (Path.Combine ("android", "bin", "classes.dex"));
@@ -1030,6 +1035,7 @@ public void BuildProguardEnabledProject ([Values (true, false)] bool isRelease,
var classes = new [] {
"Lmono/MonoRuntimeProvider;",
"Landroid/runtime/UncaughtExceptionHandler;",
+ "Landroid/support/v7/widget/Toolbar;"
};
foreach (var className in classes) {
Assert.IsTrue (DexUtils.ContainsClassWithMethod (className, "", "()V", dexFile, AndroidSdkPath), $"`{dexFile}` should include `{className}`!");