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}`!");