diff --git a/.gitignore b/.gitignore
index 5b8e7bc68d2..3f721ca4ff2 100644
--- a/.gitignore
+++ b/.gitignore
@@ -22,3 +22,4 @@ src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.props
*~
external/monodroid/
external/mono/
+tests/api-compatibility/reference/*.dll
\ No newline at end of file
diff --git a/NuGet.config b/NuGet.config
index bf21c4d2f72..b82b970d2db 100644
--- a/NuGet.config
+++ b/NuGet.config
@@ -5,5 +5,6 @@
+
\ No newline at end of file
diff --git a/build-tools/Xamarin.Android.Tools.BootstrapTasks/Xamarin.Android.Tools.BootstrapTasks.csproj b/build-tools/Xamarin.Android.Tools.BootstrapTasks/Xamarin.Android.Tools.BootstrapTasks.csproj
index 4379aa364cb..9c64a1e25cc 100644
--- a/build-tools/Xamarin.Android.Tools.BootstrapTasks/Xamarin.Android.Tools.BootstrapTasks.csproj
+++ b/build-tools/Xamarin.Android.Tools.BootstrapTasks/Xamarin.Android.Tools.BootstrapTasks.csproj
@@ -48,6 +48,7 @@
+
diff --git a/build-tools/Xamarin.Android.Tools.BootstrapTasks/Xamarin.Android.Tools.BootstrapTasks/CheckApiCompatibility.cs b/build-tools/Xamarin.Android.Tools.BootstrapTasks/Xamarin.Android.Tools.BootstrapTasks/CheckApiCompatibility.cs
new file mode 100644
index 00000000000..843d37b1781
--- /dev/null
+++ b/build-tools/Xamarin.Android.Tools.BootstrapTasks/Xamarin.Android.Tools.BootstrapTasks/CheckApiCompatibility.cs
@@ -0,0 +1,281 @@
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.IO;
+using Microsoft.Build.Framework;
+using Microsoft.Build.Utilities;
+using Xamarin.Tools.Zip;
+
+namespace Xamarin.Android.Tools.BootstrapTasks
+{
+ public sealed class CheckApiCompatibility : Task
+ {
+ // This dictionary holds Api versions
+ // key is the Api version
+ // value is the previous Api version in relation to the key
+ static readonly Dictionary api_versions = new Dictionary ()
+ {
+ { "v4.4", "" },
+ { "v4.4.87", "v4.4" },
+ { "v5.0", "v4.4.87" },
+ { "v5.1", "v5.0" },
+ { "v6.0", "v5.1" },
+ { "v7.0", "v6.0" },
+ { "v7.1", "v7.0" },
+ { "v8.0", "v7.1" },
+ { "v8.1", "v8.0" },
+ { "v9.0", "v8.1" },
+ { "v10.0", "v9.0" },
+ };
+
+ static readonly string [] assemblies =
+ {
+ "Mono.Android.dll",
+ };
+
+ // Path where Microsoft.DotNet.ApiCompat nuget package is located
+ [Required]
+ public string ApiCompatPath { get; set; }
+
+ // Api level just built
+ [Required]
+ public string ApiLevel { get; set; }
+
+ // The last stable api level.
+ [Required]
+ public string LastStableApiLevel { get; set; }
+
+ // Output Path where the assembly was just built
+ [Required]
+ public string TargetImplementationPath { get; set; }
+
+ // Path to xamarin-android-api-compatibility folder
+ [Required]
+ public string ApiCompatibilityPath { get; set; }
+
+ // This Build tasks validates that changes are not breaking Api
+ public override bool Execute ()
+ {
+ Log.LogMessage (MessageImportance.High, $"CheckApiCompatibility for ApiLevel: {ApiLevel}");
+
+ // Check to see if Api has a previous Api defined.
+ if (!api_versions.TryGetValue (ApiLevel, out string previousApiLevel)) {
+ Log.LogError ($"Please add ApiLevel:{ApiLevel} to the list of supported apis.");
+ return !Log.HasLoggedErrors;
+ }
+
+ // Get the previous api implementation path by replacing the current api string with the previous one.
+ var previousTargetImplementationPath = TargetImplementationPath.Replace (ApiLevel, previousApiLevel);
+
+ // In case previous api is not defined or directory does not exist we can skip the check.
+ var validateAgainstPreviousApi = !(string.IsNullOrWhiteSpace (previousApiLevel) || !Directory.Exists (previousTargetImplementationPath));
+ if (validateAgainstPreviousApi) {
+
+ // First we check the Api level assembly against the previous api level assembly
+ // i.e.: check api breakages using "the just built V2.dll" against "the just built V1.dll"
+ ValidateApiCompat (previousTargetImplementationPath, false);
+
+ if (Log.HasLoggedErrors) {
+ return !Log.HasLoggedErrors;
+ }
+ }
+
+ // If Api level is the latest we should also compare it against the reference assembly
+ // located on the external folder. (xamarin-android-api-compatibility)
+ // i.e.: check apicompat using "the just built V2.dll" against V2.dll located on xamarin-android-api-compatibility repo
+ if (ApiLevel == LastStableApiLevel) {
+
+ // Check xamarin-android-api-compatibility reference directory exists
+ var referenceContractPath = Path.Combine (ApiCompatibilityPath, "reference");
+ if (!Directory.Exists (referenceContractPath)) {
+ Log.LogMessage (MessageImportance.High, $"CheckApiCompatibility Warning: Skipping reference contract check.\n{referenceContractPath} does not exist.");
+ return !Log.HasLoggedErrors;
+ }
+
+ // Before validate, check that zip files were decompressed.
+ var zipFiles = Directory.GetFiles (referenceContractPath, "*.zip");
+ foreach (var zipFile in zipFiles) {
+ using (var zip = ZipArchive.Open (zipFile, FileMode.Open)) {
+ zip.ExtractAll (referenceContractPath);
+ }
+ }
+
+ ValidateApiCompat (referenceContractPath, true);
+ }
+
+ return !Log.HasLoggedErrors;
+ }
+
+ // Validates Api compatibility between contract (previous version) and implementation (current version)
+ // We do that by using Microsoft.DotNet.ApiCompat.dll
+ void ValidateApiCompat (string contractPath, bool validateAgainstReference)
+ {
+ const string ApiCompatTemp = "ApiCompatTemp";
+
+ var apiCompat = Path.Combine (ApiCompatPath, "Microsoft.DotNet.ApiCompat.exe");
+ var contractPathDirectory = Path.Combine (contractPath, ApiCompatTemp);
+ var targetImplementationPathDirectory = Path.Combine (TargetImplementationPath, ApiCompatTemp);
+
+ try {
+ // Copy interesting assemblies to a temp folder.
+ // This is done to avoids the Microsoft.DotNet.ApiCompat.exe to analyze unwanted assemblies
+ // We need to validate assembly exist in both contract and implementation folders.
+ Directory.CreateDirectory (contractPathDirectory);
+ Directory.CreateDirectory (targetImplementationPathDirectory);
+
+ foreach (var assemblyToValidate in assemblies) {
+ var contractAssembly = Path.Combine (contractPath, assemblyToValidate);
+ if (!File.Exists (contractAssembly)) {
+ Log.LogMessage ($"Contract assembly {assemblyToValidate} does not exists in the contract path.");
+ continue;
+ }
+
+ var implementationAssembly = Path.Combine (TargetImplementationPath, assemblyToValidate);
+ if (!File.Exists (implementationAssembly)) {
+ Log.LogError ($"Implementation assembly {assemblyToValidate} exists in the contract path but not on the implementation folder.");
+ return;
+ }
+
+ File.Copy (contractAssembly, Path.Combine (contractPathDirectory, assemblyToValidate), true);
+ File.Copy (implementationAssembly, Path.Combine (targetImplementationPathDirectory, assemblyToValidate), true);
+ }
+
+ using (var genApiProcess = new Process ()) {
+
+ genApiProcess.StartInfo.FileName = apiCompat;
+ genApiProcess.StartInfo.Arguments = $"\"{contractPathDirectory}\" -i \"{targetImplementationPathDirectory}\" ";
+
+ // Verify if there is an exclusion list
+ var excludeAttributes = Path.Combine (ApiCompatibilityPath, $"api-compat-exclude-attributes.txt");
+ if (File.Exists (excludeAttributes)) {
+ genApiProcess.StartInfo.Arguments += $"--exclude-attributes {excludeAttributes} ";
+ }
+
+ genApiProcess.StartInfo.UseShellExecute = false;
+ genApiProcess.StartInfo.CreateNoWindow = true;
+ genApiProcess.StartInfo.RedirectStandardOutput = true;
+
+ Log.LogMessage (MessageImportance.High, $"CompatApi command: {genApiProcess.StartInfo.FileName} {genApiProcess.StartInfo.Arguments}");
+
+ // Get api definition for previous Api
+ genApiProcess.Start ();
+ ValidateIssues (genApiProcess.StandardOutput, validateAgainstReference);
+ genApiProcess.WaitForExit ();
+ }
+ } finally {
+ if (Directory.Exists (contractPathDirectory)) {
+ Directory.Delete (contractPathDirectory, true);
+ }
+
+ if (Directory.Exists (targetImplementationPathDirectory)) {
+ Directory.Delete (targetImplementationPathDirectory, true);
+ }
+ }
+ }
+
+ // Validates there is no issue or issues found are acceptable
+ void ValidateIssues (StreamReader content, bool validateAgainstReference)
+ {
+ // Load issues into a dictionary
+ var issuesFound = LoadIssues (content);
+
+ Dictionary> acceptableIssues = null;
+
+ // Verify if there is a file with acceptable issues.
+ var acceptableIssuesFile = Path.Combine (ApiCompatibilityPath, $"acceptable-breakages-{ (validateAgainstReference ? "vReference" : ApiLevel) }.txt");
+ if (!File.Exists (acceptableIssuesFile)) {
+
+ // If file does not exist but no issues were reported we can return here.
+ if (issuesFound == null || issuesFound.Count == 0) {
+ return;
+ }
+ } else {
+
+ // Read and Convert the acceptable issues into a dictionary
+ using (var streamReader = new StreamReader (acceptableIssuesFile)) {
+ acceptableIssues = LoadIssues (streamReader);
+ }
+ }
+
+ // Now remove all acceptable issues form the dictionary of issues found.
+ var count = 0;
+ if (acceptableIssues != null) {
+ foreach (var item in acceptableIssues) {
+ if (!issuesFound.TryGetValue (item.Key, out HashSet issues)) {
+ // we should always be able to find the assembly that is reporting the issues
+ Log.LogMessage (MessageImportance.High, $"There is an invalid assembly listed on the acceptable breakages file: {item.Key}");
+ count++;
+ continue;
+ }
+
+ foreach (var issue in item.Value) {
+ // we should always be able to remove the issue, if we try to remove an issue that does not exist,
+ // it means the acceptable list is incorrect and should be reported.
+ if (!issues.Remove (issue)) {
+ Log.LogMessage (MessageImportance.High, $"There is an invalid issue listed on the acceptable breakages file: {issue}");
+ count++;
+ }
+ }
+ }
+ }
+
+ // Any issue that still exist on issues found means it is a new issue and we should report
+ foreach (var item in issuesFound) {
+ if (item.Value.Count == 0) {
+ continue;
+ }
+
+ Log.LogMessage (MessageImportance.High, item.Key);
+ foreach (var issue in item.Value) {
+ Log.LogMessage (MessageImportance.High, issue);
+ count++;
+ }
+ }
+
+ if (count > 0) {
+ Log.LogMessage (MessageImportance.High, $"Total Issues: {count}");
+ Log.LogError ($"CheckApiCompatibility found nonacceptable Api breakages for ApiLevel: {ApiLevel}.");
+ }
+ }
+
+ // Converts list of issue into a dictionary
+ Dictionary> LoadIssues (StreamReader content)
+ {
+ var issues = new Dictionary> ();
+ HashSet currentSet = null;
+
+ while (!content.EndOfStream) {
+ var line = content.ReadLine ();
+
+ if (string.IsNullOrWhiteSpace (line) || line.StartsWith ("#")) {
+ continue;
+ }
+
+ line = line.Trim ();
+
+ // Create hashset per assembly
+ if (line.StartsWith ("Compat issues with assembly", StringComparison.InvariantCultureIgnoreCase)) {
+ currentSet = new HashSet ();
+ issues.Add (line, currentSet);
+ continue;
+ }
+
+ // end of file
+ if (line.StartsWith ("Total Issues:", StringComparison.InvariantCultureIgnoreCase)) {
+ break;
+ }
+
+ if (currentSet == null) {
+ // Hashset should never be null, unless exception file is not defining assembly line.
+ Log.LogError ($"Exception report/file should start with: Compat issues with assembly");
+ return null;
+ }
+
+ // Add rule to hashset
+ currentSet.Add (line);
+ }
+
+ return issues;
+ }
+ }
+}
diff --git a/build-tools/Xamarin.Android.Tools.BootstrapTasks/packages.config b/build-tools/Xamarin.Android.Tools.BootstrapTasks/packages.config
index d5cba3e9a8d..e4c135f8ddb 100644
--- a/build-tools/Xamarin.Android.Tools.BootstrapTasks/packages.config
+++ b/build-tools/Xamarin.Android.Tools.BootstrapTasks/packages.config
@@ -1,5 +1,7 @@
+
+
\ No newline at end of file
diff --git a/src/Mono.Android/Mono.Android.targets b/src/Mono.Android/Mono.Android.targets
index 858f7fb7f2e..80c2ea6441c 100644
--- a/src/Mono.Android/Mono.Android.targets
+++ b/src/Mono.Android/Mono.Android.targets
@@ -1,6 +1,7 @@
+
@@ -160,4 +161,30 @@
AfterTargets="Clean">
+
+ ../../tests/api-compatibility
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/api-compatibility/README.md b/tests/api-compatibility/README.md
new file mode 100644
index 00000000000..cbb29579c4d
--- /dev/null
+++ b/tests/api-compatibility/README.md
@@ -0,0 +1,120 @@
+# Check-Api-Compatibility
+
+**Check-Api-Compatibility** is a process to check that changes are not causing
+APIs breakages in `Mono.Android.dll`. The process uses the
+[Microsoft.DotNet.ApiCompat][mdac] tool in order to test API compatibility
+between a two .NET assemblies. When testing, the tool will compare a *contract*
+(old assembly) against an *implementation* (new assembly).
+
+The *contract* represents the API that's expected: for example a reference
+assembly or a previous version of an assembly. We could also called it the
+V1 assembly.
+
+The *implementation* represents the API that's provided: for example the
+current version of an assembly. We could also called it the V2 assembly.
+
+[mdac]: https://github.com/dotnet/arcade/tree/master/src/Microsoft.DotNet.ApiCompat
+
+
+## Build Task
+
+We have developed a build task that will wrap *Microsoft.DotNet.ApiCompat.exe*
+and perform the required checks. The build task is called
+`` and it is
+located under [BootstrapTasks][bst].
+
+`` expects the following parameters:
+
+ * `ApiCompatPath`: Path where `Microsoft.DotNet.ApiCompat` nuget package
+ is located.
+
+ * `ApiLevel`: API-level just built.
+
+ * `LastStableApiLevel`: The last stable api level.
+
+ * `TargetImplementationPath`: Path to the implementation assembly. Based on
+ this path we will generate the contract path by replace current version with
+ previous version
+
+ * `ApiCompatibilityPath`: Path to the Api Compatibility folder. In this
+ folder we should find the acceptable-breakages files and the reference
+ folder that contains the current `Mono.Android.dll` assembly.
+
+The *task* is aware of the API levels and what is the previous API level for a
+given `$(TargetFrameworkVersion)`, so when building v2.0, the task knows if
+previous version is v1.5 or v1.0 for example.
+
+
+## Acceptable Breakages
+
+When *Microsoft.DotNet.ApiCompat* executes, it prints out all API breakages it
+encounters.
+
+To *ignore* a reported API breakage, copy the error message produced by
+*Microsoft.DotNet.ApiCompat* into an appropriate
+`tests/api-compatibility/acceptable-breakages-*.txt` file. The `*` is replaced
+with the *current* `$(TargetFrameworkVersion)` value being processed.
+
+For example, when comparing `Mono.Android.dll` v6.0 against v7.0, the following
+warning is reported:
+
+ CannotRemoveAttribute : Attribute 'System.ObsoleteAttribute' exists on 'Android.App.Activity.LastNonConfigurationInstance' in the contract but not the implementation.
+
+This warning is produced because in v6.0 (API-23) we produced:
+
+```csharp
+[Obsolete (@"deprecated")]
+public virtual unsafe Java.Lang.Object LastNonConfigurationInstance {
+```
+
+because [`android.app.Activity.getLastNonConfigurationInstance`][aglnci] was
+deprecated in API-15, so we declared it `[Obsolete]`.
+
+[aglnci]: https://developer.android.com/reference/android/app/Activity#getLastNonConfigurationInstance()
+
+
+Meanwhile in v7.0 (API-24) we stopped emitting `[Obsolete]`:
+
+```csharp
+public virtual unsafe Java.Lang.Object LastNonConfigurationInstance {
+```
+
+This is because Google *un-deprecated* the method!
+
+To ignore this warning, `tests/api-compatibility/acceptable-breakages-v7.0.txt`
+contains the above message text, which causes `` to
+ignore the reported warning.
+
+When accepting break changes against the current reference assembly, use
+`tests/api-compatibility/acceptable-breakages-vReference.txt` to control the
+items that are acceptable.
+
+
+## Assembly reference
+
+Besides checking against a previous API Level, we should also check against the
+current API Level. This will prevent us from breaking the current stable
+binding. In order to be able to do that we need to commit the `Mono.Android.dll`
+assembly to our repository.
+
+We don't want to commit the "naked" assembly because it is quite large (around 30MB),
+so we should first strip IL code from the assembly by using `cil-strip.exe`, for
+example on macOS:
+
+
+```
+$ mono bin/Debug/lib/xamarin.android/xbuild/Xamarin/Android/cil-strip.exe Mono.Android.dll Mono.Android-out.dll
+Mono CIL Stripper
+
+26747392 Mono.Android.dll
+19300864 Mono.Android-out.dll
+```
+
+Rename `Mono.Android-out.dll` to `Mono.Android.dll`, then compress into a `.zip` file:
+
+```
+zip Mono.Android.dll.zip Mono.Android.dll
+```
+
+Commit the new `Mono.Android.dll.zip` file into
+`tests/api-compatibility/reference/Mono.Android.dll.zip`.
diff --git a/tests/api-compatibility/acceptable-breakages-v10.0.txt b/tests/api-compatibility/acceptable-breakages-v10.0.txt
new file mode 100644
index 00000000000..4b8e8f456b5
--- /dev/null
+++ b/tests/api-compatibility/acceptable-breakages-v10.0.txt
@@ -0,0 +1,40 @@
+Compat issues with assembly Mono.Android:
+MembersMustExist : Member 'Android.Media.AudioRecord.add_RoutingChanged(System.EventHandler)' does not exist in the implementation but it does exist in the contract.
+MembersMustExist : Member 'Android.Media.AudioRecord.remove_RoutingChanged(System.EventHandler)' does not exist in the implementation but it does exist in the contract.
+MembersMustExist : Member 'Android.Media.AudioTrack.add_RoutingChanged(System.EventHandler)' does not exist in the implementation but it does exist in the contract.
+MembersMustExist : Member 'Android.Media.AudioTrack.remove_RoutingChanged(System.EventHandler)' does not exist in the implementation but it does exist in the contract.
+CannotRemoveAttribute : Attribute 'System.ObsoleteAttribute' exists on 'Android.Net.Wifi.WpsInfo' in the contract but not the implementation.
+CannotRemoveAttribute : Attribute 'System.ObsoleteAttribute' exists on 'System.Int32 Android.Net.Wifi.WpsInfo.Display' in the contract but not the implementation.
+CannotRemoveAttribute : Attribute 'System.ObsoleteAttribute' exists on 'System.Int32 Android.Net.Wifi.WpsInfo.Invalid' in the contract but not the implementation.
+CannotRemoveAttribute : Attribute 'System.ObsoleteAttribute' exists on 'System.Int32 Android.Net.Wifi.WpsInfo.Keypad' in the contract but not the implementation.
+CannotRemoveAttribute : Attribute 'System.ObsoleteAttribute' exists on 'System.Int32 Android.Net.Wifi.WpsInfo.Label' in the contract but not the implementation.
+CannotRemoveAttribute : Attribute 'System.ObsoleteAttribute' exists on 'System.Int32 Android.Net.Wifi.WpsInfo.Pbc' in the contract but not the implementation.
+CannotRemoveAttribute : Attribute 'System.ObsoleteAttribute' exists on 'Android.Net.Wifi.WpsInfo..ctor()' in the contract but not the implementation.
+CannotRemoveAttribute : Attribute 'System.ObsoleteAttribute' exists on 'Android.Net.Wifi.WpsInfo..ctor(Android.Net.Wifi.WpsInfo)' in the contract but not the implementation.
+CannotRemoveAttribute : Attribute 'System.ObsoleteAttribute' exists on 'Android.Net.Wifi.WpsInfo.DescribeContents()' in the contract but not the implementation.
+CannotRemoveAttribute : Attribute 'System.ObsoleteAttribute' exists on 'Android.Net.Wifi.WpsInfo.WriteToParcel(Android.OS.Parcel, Android.OS.ParcelableWriteFlags)' in the contract but not the implementation.
+CannotChangeAttribute : Attribute 'Android.Runtime.RegisterAttribute' on 'Android.Text.SpannableStringInternal.CharAt(System.Int32)' changed from '[RegisterAttribute("charAt", "(I)C", "")]' in the contract to '[RegisterAttribute("charAt", "(I)C", "GetCharAt_IHandler")]' in the implementation.
+CannotMakeMemberAbstract : Member 'Android.Text.SpannableStringInternal.CharAt(System.Int32)' is abstract in the implementation but is not abstract in the contract.
+CannotChangeAttribute : Attribute 'Android.Runtime.RegisterAttribute' on 'Android.Text.SpannableStringInternal.GetChars(System.Int32, System.Int32, System.Char[], System.Int32)' changed from '[RegisterAttribute("getChars", "(II[CI)V", "")]' in the contract to '[RegisterAttribute("getChars", "(II[CI)V", "GetGetChars_IIarrayCIHandler")]' in the implementation.
+CannotMakeMemberAbstract : Member 'Android.Text.SpannableStringInternal.GetChars(System.Int32, System.Int32, System.Char[], System.Int32)' is abstract in the implementation but is not abstract in the contract.
+CannotChangeAttribute : Attribute 'Android.Runtime.RegisterAttribute' on 'Android.Text.SpannableStringInternal.Length()' changed from '[RegisterAttribute("length", "()I", "")]' in the contract to '[RegisterAttribute("length", "()I", "GetLengthHandler")]' in the implementation.
+CannotMakeMemberAbstract : Member 'Android.Text.SpannableStringInternal.Length()' is abstract in the implementation but is not abstract in the contract.
+CannotChangeAttribute : Attribute 'Android.Runtime.RegisterAttribute' on 'Android.Text.SpannableStringInternal.ToString()' changed from '[RegisterAttribute("toString", "()Ljava/lang/String;", "")]' in the contract to '[RegisterAttribute("toString", "()Ljava/lang/String;", "GetToStringHandler")]' in the implementation.
+CannotMakeMemberAbstract : Member 'Android.Text.SpannableStringInternal.ToString()' is abstract in the implementation but is not abstract in the contract.
+CannotChangeAttribute : Attribute 'Android.Runtime.RegisterAttribute' on 'Java.Lang.StringBuffer.Append(Java.Lang.ICharSequence)' changed from '[RegisterAttribute("append", "(Ljava/lang/CharSequence;)Ljava/lang/Appendable;", "")]' in the contract to '[RegisterAttribute("append", "(Ljava/lang/CharSequence;)Ljava/lang/StringBuffer;", "")]' in the implementation.
+CannotChangeAttribute : Attribute 'Android.Runtime.RegisterAttribute' on 'Java.Lang.StringBuffer.Append(Java.Lang.ICharSequence, System.Int32, System.Int32)' changed from '[RegisterAttribute("append", "(Ljava/lang/CharSequence;II)Ljava/lang/Appendable;", "")]' in the contract to '[RegisterAttribute("append", "(Ljava/lang/CharSequence;II)Ljava/lang/StringBuffer;", "")]' in the implementation.
+CannotChangeAttribute : Attribute 'Android.Runtime.RegisterAttribute' on 'Java.Lang.StringBuffer.Append(System.Char)' changed from '[RegisterAttribute("append", "(C)Ljava/lang/Appendable;", "")]' in the contract to '[RegisterAttribute("append", "(C)Ljava/lang/StringBuffer;", "")]' in the implementation.
+CannotChangeAttribute : Attribute 'Android.Runtime.RegisterAttribute' on 'Java.Lang.StringBuilder.Append(Java.Lang.ICharSequence)' changed from '[RegisterAttribute("append", "(Ljava/lang/CharSequence;)Ljava/lang/Appendable;", "")]' in the contract to '[RegisterAttribute("append", "(Ljava/lang/CharSequence;)Ljava/lang/StringBuilder;", "")]' in the implementation.
+CannotChangeAttribute : Attribute 'Android.Runtime.RegisterAttribute' on 'Java.Lang.StringBuilder.Append(Java.Lang.ICharSequence, System.Int32, System.Int32)' changed from '[RegisterAttribute("append", "(Ljava/lang/CharSequence;II)Ljava/lang/Appendable;", "")]' in the contract to '[RegisterAttribute("append", "(Ljava/lang/CharSequence;II)Ljava/lang/StringBuilder;", "")]' in the implementation.
+CannotChangeAttribute : Attribute 'Android.Runtime.RegisterAttribute' on 'Java.Lang.StringBuilder.Append(System.Char)' changed from '[RegisterAttribute("append", "(C)Ljava/lang/Appendable;", "")]' in the contract to '[RegisterAttribute("append", "(C)Ljava/lang/StringBuilder;", "")]' in the implementation.
+CannotChangeAttribute : Attribute 'Android.Runtime.RegisterAttribute' on 'Java.Nio.Buffer.Clear()' changed from '[RegisterAttribute("clear", "()Ljava/nio/Buffer;", "")]' in the contract to '[RegisterAttribute("clear", "()Ljava/nio/Buffer;", "GetClearHandler")]' in the implementation.
+CannotChangeAttribute : Attribute 'Android.Runtime.RegisterAttribute' on 'Java.Nio.Buffer.Flip()' changed from '[RegisterAttribute("flip", "()Ljava/nio/Buffer;", "")]' in the contract to '[RegisterAttribute("flip", "()Ljava/nio/Buffer;", "GetFlipHandler")]' in the implementation.
+CannotChangeAttribute : Attribute 'Android.Runtime.RegisterAttribute' on 'Java.Nio.Buffer.Limit(System.Int32)' changed from '[RegisterAttribute("limit", "(I)Ljava/nio/Buffer;", "")]' in the contract to '[RegisterAttribute("limit", "(I)Ljava/nio/Buffer;", "GetLimit_IHandler")]' in the implementation.
+CannotChangeAttribute : Attribute 'Android.Runtime.RegisterAttribute' on 'Java.Nio.Buffer.Mark()' changed from '[RegisterAttribute("mark", "()Ljava/nio/Buffer;", "")]' in the contract to '[RegisterAttribute("mark", "()Ljava/nio/Buffer;", "GetMarkHandler")]' in the implementation.
+CannotChangeAttribute : Attribute 'Android.Runtime.RegisterAttribute' on 'Java.Nio.Buffer.Position(System.Int32)' changed from '[RegisterAttribute("position", "(I)Ljava/nio/Buffer;", "")]' in the contract to '[RegisterAttribute("position", "(I)Ljava/nio/Buffer;", "GetPosition_IHandler")]' in the implementation.
+CannotChangeAttribute : Attribute 'Android.Runtime.RegisterAttribute' on 'Java.Nio.Buffer.Reset()' changed from '[RegisterAttribute("reset", "()Ljava/nio/Buffer;", "")]' in the contract to '[RegisterAttribute("reset", "()Ljava/nio/Buffer;", "GetResetHandler")]' in the implementation.
+CannotChangeAttribute : Attribute 'Android.Runtime.RegisterAttribute' on 'Java.Nio.Buffer.Rewind()' changed from '[RegisterAttribute("rewind", "()Ljava/nio/Buffer;", "")]' in the contract to '[RegisterAttribute("rewind", "()Ljava/nio/Buffer;", "GetRewindHandler")]' in the implementation.
+CannotRemoveBaseTypeOrInterface : Type 'Java.Util.Concurrent.Atomic.DoubleAccumulator' does not inherit from base type 'Java.Util.Concurrent.Atomic.Striped64' in the implementation but it does in the contract.
+CannotRemoveBaseTypeOrInterface : Type 'Java.Util.Concurrent.Atomic.DoubleAdder' does not inherit from base type 'Java.Util.Concurrent.Atomic.Striped64' in the implementation but it does in the contract.
+CannotRemoveBaseTypeOrInterface : Type 'Java.Util.Concurrent.Atomic.LongAccumulator' does not inherit from base type 'Java.Util.Concurrent.Atomic.Striped64' in the implementation but it does in the contract.
+CannotRemoveBaseTypeOrInterface : Type 'Java.Util.Concurrent.Atomic.LongAdder' does not inherit from base type 'Java.Util.Concurrent.Atomic.Striped64' in the implementation but it does in the contract.
\ No newline at end of file
diff --git a/tests/api-compatibility/acceptable-breakages-v4.4.87.txt b/tests/api-compatibility/acceptable-breakages-v4.4.87.txt
new file mode 100644
index 00000000000..4e3a56f7a80
--- /dev/null
+++ b/tests/api-compatibility/acceptable-breakages-v4.4.87.txt
@@ -0,0 +1,5 @@
+Compat issues with assembly Mono.Android:
+CannotAddAbstractMembers : Member 'Android.Content.PM.PackageManager.GetActivityBanner(Android.Content.ComponentName)' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Android.Content.PM.PackageManager.GetActivityBanner(Android.Content.Intent)' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Android.Content.PM.PackageManager.GetApplicationBanner(Android.Content.PM.ApplicationInfo)' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Android.Content.PM.PackageManager.GetApplicationBanner(System.String)' is abstract in the implementation but is missing in the contract.
\ No newline at end of file
diff --git a/tests/api-compatibility/acceptable-breakages-v5.0.txt b/tests/api-compatibility/acceptable-breakages-v5.0.txt
new file mode 100644
index 00000000000..6c7bbb82a8f
--- /dev/null
+++ b/tests/api-compatibility/acceptable-breakages-v5.0.txt
@@ -0,0 +1,38 @@
+Compat issues with assembly Mono.Android:
+CannotAddAbstractMembers : Member 'Android.App.FragmentTransaction.AddSharedElement(Android.Views.View, System.String)' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Android.Content.Context.CodeCacheDir' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Android.Content.Context.NoBackupFilesDir' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Android.Content.Context.CodeCacheDir.get()' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Android.Content.Context.GetExternalMediaDirs()' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Android.Content.Context.NoBackupFilesDir.get()' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Android.Content.PM.PackageManager.PackageInstaller' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Android.Content.PM.PackageManager.GetLeanbackLaunchIntentForPackage(System.String)' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Android.Content.PM.PackageManager.GetUserBadgedDrawableForDensity(Android.Graphics.Drawables.Drawable, Android.OS.UserHandle, Android.Graphics.Rect, System.Int32)' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Android.Content.PM.PackageManager.GetUserBadgedIcon(Android.Graphics.Drawables.Drawable, Android.OS.UserHandle)' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Android.Content.PM.PackageManager.GetUserBadgedLabelFormatted(Java.Lang.ICharSequence, Android.OS.UserHandle)' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Android.Content.PM.PackageManager.PackageInstaller.get()' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Android.InputMethodServices.AbstractInputMethodService.AbstractInputMethodSessionImpl.UpdateCursorAnchorInfo(Android.Views.InputMethods.CursorAnchorInfo)' is abstract in the implementation but is missing in the contract.
+CannotRemoveAttribute : Attribute 'System.ObsoleteAttribute' exists on 'System.String Android.Provider.Settings.Secure.InstallNonMarketApps' in the contract but not the implementation.
+InterfacesShouldHaveSameMembers : Interface member 'Android.Speech.Tts.ISynthesisCallback.HasFinished' is present in the implementation but not in the contract.
+InterfacesShouldHaveSameMembers : Interface member 'Android.Speech.Tts.ISynthesisCallback.HasStarted' is present in the implementation but not in the contract.
+InterfacesShouldHaveSameMembers : Interface member 'Android.Speech.Tts.ISynthesisCallback.Error(Android.Speech.Tts.TextToSpeechError)' is present in the implementation but not in the contract.
+InterfacesShouldHaveSameMembers : Interface member 'Android.Speech.Tts.ISynthesisCallback.HasFinished.get()' is present in the implementation but not in the contract.
+InterfacesShouldHaveSameMembers : Interface member 'Android.Speech.Tts.ISynthesisCallback.HasStarted.get()' is present in the implementation but not in the contract.
+InterfacesShouldHaveSameMembers : Interface member 'Android.Views.IViewParent.OnNestedFling(Android.Views.View, System.Single, System.Single, System.Boolean)' is present in the implementation but not in the contract.
+InterfacesShouldHaveSameMembers : Interface member 'Android.Views.IViewParent.OnNestedPreFling(Android.Views.View, System.Single, System.Single)' is present in the implementation but not in the contract.
+InterfacesShouldHaveSameMembers : Interface member 'Android.Views.IViewParent.OnNestedPreScroll(Android.Views.View, System.Int32, System.Int32, System.Int32[])' is present in the implementation but not in the contract.
+InterfacesShouldHaveSameMembers : Interface member 'Android.Views.IViewParent.OnNestedScroll(Android.Views.View, System.Int32, System.Int32, System.Int32, System.Int32)' is present in the implementation but not in the contract.
+InterfacesShouldHaveSameMembers : Interface member 'Android.Views.IViewParent.OnNestedScrollAccepted(Android.Views.View, Android.Views.View, Android.Views.ScrollAxis)' is present in the implementation but not in the contract.
+InterfacesShouldHaveSameMembers : Interface member 'Android.Views.IViewParent.OnStartNestedScroll(Android.Views.View, Android.Views.View, Android.Views.ScrollAxis)' is present in the implementation but not in the contract.
+InterfacesShouldHaveSameMembers : Interface member 'Android.Views.IViewParent.OnStopNestedScroll(Android.Views.View)' is present in the implementation but not in the contract.
+CannotAddAbstractMembers : Member 'Android.Views.Window.NavigationBarColor' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Android.Views.Window.StatusBarColor' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Android.Views.Window.NavigationBarColor.get()' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Android.Views.Window.SetNavigationBarColor(Android.Graphics.Color)' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Android.Views.Window.SetStatusBarColor(Android.Graphics.Color)' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Android.Views.Window.StatusBarColor.get()' is abstract in the implementation but is missing in the contract.
+InterfacesShouldHaveSameMembers : Interface member 'Android.Views.InputMethods.IInputConnection.RequestCursorUpdates(System.Int32)' is present in the implementation but not in the contract.
+InterfacesShouldHaveSameMembers : Interface member 'Android.Views.InputMethods.IInputMethodSession.UpdateCursorAnchorInfo(Android.Views.InputMethods.CursorAnchorInfo)' is present in the implementation but not in the contract.
+CannotAddAbstractMembers : Member 'Android.Webkit.WebSettings.MixedContentMode' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Android.Webkit.WebSettings.MixedContentMode.get()' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Android.Webkit.WebSettings.MixedContentMode.set(Android.Webkit.MixedContentHandling)' is abstract in the implementation but is missing in the contract.
\ No newline at end of file
diff --git a/tests/api-compatibility/acceptable-breakages-v5.1.txt b/tests/api-compatibility/acceptable-breakages-v5.1.txt
new file mode 100644
index 00000000000..7ab1c33ead2
--- /dev/null
+++ b/tests/api-compatibility/acceptable-breakages-v5.1.txt
@@ -0,0 +1,185 @@
+Compat issues with assembly Mono.Android:
+InterfacesShouldHaveSameMembers : Interface member 'Android.Views.IViewParent.OnNestedPrePerformAccessibilityAction(Android.Views.View, Android.Views.Accessibility.Action, Android.OS.Bundle)' is present in the implementation but not in the contract.
+CannotMakeTypeAbstract : Type 'Android.Webkit.CookieManager' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.CookieManager.HasCookies' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.CookieManager.AcceptCookie()' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.CookieManager.AcceptThirdPartyCookies(Android.Webkit.WebView)' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.CookieManager.Flush()' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.CookieManager.GetCookie(System.String)' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.CookieManager.HasCookies.get()' is abstract in the implementation but is not abstract in the contract.
+CannotRemoveAttribute : Attribute 'System.ObsoleteAttribute' exists on 'Android.Webkit.CookieManager.RemoveAllCookie()' in the contract but not the implementation.
+CannotMakeMemberAbstract : Member 'Android.Webkit.CookieManager.RemoveAllCookie()' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.CookieManager.RemoveAllCookies(Android.Webkit.IValueCallback)' is abstract in the implementation but is not abstract in the contract.
+CannotRemoveAttribute : Attribute 'System.ObsoleteAttribute' exists on 'Android.Webkit.CookieManager.RemoveExpiredCookie()' in the contract but not the implementation.
+CannotMakeMemberAbstract : Member 'Android.Webkit.CookieManager.RemoveExpiredCookie()' is abstract in the implementation but is not abstract in the contract.
+CannotRemoveAttribute : Attribute 'System.ObsoleteAttribute' exists on 'Android.Webkit.CookieManager.RemoveSessionCookie()' in the contract but not the implementation.
+CannotMakeMemberAbstract : Member 'Android.Webkit.CookieManager.RemoveSessionCookie()' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.CookieManager.RemoveSessionCookies(Android.Webkit.IValueCallback)' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.CookieManager.SetAcceptCookie(System.Boolean)' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.CookieManager.SetAcceptThirdPartyCookies(Android.Webkit.WebView, System.Boolean)' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.CookieManager.SetCookie(System.String, System.String)' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.CookieManager.SetCookie(System.String, System.String, Android.Webkit.IValueCallback)' is abstract in the implementation but is not abstract in the contract.
+CannotMakeTypeAbstract : Type 'Android.Webkit.WebBackForwardList' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebBackForwardList.CurrentIndex' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebBackForwardList.CurrentItem' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebBackForwardList.Size' is abstract in the implementation but is not abstract in the contract.
+CannotAddAbstractMembers : Member 'Android.Webkit.WebBackForwardList.Clone()' is abstract in the implementation but is missing in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebBackForwardList.CurrentIndex.get()' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebBackForwardList.CurrentItem.get()' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebBackForwardList.GetItemAtIndex(System.Int32)' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebBackForwardList.Size.get()' is abstract in the implementation but is not abstract in the contract.
+CannotMakeTypeAbstract : Type 'Android.Webkit.WebHistoryItem' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebHistoryItem.Favicon' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebHistoryItem.OriginalUrl' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebHistoryItem.Title' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebHistoryItem.Url' is abstract in the implementation but is not abstract in the contract.
+CannotAddAbstractMembers : Member 'Android.Webkit.WebHistoryItem.Clone()' is abstract in the implementation but is missing in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebHistoryItem.Favicon.get()' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebHistoryItem.OriginalUrl.get()' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebHistoryItem.Title.get()' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebHistoryItem.Url.get()' is abstract in the implementation but is not abstract in the contract.
+CannotMakeTypeAbstract : Type 'Android.Webkit.WebIconDatabase' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebIconDatabase.Close()' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebIconDatabase.Open(System.String)' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebIconDatabase.ReleaseIconForPageUrl(System.String)' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebIconDatabase.RemoveAllIcons()' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebIconDatabase.RequestIconForPageUrl(System.String, Android.Webkit.WebIconDatabase.IIconListener)' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebIconDatabase.RetainIconForPageUrl(System.String)' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.AllowContentAccess' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.AllowFileAccess' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.BlockNetworkImage' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.BlockNetworkLoads' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.BuiltInZoomControls' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.CacheMode' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.CursiveFontFamily' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.DatabaseEnabled' is abstract in the implementation but is not abstract in the contract.
+CannotRemoveAttribute : Attribute 'System.ObsoleteAttribute' exists on 'Android.Webkit.WebSettings.DatabasePath' in the contract but not the implementation.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.DatabasePath' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.DefaultFixedFontSize' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.DefaultFontSize' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.DefaultTextEncodingName' is abstract in the implementation but is not abstract in the contract.
+CannotRemoveAttribute : Attribute 'System.ObsoleteAttribute' exists on 'Android.Webkit.WebSettings.DefaultZoom' in the contract but not the implementation.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.DefaultZoom' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.DisplayZoomControls' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.DomStorageEnabled' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.FantasyFontFamily' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.FixedFontFamily' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.JavaScriptCanOpenWindowsAutomatically' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.JavaScriptEnabled' is abstract in the implementation but is not abstract in the contract.
+CannotRemoveAttribute : Attribute 'System.ObsoleteAttribute' exists on 'Android.Webkit.WebSettings.LightTouchEnabled' in the contract but not the implementation.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.LightTouchEnabled' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.LoadsImagesAutomatically' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.LoadWithOverviewMode' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.MediaPlaybackRequiresUserGesture' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.MinimumFontSize' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.MinimumLogicalFontSize' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.SansSerifFontFamily' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.SaveFormData' is abstract in the implementation but is not abstract in the contract.
+CannotRemoveAttribute : Attribute 'System.ObsoleteAttribute' exists on 'Android.Webkit.WebSettings.SavePassword' in the contract but not the implementation.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.SavePassword' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.SerifFontFamily' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.StandardFontFamily' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.TextZoom' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.UserAgentString' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.UseWideViewPort' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.AllowContentAccess.get()' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.AllowContentAccess.set(System.Boolean)' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.AllowFileAccess.get()' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.AllowFileAccess.set(System.Boolean)' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.BlockNetworkImage.get()' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.BlockNetworkImage.set(System.Boolean)' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.BlockNetworkLoads.get()' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.BlockNetworkLoads.set(System.Boolean)' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.BuiltInZoomControls.get()' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.BuiltInZoomControls.set(System.Boolean)' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.CacheMode.get()' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.CacheMode.set(Android.Webkit.CacheModes)' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.CursiveFontFamily.get()' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.CursiveFontFamily.set(System.String)' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.DatabaseEnabled.get()' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.DatabaseEnabled.set(System.Boolean)' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.DatabasePath.get()' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.DatabasePath.set(System.String)' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.DefaultFixedFontSize.get()' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.DefaultFixedFontSize.set(System.Int32)' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.DefaultFontSize.get()' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.DefaultFontSize.set(System.Int32)' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.DefaultTextEncodingName.get()' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.DefaultTextEncodingName.set(System.String)' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.DefaultZoom.get()' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.DefaultZoom.set(Android.Webkit.WebSettings.ZoomDensity)' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.DisplayZoomControls.get()' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.DisplayZoomControls.set(System.Boolean)' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.DomStorageEnabled.get()' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.DomStorageEnabled.set(System.Boolean)' is abstract in the implementation but is not abstract in the contract.
+CannotRemoveAttribute : Attribute 'System.ObsoleteAttribute' exists on 'Android.Webkit.WebSettings.EnableSmoothTransition()' in the contract but not the implementation.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.EnableSmoothTransition()' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.FantasyFontFamily.get()' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.FantasyFontFamily.set(System.String)' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.FixedFontFamily.get()' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.FixedFontFamily.set(System.String)' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.GetLayoutAlgorithm()' is abstract in the implementation but is not abstract in the contract.
+CannotRemoveAttribute : Attribute 'System.ObsoleteAttribute' exists on 'Android.Webkit.WebSettings.GetPluginState()' in the contract but not the implementation.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.GetPluginState()' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.JavaScriptCanOpenWindowsAutomatically.get()' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.JavaScriptCanOpenWindowsAutomatically.set(System.Boolean)' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.JavaScriptEnabled.get()' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.JavaScriptEnabled.set(System.Boolean)' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.LightTouchEnabled.get()' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.LightTouchEnabled.set(System.Boolean)' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.LoadsImagesAutomatically.get()' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.LoadsImagesAutomatically.set(System.Boolean)' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.LoadWithOverviewMode.get()' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.LoadWithOverviewMode.set(System.Boolean)' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.MediaPlaybackRequiresUserGesture.get()' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.MediaPlaybackRequiresUserGesture.set(System.Boolean)' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.MinimumFontSize.get()' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.MinimumFontSize.set(System.Int32)' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.MinimumLogicalFontSize.get()' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.MinimumLogicalFontSize.set(System.Int32)' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.SansSerifFontFamily.get()' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.SansSerifFontFamily.set(System.String)' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.SaveFormData.get()' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.SaveFormData.set(System.Boolean)' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.SavePassword.get()' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.SavePassword.set(System.Boolean)' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.SerifFontFamily.get()' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.SerifFontFamily.set(System.String)' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.SetAppCacheEnabled(System.Boolean)' is abstract in the implementation but is not abstract in the contract.
+CannotRemoveAttribute : Attribute 'System.ObsoleteAttribute' exists on 'Android.Webkit.WebSettings.SetAppCacheMaxSize(System.Int64)' in the contract but not the implementation.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.SetAppCacheMaxSize(System.Int64)' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.SetAppCachePath(System.String)' is abstract in the implementation but is not abstract in the contract.
+CannotRemoveAttribute : Attribute 'System.ObsoleteAttribute' exists on 'Android.Webkit.WebSettings.SetEnableSmoothTransition(System.Boolean)' in the contract but not the implementation.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.SetEnableSmoothTransition(System.Boolean)' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.SetGeolocationDatabasePath(System.String)' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.SetGeolocationEnabled(System.Boolean)' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.SetLayoutAlgorithm(Android.Webkit.WebSettings.LayoutAlgorithm)' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.SetNeedInitialFocus(System.Boolean)' is abstract in the implementation but is not abstract in the contract.
+CannotRemoveAttribute : Attribute 'System.ObsoleteAttribute' exists on 'Android.Webkit.WebSettings.SetPluginState(Android.Webkit.WebSettings.PluginState)' in the contract but not the implementation.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.SetPluginState(Android.Webkit.WebSettings.PluginState)' is abstract in the implementation but is not abstract in the contract.
+CannotRemoveAttribute : Attribute 'System.ObsoleteAttribute' exists on 'Android.Webkit.WebSettings.SetRenderPriority(Android.Webkit.WebSettings.RenderPriority)' in the contract but not the implementation.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.SetRenderPriority(Android.Webkit.WebSettings.RenderPriority)' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.SetSupportMultipleWindows(System.Boolean)' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.SetSupportZoom(System.Boolean)' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.StandardFontFamily.get()' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.StandardFontFamily.set(System.String)' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.SupportMultipleWindows()' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.SupportZoom()' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.TextZoom.get()' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.TextZoom.set(System.Int32)' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.UserAgentString.get()' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.UserAgentString.set(System.String)' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.UseWideViewPort.get()' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebSettings.UseWideViewPort.set(System.Boolean)' is abstract in the implementation but is not abstract in the contract.
+CannotMakeTypeAbstract : Type 'Android.Webkit.WebViewDatabase' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebViewDatabase.HasFormData' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebViewDatabase.HasHttpAuthUsernamePassword' is abstract in the implementation but is not abstract in the contract.
+CannotRemoveAttribute : Attribute 'System.ObsoleteAttribute' exists on 'Android.Webkit.WebViewDatabase.HasUsernamePassword' in the contract but not the implementation.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebViewDatabase.HasUsernamePassword' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebViewDatabase.ClearFormData()' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebViewDatabase.ClearHttpAuthUsernamePassword()' is abstract in the implementation but is not abstract in the contract.
+CannotRemoveAttribute : Attribute 'System.ObsoleteAttribute' exists on 'Android.Webkit.WebViewDatabase.ClearUsernamePassword()' in the contract but not the implementation.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebViewDatabase.ClearUsernamePassword()' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebViewDatabase.HasFormData.get()' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebViewDatabase.HasHttpAuthUsernamePassword.get()' is abstract in the implementation but is not abstract in the contract.
+CannotMakeMemberAbstract : Member 'Android.Webkit.WebViewDatabase.HasUsernamePassword.get()' is abstract in the implementation but is not abstract in the contract.
\ No newline at end of file
diff --git a/tests/api-compatibility/acceptable-breakages-v6.0.txt b/tests/api-compatibility/acceptable-breakages-v6.0.txt
new file mode 100644
index 00000000000..694d885cea9
--- /dev/null
+++ b/tests/api-compatibility/acceptable-breakages-v6.0.txt
@@ -0,0 +1,23 @@
+Compat issues with assembly Mono.Android:
+CannotRemoveAttribute : Attribute 'Android.Runtime.RegisterAttribute' exists on 'Android.App.Notification.Action.Icon' in the contract but not the implementation.
+MembersMustExist : Member 'Android.App.Notification.Action.Icon.get()' does not exist in the implementation but it does exist in the contract.
+MembersMustExist : Member 'Android.App.Notification.Action.Icon.set(System.Int32)' does not exist in the implementation but it does exist in the contract.
+CannotAddAbstractMembers : Member 'Android.Content.Context.CheckSelfPermission(System.String)' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Android.Content.Context.GetSystemServiceName(Java.Lang.Class)' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Android.Content.PM.PackageManager.IsPermissionRevokedByPolicy(System.String, System.String)' is abstract in the implementation but is missing in the contract.
+InterfacesShouldHaveSameMembers : Interface member 'Android.Database.ICursor.Extras.set(Android.OS.Bundle)' is present in the implementation but not in the contract.
+CannotAddAbstractMembers : Member 'Android.Hardware.Camera2.CameraCaptureSession.InputSurface' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Android.Hardware.Camera2.CameraCaptureSession.IsReprocessable' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Android.Hardware.Camera2.CameraCaptureSession.InputSurface.get()' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Android.Hardware.Camera2.CameraCaptureSession.IsReprocessable.get()' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Android.Hardware.Camera2.CameraCaptureSession.Prepare(Android.Views.Surface)' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Android.Hardware.Camera2.CameraDevice.CreateConstrainedHighSpeedCaptureSession(System.Collections.Generic.IList, Android.Hardware.Camera2.CameraCaptureSession.StateCallback, Android.OS.Handler)' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Android.Hardware.Camera2.CameraDevice.CreateReprocessableCaptureSession(Android.Hardware.Camera2.Params.InputConfiguration, System.Collections.Generic.IList, Android.Hardware.Camera2.CameraCaptureSession.StateCallback, Android.OS.Handler)' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Android.Hardware.Camera2.CameraDevice.CreateReprocessCaptureRequest(Android.Hardware.Camera2.TotalCaptureResult)' is abstract in the implementation but is missing in the contract.
+CannotRemoveAttribute : Attribute 'System.ObsoleteAttribute' exists on 'Android.Net.ProxyInfo' in the contract but not the implementation.
+InterfacesShouldHaveSameMembers : Interface member 'Android.Views.IViewParent.StartActionModeForChild(Android.Views.View, Android.Views.ActionMode.ICallback, Android.Views.ActionModeType)' is present in the implementation but not in the contract.
+InterfacesShouldHaveSameMembers : Interface member 'Android.Views.Window.ICallback.OnSearchRequested(Android.Views.SearchEvent)' is present in the implementation but not in the contract.
+InterfacesShouldHaveSameMembers : Interface member 'Android.Views.Window.ICallback.OnWindowStartingActionMode(Android.Views.ActionMode.ICallback, Android.Views.ActionModeType)' is present in the implementation but not in the contract.
+CannotAddAbstractMembers : Member 'Android.Webkit.WebSettings.OffscreenPreRaster' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Android.Webkit.WebSettings.OffscreenPreRaster.get()' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Android.Webkit.WebSettings.OffscreenPreRaster.set(System.Boolean)' is abstract in the implementation but is missing in the contract.
\ No newline at end of file
diff --git a/tests/api-compatibility/acceptable-breakages-v7.0.txt b/tests/api-compatibility/acceptable-breakages-v7.0.txt
new file mode 100644
index 00000000000..ebbc05af683
--- /dev/null
+++ b/tests/api-compatibility/acceptable-breakages-v7.0.txt
@@ -0,0 +1,50 @@
+Compat issues with assembly Mono.Android:
+CannotRemoveAttribute : Attribute 'System.ObsoleteAttribute' exists on 'Android.App.Activity.LastNonConfigurationInstance' in the contract but not the implementation.
+CannotRemoveAttribute : Attribute 'System.ObsoleteAttribute' exists on 'Android.App.Activity.OnRetainNonConfigurationInstance()' in the contract but not the implementation.
+CannotAddAbstractMembers : Member 'Android.App.FragmentTransaction.CommitNow()' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Android.App.FragmentTransaction.CommitNowAllowingStateLoss()' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Android.App.Job.JobScheduler.GetPendingJob(System.Int32)' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Android.Content.Context.DataDir' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Android.Content.Context.IsDeviceProtectedStorage' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Android.Content.Context.CreateDeviceProtectedStorageContext()' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Android.Content.Context.DataDir.get()' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Android.Content.Context.DeleteSharedPreferences(System.String)' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Android.Content.Context.IsDeviceProtectedStorage.get()' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Android.Content.Context.MoveDatabaseFrom(Android.Content.Context, System.String)' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Android.Content.Context.MoveSharedPreferencesFrom(Android.Content.Context, System.String)' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Android.Content.PM.PackageManager.GetPackageGids(System.String, Android.Content.PM.PackageInfoFlags)' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Android.Content.PM.PackageManager.GetPackageUid(System.String, Android.Content.PM.PackageInfoFlags)' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Android.Content.PM.PackageManager.HasSystemFeature(System.String, System.Int32)' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Android.Hardware.Camera2.CameraDevice.CreateCaptureSessionByOutputConfigurations(System.Collections.Generic.IList, Android.Hardware.Camera2.CameraCaptureSession.StateCallback, Android.OS.Handler)' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Android.Hardware.Camera2.CameraDevice.CreateReprocessableCaptureSessionByConfigurations(Android.Hardware.Camera2.Params.InputConfiguration, System.Collections.Generic.IList, Android.Hardware.Camera2.CameraCaptureSession.StateCallback, Android.OS.Handler)' is abstract in the implementation but is missing in the contract.
+InterfacesShouldHaveSameMembers : Interface member 'Android.Views.IViewParent.ShowContextMenuForChild(Android.Views.View, System.Single, System.Single)' is present in the implementation but not in the contract.
+CannotAddAbstractMembers : Member 'Android.Views.Window.SetDecorCaptionShade(Android.Views.DecorCaptionShade)' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Android.Views.Window.SetResizingCaptionDrawable(Android.Graphics.Drawables.Drawable)' is abstract in the implementation but is missing in the contract.
+InterfacesShouldHaveSameMembers : Interface member 'Android.Views.InputMethods.IInputConnection.Handler' is present in the implementation but not in the contract.
+InterfacesShouldHaveSameMembers : Interface member 'Android.Views.InputMethods.IInputConnection.CloseConnection()' is present in the implementation but not in the contract.
+InterfacesShouldHaveSameMembers : Interface member 'Android.Views.InputMethods.IInputConnection.DeleteSurroundingTextInCodePoints(System.Int32, System.Int32)' is present in the implementation but not in the contract.
+InterfacesShouldHaveSameMembers : Interface member 'Android.Views.InputMethods.IInputConnection.Handler.get()' is present in the implementation but not in the contract.
+InterfacesShouldHaveSameMembers : Interface member 'Android.Webkit.IWebResourceRequest.IsRedirect' is present in the implementation but not in the contract.
+InterfacesShouldHaveSameMembers : Interface member 'Android.Webkit.IWebResourceRequest.IsRedirect.get()' is present in the implementation but not in the contract.
+CannotAddAbstractMembers : Member 'Android.Webkit.WebSettings.DisabledActionModeMenuItems' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Android.Webkit.WebSettings.DisabledActionModeMenuItems.get()' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Android.Webkit.WebSettings.DisabledActionModeMenuItems.set(Android.Webkit.MenuItems)' is abstract in the implementation but is missing in the contract.
+CannotRemoveAttribute : Attribute 'System.ObsoleteAttribute' exists on 'Android.Webkit.WebViewClient.OnUnhandledKeyEvent(Android.Webkit.WebView, Android.Views.KeyEvent)' in the contract but not the implementation.
+CannotAddAbstractMembers : Member 'Java.Nio.Channels.DatagramChannel.RemoteAddress' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Java.Nio.Channels.DatagramChannel.Bind(Java.Net.SocketAddress)' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Java.Nio.Channels.DatagramChannel.RemoteAddress.get()' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Java.Nio.Channels.DatagramChannel.SetOption(Java.Net.ISocketOption, Java.Lang.Object)' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Java.Nio.Channels.ServerSocketChannel.Bind(Java.Net.SocketAddress, System.Int32)' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Java.Nio.Channels.ServerSocketChannel.SetOption(Java.Net.ISocketOption, Java.Lang.Object)' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Java.Nio.Channels.SocketChannel.RemoteAddress' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Java.Nio.Channels.SocketChannel.Bind(Java.Net.SocketAddress)' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Java.Nio.Channels.SocketChannel.RemoteAddress.get()' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Java.Nio.Channels.SocketChannel.SetOption(Java.Net.ISocketOption, Java.Lang.Object)' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Java.Nio.Channels.SocketChannel.ShutdownInput()' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Java.Nio.Channels.SocketChannel.ShutdownOutput()' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Java.Nio.Channels.Spi.SelectorProvider.OpenDatagramChannel(Java.Net.IProtocolFamily)' is abstract in the implementation but is missing in the contract.
+InterfacesShouldHaveSameMembers : Interface member 'Java.Util.ISortedMap.EntrySet()' is present in the implementation but not in the contract.
+InterfacesShouldHaveSameMembers : Interface member 'Java.Util.ISortedMap.KeySet()' is present in the implementation but not in the contract.
+InterfacesShouldHaveSameMembers : Interface member 'Java.Util.ISortedMap.Values()' is present in the implementation but not in the contract.
+InterfacesShouldHaveSameMembers : Interface member 'Javax.Sql.ICommonDataSource.ParentLogger' is present in the implementation but not in the contract.
+InterfacesShouldHaveSameMembers : Interface member 'Javax.Sql.ICommonDataSource.ParentLogger.get()' is present in the implementation but not in the contract.
\ No newline at end of file
diff --git a/tests/api-compatibility/acceptable-breakages-v7.1.txt b/tests/api-compatibility/acceptable-breakages-v7.1.txt
new file mode 100644
index 00000000000..686515bb3a0
--- /dev/null
+++ b/tests/api-compatibility/acceptable-breakages-v7.1.txt
@@ -0,0 +1,5 @@
+Compat issues with assembly Mono.Android:
+CannotChangeAttribute : Attribute 'Android.Runtime.IntDefinitionAttribute' on 'Android.Telecom.ConnectionProperties Android.Telecom.ConnectionProperties.HasCdmaVoicePrivacy' changed from '[IntDefinitionAttribute(null, JniField="android/telecom/Connection.PROPERTY_HAS_CDMA_VOICE_PRIVACY")]' in the contract to '[IntDefinitionAttribute("Android.Telecom.Connection.PropertyHasCdmaVoicePrivacy", JniField="android/telecom/Connection.PROPERTY_HAS_CDMA_VOICE_PRIVACY")]' in the implementation.
+CannotChangeAttribute : Attribute 'Android.Runtime.IntDefinitionAttribute' on 'Android.Telecom.ConnectionProperties Android.Telecom.ConnectionProperties.IsExternalCall' changed from '[IntDefinitionAttribute(null, JniField="android/telecom/Connection.PROPERTY_IS_EXTERNAL_CALL")]' in the contract to '[IntDefinitionAttribute("Android.Telecom.Connection.PropertyIsExternalCall", JniField="android/telecom/Connection.PROPERTY_IS_EXTERNAL_CALL")]' in the implementation.
+MembersMustExist : Member 'Android.Telecom.RemoteConference.ConnectionProperties.get()' does not exist in the implementation but it does exist in the contract.
+InterfacesShouldHaveSameMembers : Interface member 'Android.Views.InputMethods.IInputConnection.CommitContent(Android.Views.InputMethods.InputContentInfo, Android.Views.InputMethods.InputContentFlags, Android.OS.Bundle)' is present in the implementation but not in the contract.
\ No newline at end of file
diff --git a/tests/api-compatibility/acceptable-breakages-v8.0.txt b/tests/api-compatibility/acceptable-breakages-v8.0.txt
new file mode 100644
index 00000000000..c94903bf747
--- /dev/null
+++ b/tests/api-compatibility/acceptable-breakages-v8.0.txt
@@ -0,0 +1,81 @@
+Compat issues with assembly Mono.Android:
+CannotAddAbstractMembers : Member 'Android.App.FragmentManager.Fragments' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Android.App.FragmentManager.IsStateSaved' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Android.App.FragmentManager.PrimaryNavigationFragment' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Android.App.FragmentManager.Fragments.get()' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Android.App.FragmentManager.IsStateSaved.get()' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Android.App.FragmentManager.PrimaryNavigationFragment.get()' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Android.App.FragmentManager.RegisterFragmentLifecycleCallbacks(Android.App.FragmentManager.FragmentLifecycleCallbacks, System.Boolean)' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Android.App.FragmentManager.UnregisterFragmentLifecycleCallbacks(Android.App.FragmentManager.FragmentLifecycleCallbacks)' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Android.App.FragmentTransaction.RunOnCommit(Java.Lang.IRunnable)' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Android.App.FragmentTransaction.SetPrimaryNavigationFragment(Android.App.Fragment)' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Android.App.FragmentTransaction.SetReorderingAllowed(System.Boolean)' is abstract in the implementation but is missing in the contract.
+CannotRemoveAttribute : Attribute 'System.ObsoleteAttribute' exists on 'Android.App.Notification.Builder.SetNumber(System.Int32)' in the contract but not the implementation.
+CannotAddAbstractMembers : Member 'Android.App.Job.JobScheduler.Enqueue(Android.App.Job.JobInfo, Android.App.Job.JobWorkItem)' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Android.Content.Context.CreateContextForSplit(System.String)' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Android.Content.Context.RegisterReceiver(Android.Content.BroadcastReceiver, Android.Content.IntentFilter, Android.Content.ActivityFlags)' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Android.Content.Context.RegisterReceiver(Android.Content.BroadcastReceiver, Android.Content.IntentFilter, System.String, Android.OS.Handler, Android.Content.ActivityFlags)' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Android.Content.Context.RevokeUriPermission(System.String, Android.Net.Uri, Android.Content.ActivityFlags)' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Android.Content.Context.StartForegroundService(Android.Content.Intent)' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Android.Content.PM.PackageManager.InstantAppCookieMaxBytes' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Android.Content.PM.PackageManager.IsInstantApp' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Android.Content.PM.PackageManager.CanRequestPackageInstalls()' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Android.Content.PM.PackageManager.ClearInstantAppCookie()' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Android.Content.PM.PackageManager.GetChangedPackages(System.Int32)' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Android.Content.PM.PackageManager.GetInstantAppCookie()' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Android.Content.PM.PackageManager.GetPackageInfo(Android.Content.PM.VersionedPackage, Android.Content.PM.PackageInfoFlags)' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Android.Content.PM.PackageManager.GetSharedLibraries(Android.Content.PM.PackageInstallReason)' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Android.Content.PM.PackageManager.InstantAppCookieMaxBytes.get()' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Android.Content.PM.PackageManager.InvokeIsInstantApp(System.String)' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Android.Content.PM.PackageManager.IsInstantApp.get()' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Android.Content.PM.PackageManager.SetApplicationCategoryHint(System.String, System.Int32)' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Android.Content.PM.PackageManager.UpdateInstantAppCookie(System.Byte[])' is abstract in the implementation but is missing in the contract.
+CannotRemoveAttribute : Attribute 'System.ObsoleteAttribute' exists on 'System.String Android.Hardware.Camera.ActionNewPicture' in the contract but not the implementation.
+CannotRemoveAttribute : Attribute 'System.ObsoleteAttribute' exists on 'System.String Android.Hardware.Camera.ActionNewVideo' in the contract but not the implementation.
+CannotAddAbstractMembers : Member 'Android.Hardware.Camera2.CameraCaptureSession.FinalizeOutputConfigurations(System.Collections.Generic.IList)' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Android.Icu.Text.LocaleDisplayNames.GetUiListCompareWholeItems(System.Collections.Generic.ICollection, Java.Util.IComparator)' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Android.OS.Vibrator.HasAmplitudeControl' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Android.OS.Vibrator.HasAmplitudeControl.get()' is abstract in the implementation but is missing in the contract.
+CannotChangeAttribute : Attribute 'Android.Runtime.IntDefinitionAttribute' on 'Android.Telecom.ConnectionProperties Android.Telecom.ConnectionProperties.SelfManaged' changed from '[IntDefinitionAttribute(null, JniField="android/telecom/Connection.PROPERTY_SELF_MANAGED")]' in the contract to '[IntDefinitionAttribute("Android.Telecom.Connection.PropertySelfManaged", JniField="android/telecom/Connection.PROPERTY_SELF_MANAGED")]' in the implementation.
+CannotRemoveAttribute : Attribute 'Android.Runtime.RegisterAttribute' exists on 'Android.Text.BidiFormatter.UnicodeWrap(System.String)' in the contract but not the implementation.
+CannotRemoveAttribute : Attribute 'Android.Runtime.RegisterAttribute' exists on 'Android.Text.BidiFormatter.UnicodeWrap(System.String, Android.Text.ITextDirectionHeuristic)' in the contract but not the implementation.
+CannotRemoveAttribute : Attribute 'Android.Runtime.RegisterAttribute' exists on 'Android.Text.BidiFormatter.UnicodeWrap(System.String, Android.Text.ITextDirectionHeuristic, System.Boolean)' in the contract but not the implementation.
+CannotRemoveAttribute : Attribute 'Android.Runtime.RegisterAttribute' exists on 'Android.Text.BidiFormatter.UnicodeWrap(System.String, System.Boolean)' in the contract but not the implementation.
+InterfacesShouldHaveSameMembers : Interface member 'Android.Views.IViewParent.KeyboardNavigationClusterSearch(Android.Views.View, Android.Views.FocusSearchDirection)' is present in the implementation but not in the contract.
+CannotAddAbstractMembers : Member 'Android.Views.ViewStructure.AutofillId' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Android.Views.ViewStructure.AutofillId.get()' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Android.Views.ViewStructure.AutofillId.set(Android.Views.Autofill.AutofillId)' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Android.Views.ViewStructure.NewHtmlInfoBuilder(System.String)' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Android.Views.ViewStructure.SetAutofillHints(System.String[])' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Android.Views.ViewStructure.SetAutofillId(Android.Views.Autofill.AutofillId, System.Int32)' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Android.Views.ViewStructure.SetAutofillOptions(Java.Lang.ICharSequence[])' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Android.Views.ViewStructure.SetAutofillType(Android.Views.AutofillType)' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Android.Views.ViewStructure.SetAutofillValue(Android.Views.Autofill.AutofillValue)' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Android.Views.ViewStructure.SetDataIsSensitive(System.Boolean)' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Android.Views.ViewStructure.SetHtmlInfo(Android.Views.ViewStructure.HtmlInfo)' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Android.Views.ViewStructure.SetInputType(System.Int32)' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Android.Views.ViewStructure.SetLocaleList(Android.OS.LocaleList)' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Android.Views.ViewStructure.SetOpaque(System.Boolean)' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Android.Views.ViewStructure.SetWebDomain(System.String)' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Android.Webkit.WebSettings.SafeBrowsingEnabled' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Android.Webkit.WebSettings.SafeBrowsingEnabled.get()' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Android.Webkit.WebSettings.SafeBrowsingEnabled.set(System.Boolean)' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Android.Webkit.WebViewDatabase.GetHttpAuthUsernamePassword(System.String, System.String)' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Android.Webkit.WebViewDatabase.SetHttpAuthUsernamePassword(System.String, System.String, System.String, System.String)' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Java.Lang.AbstractStringBuilder.ToString()' is abstract in the implementation but is missing in the contract.
+CannotChangeAttribute : Attribute 'Android.Runtime.RegisterAttribute' on 'Java.Lang.Class.GetAnnotationsByType(Java.Lang.Class)' changed from '[RegisterAttribute("getAnnotationsByType", "(Ljava/lang/Class;)[Ljava/lang/Object;", "")]' in the contract to '[RegisterAttribute("getAnnotationsByType", "(Ljava/lang/Class;)[Ljava/lang/annotation/Annotation;", "")]' in the implementation.
+CannotChangeAttribute : Attribute 'Android.Runtime.RegisterAttribute' on 'Java.Lang.Class.GetDeclaredAnnotation(Java.Lang.Class)' changed from '[RegisterAttribute("getDeclaredAnnotation", "(Ljava/lang/Class;)Ljava/lang/Object;", "")]' in the contract to '[RegisterAttribute("getDeclaredAnnotation", "(Ljava/lang/Class;)Ljava/lang/annotation/Annotation;", "")]' in the implementation.
+CannotChangeAttribute : Attribute 'Android.Runtime.RegisterAttribute' on 'Java.Lang.StringBuffer.Append(Java.Lang.ICharSequence)' changed from '[RegisterAttribute("append", "(Ljava/lang/CharSequence;)Ljava/lang/StringBuffer;", "")]' in the contract to '[RegisterAttribute("append", "(Ljava/lang/CharSequence;)Ljava/lang/Appendable;", "")]' in the implementation.
+CannotChangeAttribute : Attribute 'Android.Runtime.RegisterAttribute' on 'Java.Lang.StringBuffer.Append(Java.Lang.ICharSequence, System.Int32, System.Int32)' changed from '[RegisterAttribute("append", "(Ljava/lang/CharSequence;II)Ljava/lang/StringBuffer;", "")]' in the contract to '[RegisterAttribute("append", "(Ljava/lang/CharSequence;II)Ljava/lang/Appendable;", "")]' in the implementation.
+CannotChangeAttribute : Attribute 'Android.Runtime.RegisterAttribute' on 'Java.Lang.StringBuffer.Append(System.Char)' changed from '[RegisterAttribute("append", "(C)Ljava/lang/StringBuffer;", "")]' in the contract to '[RegisterAttribute("append", "(C)Ljava/lang/Appendable;", "")]' in the implementation.
+CannotChangeAttribute : Attribute 'Android.Runtime.RegisterAttribute' on 'Java.Lang.StringBuilder.Append(Java.Lang.ICharSequence)' changed from '[RegisterAttribute("append", "(Ljava/lang/CharSequence;)Ljava/lang/StringBuilder;", "")]' in the contract to '[RegisterAttribute("append", "(Ljava/lang/CharSequence;)Ljava/lang/Appendable;", "")]' in the implementation.
+CannotChangeAttribute : Attribute 'Android.Runtime.RegisterAttribute' on 'Java.Lang.StringBuilder.Append(Java.Lang.ICharSequence, System.Int32, System.Int32)' changed from '[RegisterAttribute("append", "(Ljava/lang/CharSequence;II)Ljava/lang/StringBuilder;", "")]' in the contract to '[RegisterAttribute("append", "(Ljava/lang/CharSequence;II)Ljava/lang/Appendable;", "")]' in the implementation.
+CannotChangeAttribute : Attribute 'Android.Runtime.RegisterAttribute' on 'Java.Lang.StringBuilder.Append(System.Char)' changed from '[RegisterAttribute("append", "(C)Ljava/lang/StringBuilder;", "")]' in the contract to '[RegisterAttribute("append", "(C)Ljava/lang/Appendable;", "")]' in the implementation.
+TypesMustExist : Type 'Java.Lang.Reflect.Constructor.InterfaceConsts' does not exist in the implementation but it does exist in the contract.
+TypesMustExist : Type 'Java.Lang.Reflect.Method.InterfaceConsts' does not exist in the implementation but it does exist in the contract.
+CannotAddAbstractMembers : Member 'Java.Nio.Channels.DatagramChannel.LocalAddress' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Java.Nio.Channels.DatagramChannel.LocalAddress.get()' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Java.Nio.Channels.ServerSocketChannel.LocalAddress' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Java.Nio.Channels.ServerSocketChannel.LocalAddress.get()' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Java.Nio.Channels.SocketChannel.LocalAddress' is abstract in the implementation but is missing in the contract.
+CannotAddAbstractMembers : Member 'Java.Nio.Channels.SocketChannel.LocalAddress.get()' is abstract in the implementation but is missing in the contract.
\ No newline at end of file
diff --git a/tests/api-compatibility/acceptable-breakages-v9.0.txt b/tests/api-compatibility/acceptable-breakages-v9.0.txt
new file mode 100644
index 00000000000..18426d933db
--- /dev/null
+++ b/tests/api-compatibility/acceptable-breakages-v9.0.txt
@@ -0,0 +1,8 @@
+Compat issues with assembly Mono.Android:
+InterfacesShouldHaveSameMembers : Interface member 'Android.Content.Res.IXmlResourceParser.GetAttributeNamespace(System.Int32)' is present in the implementation but not in the contract.
+CannotChangeAttribute : Attribute 'Android.Runtime.RegisterAttribute' on 'Android.Database.Sqlite.SQLiteDatabase.Path.get()' changed from '[RegisterAttribute("getPath", "()Ljava/lang/String;", "")]' in the contract to '[RegisterAttribute("getPath", "()Ljava/lang/String;", "GetGetPathHandler")]' in the implementation.
+CannotChangeAttribute : Attribute 'Android.Runtime.IntDefinitionAttribute' on 'Android.Telecom.ConnectionProperties Android.Telecom.ConnectionProperties.IsRtt' changed from '[IntDefinitionAttribute(null, JniField="android/telecom/Connection.PROPERTY_IS_RTT")]' in the contract to '[IntDefinitionAttribute("Android.Telecom.Connection.PropertyIsRtt", JniField="android/telecom/Connection.PROPERTY_IS_RTT")]' in the implementation.
+TypesMustExist : Type 'Android.Telephony.CellIdentityCdma.InterfaceConsts' does not exist in the implementation but it does exist in the contract.
+TypesMustExist : Type 'Android.Telephony.CellIdentityGsm.InterfaceConsts' does not exist in the implementation but it does exist in the contract.
+TypesMustExist : Type 'Android.Telephony.CellIdentityLte.InterfaceConsts' does not exist in the implementation but it does exist in the contract.
+TypesMustExist : Type 'Android.Telephony.CellIdentityWcdma.InterfaceConsts' does not exist in the implementation but it does exist in the contract.
\ No newline at end of file
diff --git a/tests/api-compatibility/acceptable-breakages-vReference.txt b/tests/api-compatibility/acceptable-breakages-vReference.txt
new file mode 100644
index 00000000000..e03c07ffa2b
--- /dev/null
+++ b/tests/api-compatibility/acceptable-breakages-vReference.txt
@@ -0,0 +1,5 @@
+Compat issues with assembly Mono.Android:
+CannotRemoveAttribute : Attribute 'System.ObsoleteAttribute' exists on 'Android.IncludeAndroidResourcesFromAttribute' in the contract but not the implementation.
+CannotRemoveAttribute : Attribute 'System.ObsoleteAttribute' exists on 'Android.NativeLibraryReferenceAttribute' in the contract but not the implementation.
+CannotRemoveAttribute : Attribute 'System.ObsoleteAttribute' exists on 'Android.ReferenceFilesAttribute' in the contract but not the implementation.
+CannotRemoveAttribute : Attribute 'System.ObsoleteAttribute' exists on 'Java.Interop.JavaLibraryReferenceAttribute' in the contract but not the implementation.
\ No newline at end of file
diff --git a/tests/api-compatibility/api-compat-exclude-attributes.txt b/tests/api-compatibility/api-compat-exclude-attributes.txt
new file mode 100644
index 00000000000..070aa5d7953
--- /dev/null
+++ b/tests/api-compatibility/api-compat-exclude-attributes.txt
@@ -0,0 +1,7 @@
+// These attributes should be excluded from api-compat check reference assemblies.
+
+T:Java.Interop.JavaTypeParametersAttribute
+
+T:System.Runtime.CompilerServices.AsyncIteratorStateMachineAttribute
+T:System.Runtime.CompilerServices.AsyncStateMachineAttribute
+T:System.Runtime.CompilerServices.IteratorStateMachineAttribute
\ No newline at end of file
diff --git a/tests/api-compatibility/reference/Mono.Android.dll.zip b/tests/api-compatibility/reference/Mono.Android.dll.zip
new file mode 100644
index 00000000000..ce3cc65773f
Binary files /dev/null and b/tests/api-compatibility/reference/Mono.Android.dll.zip differ