diff --git a/.gitmodules b/.gitmodules
index f8fca965e9d..388951e1651 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -41,6 +41,12 @@
path = external/xamarin-android-tools
url = https://github.com/xamarin/xamarin-android-tools
branch = master
+[submodule "external/depot_tools"]
+ path = external/depot_tools
+ url = https://chromium.googlesource.com/chromium/tools/depot_tools.git
+[submodule "external/r8"]
+ path = external/r8
+ url = https://r8.googlesource.com/r8
[submodule "external/dlfcn-win32"]
path = external/dlfcn-win32
url = https://github.com/dlfcn-win32/dlfcn-win32.git
diff --git a/Documentation/guides/BuildProcess.md b/Documentation/guides/BuildProcess.md
index f2f4c528638..4f204489c2e 100644
--- a/Documentation/guides/BuildProcess.md
+++ b/Documentation/guides/BuildProcess.md
@@ -209,6 +209,9 @@ when packaing Release applications.
This property is `False` by default.
+- **AndroidEnableD8** – A boolean property that determines
+ whether or not use Google's new dexer (dx.jar alternative).
+
- **AndroidEnableMultiDex** – A boolean property that
determines whether or not multi-dex support will be used in the
final `.apk`.
@@ -419,6 +422,10 @@ when packaing Release applications.
This property should be `True` for Debug builds, and `False` for
Release projects.
+- **AndroidUseR8** – A boolean property that determines
+ whether or not use Google's new Java code shlinker (proguard
+ alternative).
+
- **AotAssemblies** – A boolean property that determines
whether or not assemblies will be Ahead-of-Time compiled into
native code and included in the `.apk`.
diff --git a/Xamarin.Android.sln b/Xamarin.Android.sln
index 8b18ad6ba9d..40a285fec8a 100644
--- a/Xamarin.Android.sln
+++ b/Xamarin.Android.sln
@@ -123,6 +123,7 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Xamarin.Android.Tools.Andro
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Xamarin.Android.Tools.AndroidSdk-Tests", "external\xamarin-android-tools\src\Xamarin.Android.Tools.AndroidSdk\Tests\Xamarin.Android.Tools.AndroidSdk-Tests.csproj", "{1E5501E8-49C1-4659-838D-CC9720C5208F}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "r8", "src\r8\r8.csproj", "{1BAFA0CC-0377-46CE-AB7B-7BB2E7B62F63}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "proprietary", "build-tools\proprietary\proprietary.csproj", "{D93CAC27-3893-42A3-99F1-2BCA72E186F4}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "download-bundle", "build-tools\download-bundle\download-bundle.csproj", "{1DA0CB12-5508-4E83-A242-0C8D6D99A49B}"
@@ -358,6 +359,10 @@ Global
{1DA0CB12-5508-4E83-A242-0C8D6D99A49B}.Debug|AnyCPU.Build.0 = Debug|AnyCPU
{1DA0CB12-5508-4E83-A242-0C8D6D99A49B}.Release|AnyCPU.ActiveCfg = Release|AnyCPU
{1DA0CB12-5508-4E83-A242-0C8D6D99A49B}.Release|AnyCPU.Build.0 = Release|AnyCPU
+ {1BAFA0CC-0377-46CE-AB7B-7BB2E7B62F63}.Debug|AnyCPU.ActiveCfg = Debug|Any CPU
+ {1BAFA0CC-0377-46CE-AB7B-7BB2E7B62F63}.Debug|AnyCPU.Build.0 = Debug|Any CPU
+ {1BAFA0CC-0377-46CE-AB7B-7BB2E7B62F63}.Release|AnyCPU.ActiveCfg = Release|Any CPU
+ {1BAFA0CC-0377-46CE-AB7B-7BB2E7B62F63}.Release|AnyCPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -418,8 +423,7 @@ Global
{B8105878-D423-4159-A3E7-028298281EC6} = {04E3E11E-B47D-4599-8AFC-50515A95E715}
{E34BCFA0-CAA4-412C-AA1C-75DB8D67D157} = {04E3E11E-B47D-4599-8AFC-50515A95E715}
{1E5501E8-49C1-4659-838D-CC9720C5208F} = {CAB438D8-B0F5-4AF0-BEBD-9E2ADBD7B483}
- {D93CAC27-3893-42A3-99F1-2BCA72E186F4} = {E351F97D-EA4F-4E7F-AAA0-8EBB1F2A4A62}
- {1DA0CB12-5508-4E83-A242-0C8D6D99A49B} = {E351F97D-EA4F-4E7F-AAA0-8EBB1F2A4A62}
+ {1BAFA0CC-0377-46CE-AB7B-7BB2E7B62F63} = {04E3E11E-B47D-4599-8AFC-50515A95E715}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {53A1F287-EFB2-4D97-A4BB-4A5E145613F6}
diff --git a/external/depot_tools b/external/depot_tools
new file mode 160000
index 00000000000..a16b4ccd552
--- /dev/null
+++ b/external/depot_tools
@@ -0,0 +1 @@
+Subproject commit a16b4ccd5521dc25b3425c089bc59c58265c0626
diff --git a/external/depot_tools.tpnitems b/external/depot_tools.tpnitems
new file mode 100644
index 00000000000..7b261a2934d
--- /dev/null
+++ b/external/depot_tools.tpnitems
@@ -0,0 +1,9 @@
+
+
+
+
+ $(MSBuildThisFileDirectory)\depot_tools\LICENSE
+ https://chromium.googlesource.com/chromium/tools/depot_tools.git
+
+
+
diff --git a/external/r8 b/external/r8
new file mode 160000
index 00000000000..d7c62cf8857
--- /dev/null
+++ b/external/r8
@@ -0,0 +1 @@
+Subproject commit d7c62cf885787aad6fe712b84c44e293419db881
diff --git a/external/r8.tpnitems b/external/r8.tpnitems
new file mode 100644
index 00000000000..8d945808d81
--- /dev/null
+++ b/external/r8.tpnitems
@@ -0,0 +1,9 @@
+
+
+
+
+ $(MSBuildThisFileDirectory)\r8\LICENSE
+ https://r8.googlesource.com/r8/
+
+
+
diff --git a/src/Mono.Android/Test/Mono.Android-Tests.csproj b/src/Mono.Android/Test/Mono.Android-Tests.csproj
index 7b01efbe6ce..ef69fabf413 100644
--- a/src/Mono.Android/Test/Mono.Android-Tests.csproj
+++ b/src/Mono.Android/Test/Mono.Android-Tests.csproj
@@ -19,6 +19,8 @@
armeabi-v7a;x86
False
false
+ true
+ true
diff --git a/src/Xamarin.Android.Build.Tasks/Tasks/Proguard.cs b/src/Xamarin.Android.Build.Tasks/Tasks/Proguard.cs
index 58963235d51..20fa256108d 100644
--- a/src/Xamarin.Android.Build.Tasks/Tasks/Proguard.cs
+++ b/src/Xamarin.Android.Build.Tasks/Tasks/Proguard.cs
@@ -41,23 +41,17 @@ public class Proguard : ToolTask
[Required]
public string ProguardJarOutput { get; set; }
- [Required]
public string ProguardGeneratedReferenceConfiguration { get; set; }
-
- [Required]
public string ProguardGeneratedApplicationConfiguration { get; set; }
-
- [Required]
public string ProguardCommonXamarinConfiguration { get; set; }
+ [Required]
public string ProguardConfigurationFiles { get; set; }
public ITaskItem[] JavaLibrariesToEmbed { get; set; }
- public ITaskItem[] ExternalJavaLibraries { get; set; }
+ public ITaskItem[] JavaLibrariesToReference { get; set; }
- public ITaskItem[] DoNotPackageJavaLibraries { get; set; }
-
public bool UseProguard { get; set; }
public string JavaOptions { get; set; }
@@ -86,14 +80,13 @@ public override bool Execute ()
Log.LogDebugMessage (" JavaPlatformJarPath: {0}", JavaPlatformJarPath);
Log.LogDebugMessage (" ClassesOutputDirectory: {0}", ClassesOutputDirectory);
Log.LogDebugMessage (" AcwMapFile: {0}", AcwMapFile);
- Log.LogDebugMessage (" ProguardGeneratedApplicationConfiguration: {0}", ProguardGeneratedApplicationConfiguration);
Log.LogDebugMessage (" ProguardJarOutput: {0}", ProguardJarOutput);
Log.LogDebugTaskItems (" ProguardGeneratedReferenceConfiguration:", ProguardGeneratedReferenceConfiguration);
Log.LogDebugTaskItems (" ProguardGeneratedApplicationConfiguration:", ProguardGeneratedApplicationConfiguration);
Log.LogDebugTaskItems (" ProguardCommonXamarinConfiguration:", ProguardCommonXamarinConfiguration);
Log.LogDebugTaskItems (" ProguardConfigurationFiles:", ProguardConfigurationFiles);
- Log.LogDebugTaskItems (" ExternalJavaLibraries:", ExternalJavaLibraries);
- Log.LogDebugTaskItems (" DoNotPackageJavaLibraries:", DoNotPackageJavaLibraries);
+ Log.LogDebugTaskItems (" JavaLibrariesToEmbed:", JavaLibrariesToEmbed);
+ Log.LogDebugTaskItems (" JavaLibrariesToReference:", JavaLibrariesToReference);
Log.LogDebugMessage (" UseProguard: {0}", UseProguard);
Log.LogDebugMessage (" EnableLogging: {0}", EnableLogging);
Log.LogDebugMessage (" DumpOutput: {0}", DumpOutput);
@@ -139,15 +132,9 @@ protected override string GenerateCommandLineCommands ()
// skip invalid lines
}
- var injars = new List ();
- var libjars = new List ();
- injars.Add (classesZip);
- if (JavaLibrariesToEmbed != null)
- foreach (var jarfile in JavaLibrariesToEmbed)
- injars.Add (jarfile.ItemSpec);
-
- using (var xamcfg = File.Create (ProguardCommonXamarinConfiguration))
- GetType ().Assembly.GetManifestResourceStream ("proguard_xamarin.cfg").CopyTo (xamcfg);
+ if (!string.IsNullOrWhiteSpace (ProguardCommonXamarinConfiguration))
+ using (var xamcfg = File.Create (ProguardCommonXamarinConfiguration))
+ GetType ().Assembly.GetManifestResourceStream ("proguard_xamarin.cfg").CopyTo (xamcfg);
var configs = ProguardConfigurationFiles
.Replace ("{sdk.dir}", AndroidSdkDirectory + Path.DirectorySeparatorChar)
@@ -168,9 +155,15 @@ protected override string GenerateCommandLineCommands ()
Log.LogWarning ("Proguard configuration file '{0}' was not found.", file);
}
+ var injars = new List ();
+ var libjars = new List ();
+ injars.Add (classesZip);
+ if (JavaLibrariesToEmbed != null)
+ foreach (var jarfile in JavaLibrariesToEmbed)
+ injars.Add (jarfile.ItemSpec);
libjars.Add (JavaPlatformJarPath);
- if (ExternalJavaLibraries != null)
- foreach (var jarfile in ExternalJavaLibraries.Select (p => p.ItemSpec))
+ if (JavaLibrariesToReference != null)
+ foreach (var jarfile in JavaLibrariesToReference.Select (p => p.ItemSpec))
libjars.Add (jarfile);
cmd.AppendSwitchUnquotedIfNotNull ("-injars ", "\"'" + string.Join ($"'{ProguardInputJarFilter}{Path.PathSeparator}'", injars.Distinct ()) + $"'{ProguardInputJarFilter}\"");
diff --git a/src/Xamarin.Android.Build.Tasks/Tasks/R8.cs b/src/Xamarin.Android.Build.Tasks/Tasks/R8.cs
new file mode 100644
index 00000000000..afc758ae243
--- /dev/null
+++ b/src/Xamarin.Android.Build.Tasks/Tasks/R8.cs
@@ -0,0 +1,173 @@
+// Copyright (C) 2018 Xamarin, Inc. All rights reserved.
+
+using System;
+using System.Linq;
+using System.IO;
+using Microsoft.Build.Framework;
+using Microsoft.Build.Utilities;
+using System.Text;
+using System.Collections.Generic;
+using Xamarin.Android.Tools;
+
+namespace Xamarin.Android.Tasks
+{
+
+ public class R8 : JavaToolTask
+ {
+ [Required]
+ public string R8JarPath { get; set; }
+
+ [Required]
+ public string OutputDirectory { get; set; }
+
+ public string Configuration { get; set; }
+
+ // It is loaded to calculate --min-api, which is used by desugaring part to determine which levels of desugaring it performs.
+ [Required]
+ public string AndroidManifestFile { get; set; }
+
+ // general r8 feature options.
+ public bool EnableDesugar { get; set; }
+ public bool EnableMinify { get; set; } // The Task has the option, but it is not supported at all.
+ public bool EnableTreeShaking { get; set; }
+
+ // Java libraries to embed or reference
+ [Required]
+ public string ClassesZip { get; set; }
+ [Required]
+ public string JavaPlatformJarPath { get; set; }
+ public ITaskItem [] JavaLibrariesToEmbed { get; set; }
+ public ITaskItem [] JavaLibrariesToReference { get; set; }
+
+ // used for proguard configuration settings
+ [Required]
+ public string AndroidSdkDirectory { get; set; }
+ [Required]
+ public string AcwMapFile { get; set; }
+ public string ProguardGeneratedReferenceConfiguration { get; set; }
+ public string ProguardGeneratedApplicationConfiguration { get; set; }
+ public string ProguardCommonXamarinConfiguration { get; set; }
+ [Required]
+ public string ProguardConfigurationFiles { get; set; }
+ public string ProguardMappingOutput { get; set; }
+
+ // multidex
+ public bool EnableMultiDex { get; set; }
+ public string MultiDexMainDexListFile { get; set; }
+
+ public string R8ExtraArguments { get; set; }
+
+ public override bool Execute ()
+ {
+ Log.LogDebugMessage ("R8 Task");
+ Log.LogDebugTaskItems (" R8JarPath: ", R8JarPath);
+ Log.LogDebugTaskItems (" OutputDirectory: ", OutputDirectory);
+ Log.LogDebugTaskItems (" AndroidManifestFile: ", AndroidManifestFile);
+ Log.LogDebugMessage (" Configuration: {0}", Configuration);
+ Log.LogDebugTaskItems (" JavaPlatformJarPath: ", JavaPlatformJarPath);
+ Log.LogDebugTaskItems (" ClassesZip: ", ClassesZip);
+ Log.LogDebugTaskItems (" JavaLibrariesToEmbed: ", JavaLibrariesToEmbed);
+ Log.LogDebugTaskItems (" JavaLibrariesToReference: ", JavaLibrariesToReference);
+ Log.LogDebugMessage (" EnableDesugar: {0}", EnableDesugar);
+ Log.LogDebugMessage (" EnableTreeShaking: {0}", EnableTreeShaking);
+ Log.LogDebugTaskItems (" AndroidSdkDirectory:", AndroidSdkDirectory);
+ Log.LogDebugTaskItems (" AcwMapFile: ", AcwMapFile);
+ Log.LogDebugTaskItems (" ProguardGeneratedReferenceConfiguration:", ProguardGeneratedReferenceConfiguration);
+ Log.LogDebugTaskItems (" ProguardGeneratedApplicationConfiguration:", ProguardGeneratedApplicationConfiguration);
+ Log.LogDebugTaskItems (" ProguardCommonXamarinConfiguration:", ProguardCommonXamarinConfiguration);
+ Log.LogDebugTaskItems (" ProguardConfigurationFiles:", ProguardConfigurationFiles);
+ Log.LogDebugTaskItems (" ProguardMappingOutput:", ProguardMappingOutput);
+ Log.LogDebugMessage (" EnableMultiDex: {0}", EnableMultiDex);
+ Log.LogDebugTaskItems (" MultiDexMainDexListFile: ", MultiDexMainDexListFile);
+ Log.LogDebugTaskItems (" R8ExtraArguments: ", R8ExtraArguments);
+
+ return base.Execute ();
+ }
+
+ protected override string GenerateCommandLineCommands ()
+ {
+ var cmd = new CommandLineBuilder ();
+
+ cmd.AppendSwitchIfNotNull ("-jar ", R8JarPath);
+
+ if (!string.IsNullOrEmpty (R8ExtraArguments))
+ cmd.AppendSwitch (R8ExtraArguments); // it should contain "--dex".
+ if (Configuration.Equals ("Debug", StringComparison.OrdinalIgnoreCase))
+ cmd.AppendSwitch ("--debug");
+
+ // generating proguard application configuration
+ if (EnableTreeShaking) {
+ var acwLines = File.ReadAllLines (AcwMapFile);
+ using (var appcfg = File.CreateText (ProguardGeneratedApplicationConfiguration))
+ for (int i = 0; i + 2 < acwLines.Length; i += 3)
+ try {
+ var line = acwLines [i + 2];
+ var java = line.Substring (line.IndexOf (';') + 1);
+ appcfg.WriteLine ("-keep class " + java + " { *; }");
+ } catch {
+ // skip invalid lines
+ }
+ if (!string.IsNullOrWhiteSpace (ProguardCommonXamarinConfiguration))
+ using (var xamcfg = File.Create (ProguardCommonXamarinConfiguration))
+ GetType ().Assembly.GetManifestResourceStream ("proguard_xamarin.cfg").CopyTo (xamcfg);
+ var configs = ProguardConfigurationFiles
+ .Replace ("{sdk.dir}", AndroidSdkDirectory + Path.DirectorySeparatorChar)
+ .Replace ("{intermediate.common.xamarin}", ProguardCommonXamarinConfiguration)
+ .Replace ("{intermediate.references}", ProguardGeneratedReferenceConfiguration)
+ .Replace ("{intermediate.application}", ProguardGeneratedApplicationConfiguration)
+ .Replace ("{project}", string.Empty) // current directory anyways.
+ .Split (';')
+ .Select (s => s.Trim ())
+ .Where (s => !string.IsNullOrWhiteSpace (s));
+ var enclosingChar = "\"";
+ foreach (var file in configs) {
+ if (File.Exists (file))
+ cmd.AppendSwitchIfNotNull ("--pg-conf ", file);
+ else
+ Log.LogWarning ("Proguard configuration file '{0}' was not found.", file);
+ }
+ cmd.AppendSwitchIfNotNull ("--pg-map-output ", ProguardMappingOutput);
+
+ // multidexing
+ if (EnableMultiDex) {
+ if (!string.IsNullOrWhiteSpace (MultiDexMainDexListFile) && File.Exists (MultiDexMainDexListFile))
+ cmd.AppendSwitchIfNotNull ("--main-dex-list ", MultiDexMainDexListFile);
+ else
+ Log.LogWarning ($"MultiDex is enabled, but main dex list file '{MultiDexMainDexListFile}' does not exist.");
+ }
+ }
+
+ // desugaring
+ var doc = AndroidAppManifest.Load (AndroidManifestFile, MonoAndroidHelper.SupportedVersions);
+ int minApiVersion = doc.MinSdkVersion == null ? 4 : (int)doc.MinSdkVersion;
+ cmd.AppendSwitchIfNotNull ("--min-api ", minApiVersion.ToString ());
+
+ if (!EnableTreeShaking)
+ cmd.AppendSwitch ("--no-tree-shaking");
+ if (!EnableDesugar)
+ cmd.AppendSwitch ("--no-desugaring");
+ if (!EnableMinify)
+ cmd.AppendSwitch ("--no-minification");
+
+ var injars = new List ();
+ var libjars = new List ();
+ injars.Add (ClassesZip);
+ if (JavaLibrariesToEmbed != null)
+ foreach (var jarfile in JavaLibrariesToEmbed)
+ injars.Add (jarfile.ItemSpec);
+ libjars.Add (JavaPlatformJarPath);
+ if (JavaLibrariesToReference != null)
+ foreach (var jarfile in JavaLibrariesToReference.Select (p => p.ItemSpec))
+ libjars.Add (jarfile);
+
+ cmd.AppendSwitchIfNotNull ("--output ", OutputDirectory);
+ foreach (var jar in libjars)
+ cmd.AppendSwitchIfNotNull ("--lib ", jar);
+ foreach (var jar in injars)
+ cmd.AppendFileNameIfNotNull (jar);
+
+ return cmd.ToString ();
+ }
+ }
+
+}
diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/BuildTest.OSS.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/BuildTest.OSS.cs
index 97352581de6..0e9e5ccbd4f 100644
--- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/BuildTest.OSS.cs
+++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/BuildTest.OSS.cs
@@ -70,21 +70,49 @@ public partial class BuildTest : BaseTest
/* isRelease */ true,
/* enableProguard */ true,
/* useLatestSdk */ true,
+ /* useR8 */ false,
},
new Object [] {
/* isRelease */ true,
/* enableProguard */ false,
/* useLatestSdk */ true,
+ /* useR8 */ false,
},
new Object [] {
/* isRelease */ false,
/* enableProguard */ true,
/* useLatestSdk */ true,
+ /* useR8 */ false,
},
new Object [] {
/* isRelease */ false,
/* enableProguard */ false,
/* useLatestSdk */ true,
+ /* useR8 */ false,
+ },
+ new Object [] {
+ /* isRelease */ true,
+ /* enableProguard */ true,
+ /* useLatestSdk */ true,
+ /* useR8 */ true,
+ },
+ new Object [] {
+ /* isRelease */ true,
+ /* enableProguard */ false,
+ /* useLatestSdk */ true,
+ /* useR8 */ true,
+ },
+ new Object [] {
+ /* isRelease */ false,
+ /* enableProguard */ true,
+ /* useLatestSdk */ true,
+ /* useR8 */ true,
+ },
+ new Object [] {
+ /* isRelease */ false,
+ /* enableProguard */ false,
+ /* useLatestSdk */ true,
+ /* useR8 */ true,
},
};
static object [] TakeSimpleFlag = new object [] {
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 35ec9af2766..771bb20fa73 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
@@ -495,10 +495,10 @@ public void BuildAotApplicationAndBundle (string supportedAbis, bool enableLLVM,
[Test]
[TestCaseSource ("ProguardChecks")]
- public void BuildProguardEnabledProject (bool isRelease, bool enableProguard, bool useLatestSdk)
+ public void BuildProguardEnabledProject (bool isRelease, bool enableProguard, bool useLatestSdk, bool useR8)
{
- var proj = new XamarinAndroidApplicationProject () { IsRelease = isRelease, EnableProguard = enableProguard, UseLatestPlatformSdk = useLatestSdk, TargetFrameworkVersion = useLatestSdk ? "v7.1" : "v5.0" };
- using (var b = CreateApkBuilder (Path.Combine ("temp", $"BuildProguard Enabled Project(1){isRelease}{enableProguard}{useLatestSdk}"))) {
+ var proj = new XamarinAndroidApplicationProject () { IsRelease = isRelease, EnableProguard = enableProguard, UseR8 = useR8, UseLatestPlatformSdk = useLatestSdk, TargetFrameworkVersion = useLatestSdk ? "v7.1" : "v5.0" };
+ using (var b = CreateApkBuilder (Path.Combine ("temp", $"BuildProguard Enabled Project(1){isRelease}{enableProguard}{useLatestSdk}{useR8}"))) {
Assert.IsTrue (b.Build (proj), "Build should have succeeded.");
if (isRelease && enableProguard) {
diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Android/KnownProperties.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Android/KnownProperties.cs
index c0d0ca37714..b6c3de96664 100644
--- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Android/KnownProperties.cs
+++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Android/KnownProperties.cs
@@ -17,6 +17,7 @@ public static class KnownProperties
public const string BundleAssemblies = "BundleAssemblies";
public const string EnableProguard = "EnableProguard";
public const string AndroidEnableDesugar = "AndroidEnableDesugar";
+ public const string AndroidUseR8 = "AndroidUseR8";
public const string UseJackAndJill = "UseJackAndJill";
public const string AotAssemblies = "AotAssemblies";
diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Android/XamarinAndroidApplicationProject.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Android/XamarinAndroidApplicationProject.cs
index a3804b50f52..ee4643e518a 100644
--- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Android/XamarinAndroidApplicationProject.cs
+++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Android/XamarinAndroidApplicationProject.cs
@@ -85,6 +85,11 @@ public bool EnableDesugar {
set { SetProperty (KnownProperties.AndroidEnableDesugar, value.ToString ()); }
}
+ public bool UseR8 {
+ get { return string.Equals (GetProperty (KnownProperties.AndroidUseR8), "True", StringComparison.OrdinalIgnoreCase); }
+ set { SetProperty (KnownProperties.AndroidUseR8, value.ToString ()); }
+ }
+
public string AndroidFastDeploymentType {
get { return GetProperty (KnownProperties.AndroidFastDeploymentType); }
set { SetProperty (KnownProperties.AndroidFastDeploymentType, value); }
diff --git a/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Build.Tasks.csproj b/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Build.Tasks.csproj
index c2f04033f82..3f4186a2642 100644
--- a/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Build.Tasks.csproj
+++ b/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Build.Tasks.csproj
@@ -563,11 +563,13 @@
+
+
desugar_deploy.jar
PreserveNewest
@@ -712,6 +714,11 @@
proguard
False
+
+ {1bafa0cc-0377-46ce-ab7b-7bb2e7b62f63}
+ r8
+ False
+
{E248B2CA-303B-4645-ADDC-9D4459D550FD}
libZipSharp
diff --git a/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.targets b/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.targets
index f0f619b900e..944b7f76960 100755
--- a/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.targets
+++ b/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.targets
@@ -72,6 +72,7 @@ Copyright (C) 2011-2012 Xamarin. All rights reserved.
+
@@ -279,6 +280,7 @@ Copyright (C) 2011-2012 Xamarin. All rights reserved.
$(EnableProguard)
False
False
+ False
1G
@@ -940,12 +942,36 @@ because xbuild doesn't support framework reference assemblies.
/>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+