diff --git a/build-tools/automation/azure-pipelines.yaml b/build-tools/automation/azure-pipelines.yaml index 850e08fef42..f1c593fa0af 100644 --- a/build-tools/automation/azure-pipelines.yaml +++ b/build-tools/automation/azure-pipelines.yaml @@ -215,6 +215,16 @@ extends: artifactSource: bin/Test$(XA.Build.Configuration)/$(DotNetTargetFramework)-android/Mono.Android.NET_Tests-Signed.aab artifactFolder: $(DotNetTargetFramework)-AotLlvm + - template: /build-tools/automation/yaml-templates/apk-instrumentation.yaml@self + parameters: + configuration: $(XA.Build.Configuration) + testName: Mono.Android.NET_Tests-IsAssignableFrom + project: tests/Mono.Android-Tests/Runtime-Microsoft.Android.Sdk/Mono.Android.NET-Tests.csproj + testResultsFiles: TestResult-Mono.Android.NET_Tests-$(XA.Build.Configuration)IsAssignableFrom.xml + extraBuildArgs: -p:TestsFlavor=IsAssignableFrom -p:IncludeCategories=Intune -p:_AndroidIsAssignableFromCheck=false + artifactSource: bin/Test$(XA.Build.Configuration)/$(DotNetTargetFramework)-android/Mono.Android.NET_Tests-Signed.aab + artifactFolder: $(DotNetTargetFramework)-IsAssignableFrom + - template: /build-tools/automation/yaml-templates/apk-instrumentation.yaml@self parameters: configuration: $(XA.Build.Configuration) diff --git a/src/Mono.Android/Java.Interop/TypeManager.cs b/src/Mono.Android/Java.Interop/TypeManager.cs index 334a9f542a8..8e98ac1ec0b 100644 --- a/src/Mono.Android/Java.Interop/TypeManager.cs +++ b/src/Mono.Android/Java.Interop/TypeManager.cs @@ -39,6 +39,15 @@ public static Dictionary ManagedToJni { } public static partial class TypeManager { + + const bool IsAssignableFromCheckEnabledByDefault = true; + + const string FeatureSwitchPrefix = "Microsoft.Android.Runtime.RuntimeFeature."; + + [FeatureSwitchDefinition ($"{FeatureSwitchPrefix}{nameof (IsAssignableFromCheck)}")] + internal static bool IsAssignableFromCheck { get; } = + AppContext.TryGetSwitch ($"{FeatureSwitchPrefix}{nameof (IsAssignableFromCheck)}", out bool isEnabled) ? isEnabled : IsAssignableFromCheckEnabledByDefault; + internal static string GetClassName (IntPtr class_ptr) { IntPtr ptr = RuntimeNativeMethods.monodroid_TypeManager_get_java_class_name (class_ptr); @@ -336,7 +345,13 @@ internal static IJavaPeerable CreateInstance (IntPtr handle, JniHandleOwnership handleClass = JniEnvironment.Types.GetObjectClass (new JniObjectReference (handle)); if (!JniEnvironment.Types.IsAssignableFrom (handleClass, typeClass)) { - return null; + if (Logger.LogAssembly) { + var message = $"Handle 0x{handle:x} is of type '{JNIEnv.GetClassNameFromInstance (handle)}' which is not assignable to '{typeSig.SimpleReference}'"; + Logger.Log (LogLevel.Debug, "monodroid-assembly", message); + } + if (IsAssignableFromCheck) { + return null; + } } } finally { JniObjectReference.Dispose (ref handleClass); diff --git a/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.ILLink.targets b/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.ILLink.targets index 3fb47bbc7b8..a3ee19bbc05 100644 --- a/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.ILLink.targets +++ b/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.ILLink.targets @@ -9,6 +9,14 @@ This file contains the .NET 5-specific targets to customize ILLink + + + + + @@ -122,8 +123,7 @@ - - + diff --git a/tests/Mono.Android-Tests/Runtime-Microsoft.Android.Sdk/IsAssignableFromRemaps.xml b/tests/Mono.Android-Tests/Runtime-Microsoft.Android.Sdk/IsAssignableFromRemaps.xml new file mode 100644 index 00000000000..4c912cda93e --- /dev/null +++ b/tests/Mono.Android-Tests/Runtime-Microsoft.Android.Sdk/IsAssignableFromRemaps.xml @@ -0,0 +1,6 @@ + + + diff --git a/tests/Mono.Android-Tests/Runtime-Microsoft.Android.Sdk/Mono.Android.NET-Tests.csproj b/tests/Mono.Android-Tests/Runtime-Microsoft.Android.Sdk/Mono.Android.NET-Tests.csproj index ad1e6e8e7fa..a81246b5c14 100644 --- a/tests/Mono.Android-Tests/Runtime-Microsoft.Android.Sdk/Mono.Android.NET-Tests.csproj +++ b/tests/Mono.Android-Tests/Runtime-Microsoft.Android.Sdk/Mono.Android.NET-Tests.csproj @@ -45,6 +45,7 @@ <_AndroidRemapMembers Include="Remaps.xml" /> + <_AndroidRemapMembers Include="IsAssignableFromRemaps.xml" Condition=" '$(_AndroidIsAssignableFromCheck)' == 'false' " /> diff --git a/tests/Mono.Android-Tests/java/net/dot/android/test/MyLayoutInflater.java b/tests/Mono.Android-Tests/java/net/dot/android/test/MyLayoutInflater.java new file mode 100644 index 00000000000..30e6361159e --- /dev/null +++ b/tests/Mono.Android-Tests/java/net/dot/android/test/MyLayoutInflater.java @@ -0,0 +1,12 @@ +package net.dot.android.test; + +public class MyLayoutInflater extends android.view.LayoutInflater { + protected MyLayoutInflater (android.content.Context context) { + super (context); + } + + @Override + public android.view.LayoutInflater cloneInContext (android.content.Context newContext) { + return new MyLayoutInflater (newContext); + } +}