diff --git a/build-tools/create-packs/Microsoft.Android.Sdk.TrimmableTypeMap.targets b/build-tools/create-packs/Microsoft.Android.Sdk.TrimmableTypeMap.targets
new file mode 100644
index 00000000000..28273609d56
--- /dev/null
+++ b/build-tools/create-packs/Microsoft.Android.Sdk.TrimmableTypeMap.targets
@@ -0,0 +1,155 @@
+
+
+
+
+
+
+ <_PreBuiltTypeMapPackSubDir>data\prebuilt-typemap
+ <_PreBuiltTypeMapOutputDir>$(MicrosoftAndroidSdkPackDir)$(_PreBuiltTypeMapPackSubDir)\
+
+ $(NoWarn);NU5100
+
+ <_PreBuiltTypeMapIntDir>$([MSBuild]::NormalizeDirectory('$(MSBuildProjectDirectory)', 'obj', 'prebuilt-typemap'))
+ <_PreBuiltTypeMapJavaDir>$(_PreBuiltTypeMapIntDir)java\
+ <_PreBuiltTypeMapAssembly>$(_PreBuiltTypeMapOutputDir)_Mono.Android.TypeMap.dll
+ <_PreBuiltTypeMapJavaInteropAssembly>$(_PreBuiltTypeMapOutputDir)_Java.Interop.TypeMap.dll
+ <_PreBuiltTypeMapAcwMap>$(_PreBuiltTypeMapOutputDir)mono.android-acw-map.txt
+ <_PreBuiltTypeMapJavaFilesList>$(_PreBuiltTypeMapIntDir)java-files.txt
+ <_PreBuiltTypeMapGenerationStamp>$(_PreBuiltTypeMapIntDir)_GeneratePreBuiltMonoAndroidTypeMap.stamp
+
+
+
+
+
+ <_ExpectedPreBuiltTypeMapJavaFile Remove="@(_ExpectedPreBuiltTypeMapJavaFile)" />
+ <_ActualPreBuiltTypeMapJavaFile Remove="@(_ActualPreBuiltTypeMapJavaFile)" />
+ <_MissingPreBuiltTypeMapJavaFile Remove="@(_MissingPreBuiltTypeMapJavaFile)" />
+ <_UnexpectedPreBuiltTypeMapJavaFile Remove="@(_UnexpectedPreBuiltTypeMapJavaFile)" />
+
+
+
+
+
+ <_ActualPreBuiltTypeMapJavaFile Include="$(_PreBuiltTypeMapJavaDir)**\*.java" />
+ <_MissingPreBuiltTypeMapJavaFile Include="@(_ExpectedPreBuiltTypeMapJavaFile)"
+ Condition="!Exists('%(_ExpectedPreBuiltTypeMapJavaFile.Identity)')" />
+ <_UnexpectedPreBuiltTypeMapJavaFile Include="@(_ActualPreBuiltTypeMapJavaFile->'%(FullPath)')"
+ Exclude="@(_ExpectedPreBuiltTypeMapJavaFile)" />
+
+
+
+ <_ExpectedPreBuiltTypeMapJavaFile Remove="@(_ExpectedPreBuiltTypeMapJavaFile)" />
+ <_ActualPreBuiltTypeMapJavaFile Remove="@(_ActualPreBuiltTypeMapJavaFile)" />
+ <_MissingPreBuiltTypeMapJavaFile Remove="@(_MissingPreBuiltTypeMapJavaFile)" />
+ <_UnexpectedPreBuiltTypeMapJavaFile Remove="@(_UnexpectedPreBuiltTypeMapJavaFile)" />
+
+
+
+
+
+
+ <_PreBuiltTypeMapInput Include="$(_MonoAndroidNETDefaultOutDir)Mono.Android.dll" />
+ <_PreBuiltTypeMapInput Include="$(_MonoAndroidNETDefaultOutDir)Java.Interop.dll" />
+
+ <_PreBuiltTypeMapFramework Include="$(_MonoAndroidNETDefaultOutDir)*.dll"
+ Exclude="@(_PreBuiltTypeMapInput)" />
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ <_PreBuiltTypeMapJcwJar>$(_PreBuiltTypeMapOutputDir)mono.android-typemaps.jar
+ <_PreBuiltTypeMapJcwClassesDir>$(_PreBuiltTypeMapIntDir)jcw-classes\
+ <_PreBuiltTypeMapJcwSourceList>$(_PreBuiltTypeMapIntDir)jcw-sources.txt
+ <_PreBuiltTypeMapAndroidJar>$(AndroidSdkDirectory)\platforms\android-$(AndroidPlatformId)\android.jar
+ <_PreBuiltTypeMapMonoAndroidJar>$(_MonoAndroidNETDefaultOutDir)mono.android.jar
+ <_PreBuiltTypeMapRuntimeJar>$(MicrosoftAndroidSdkOutDir)java_runtime.jar
+
+
+
+
+
+ <_PreBuiltTypeMapJavaFile Remove="@(_PreBuiltTypeMapJavaFile)" />
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ <_PreBuiltTypeMapAllAssemblies Include="$(_PreBuiltTypeMapOutputDir)*.TypeMap.dll" />
+
+
+
+
+
+
+
diff --git a/build-tools/create-packs/Microsoft.Android.Sdk.proj b/build-tools/create-packs/Microsoft.Android.Sdk.proj
index 5af22b5028a..1fa50bb9372 100644
--- a/build-tools/create-packs/Microsoft.Android.Sdk.proj
+++ b/build-tools/create-packs/Microsoft.Android.Sdk.proj
@@ -12,6 +12,8 @@ core workload SDK packs imported by WorkloadManifest.targets.
+
+
$(DotNetStableTargetFramework)
diff --git a/src/Microsoft.Android.Sdk.TrimmableTypeMap/AssemblyInput.cs b/src/Microsoft.Android.Sdk.TrimmableTypeMap/AssemblyInput.cs
index d742d120d8c..c924746abf6 100644
--- a/src/Microsoft.Android.Sdk.TrimmableTypeMap/AssemblyInput.cs
+++ b/src/Microsoft.Android.Sdk.TrimmableTypeMap/AssemblyInput.cs
@@ -2,4 +2,9 @@
namespace Microsoft.Android.Sdk.TrimmableTypeMap;
-public readonly record struct AssemblyInput (string Name, string Path, PEReader Reader);
+///
+/// When true (default) the assembly is scanned and its Java peers are emitted into a typemap.
+/// When false the assembly is only indexed for base-type resolution (e.g. Mono.Android on the app
+/// build, whose typemap is pre-generated at SDK build time, issue #10792) and no peers are emitted.
+///
+public readonly record struct AssemblyInput (string Name, string Path, PEReader Reader, bool ScanForPeers = true);
diff --git a/src/Microsoft.Android.Sdk.TrimmableTypeMap/Generator/RootTypeMapAssemblyGenerator.cs b/src/Microsoft.Android.Sdk.TrimmableTypeMap/Generator/RootTypeMapAssemblyGenerator.cs
index 683464daa4c..7ba699c04cc 100644
--- a/src/Microsoft.Android.Sdk.TrimmableTypeMap/Generator/RootTypeMapAssemblyGenerator.cs
+++ b/src/Microsoft.Android.Sdk.TrimmableTypeMap/Generator/RootTypeMapAssemblyGenerator.cs
@@ -74,7 +74,16 @@ public RootTypeMapAssemblyGenerator (Version systemRuntimeVersion)
/// Stream to write the output PE to.
/// Optional assembly name (defaults to _Microsoft.Android.TypeMaps).
/// Optional module name for the PE metadata.
- public void Generate (IReadOnlyList perAssemblyTypeMapNames, bool useSharedTypemapUniverse, Stream stream, string? assemblyName = null, string? moduleName = null)
+ ///
+ /// Names of pre-generated framework per-assembly typemaps (e.g. _Mono.Android.TypeMap,
+ /// produced at SDK build time, issue #10792) that always use Java.Lang.Object as their
+ /// universe anchor regardless of . They are emitted as
+ /// [assembly: TypeMapAssemblyTarget<Java.Lang.Object>("name")] so the runtime loads
+ /// them into the Java.Lang.Object universe: in shared mode they merge into the single
+ /// app universe; in aggregate mode the loader adds the Java.Lang.Object universe alongside
+ /// the app's per-assembly universes.
+ ///
+ public void Generate (IReadOnlyList perAssemblyTypeMapNames, bool useSharedTypemapUniverse, Stream stream, string? assemblyName = null, string? moduleName = null, IReadOnlyList? sharedFrameworkTypeMapNames = null)
{
if (perAssemblyTypeMapNames is null) {
throw new ArgumentNullException (nameof (perAssemblyTypeMapNames));
@@ -118,9 +127,20 @@ public void Generate (IReadOnlyList perAssemblyTypeMapNames, bool useSha
EmitPerAssemblyUniverseAssemblyTargetAttributes (pe, perAssemblyTypeMapNames);
}
+ // Pre-generated framework typemaps (e.g. _Mono.Android.TypeMap) always live in the
+ // Java.Lang.Object universe, so reference them under that anchor regardless of mode.
+ var sharedFrameworkNames = sharedFrameworkTypeMapNames;
+ bool hasSharedFrameworkUniverse = sharedFrameworkNames is { Count: > 0 };
+ if (sharedFrameworkNames is { Count: > 0 }) {
+ var javaLangObjectHandle = pe.Metadata.AddTypeReference (pe.MonoAndroidRef,
+ pe.Metadata.GetOrAddString ("Java.Lang"),
+ pe.Metadata.GetOrAddString ("Object"));
+ EmitSharedUniverseAssemblyTargetAttributes (pe, javaLangObjectHandle, sharedFrameworkNames);
+ }
+
// Emit [assembly: IgnoresAccessChecksTo("...")] so TypeMapLoader.Initialize() can access
// internal types (TrimmableTypeMap and friends in Mono.Android, and private anchors
- // in each per-assembly typemap DLL when aggregate universes or array maps are used).
+ // in each per-assembly typemap DLL when aggregate universes are used).
var accessTargets = new List { "Mono.Android" };
if (!useSharedTypemapUniverse) {
accessTargets.AddRange (perAssemblyTypeMapNames);
@@ -128,7 +148,7 @@ public void Generate (IReadOnlyList perAssemblyTypeMapNames, bool useSha
pe.EmitIgnoresAccessChecksToAttribute (accessTargets);
// Emit TypeMapLoader class with Initialize() method
- EmitTypeMapLoader (pe, anchorTypeHandle, perAssemblyTypeMapNames, useSharedTypemapUniverse, assemblyName);
+ EmitTypeMapLoader (pe, anchorTypeHandle, perAssemblyTypeMapNames, useSharedTypemapUniverse, assemblyName, hasSharedFrameworkUniverse);
pe.WritePE (stream);
}
@@ -176,7 +196,7 @@ static void EmitAssemblyTargetAttribute (PEAssemblyBuilder pe, MemberReferenceHa
pe.Metadata.AddCustomAttribute (EntityHandle.AssemblyDefinition, ctorRef, blobHandle);
}
- static void EmitTypeMapLoader (PEAssemblyBuilder pe, EntityHandle anchorTypeHandle, IReadOnlyList perAssemblyTypeMapNames, bool useSharedTypemapUniverse, string assemblyName)
+ static void EmitTypeMapLoader (PEAssemblyBuilder pe, EntityHandle anchorTypeHandle, IReadOnlyList perAssemblyTypeMapNames, bool useSharedTypemapUniverse, string assemblyName, bool hasSharedFrameworkUniverse = false)
{
var metadata = pe.Metadata;
@@ -214,13 +234,16 @@ static void EmitTypeMapLoader (PEAssemblyBuilder pe, EntityHandle anchorTypeHand
var externalDictTypeSpec = MakeIReadOnlyDictTypeSpec (pe, iReadOnlyDictOpenRef, systemTypeRef, keyIsString: true);
if (useSharedTypemapUniverse) {
+ // Single Java.Lang.Object universe. Pre-generated framework typemaps (if any) also
+ // anchor on Java.Lang.Object, so GetOrCreateExternalTypeMapping()
+ // already merges them in via their TypeMapAssemblyTarget attributes — no extra universe.
var initializeRef = AddInitializeSingleNoArraysRef (pe, trimmableTypeMapRef, iReadOnlyDictOpenRef, systemTypeRef);
EmitInitializeWithSingleTypeMapNoArrays (pe, anchorTypeHandle, getExternalMemberRef, getProxyMemberRef, initializeRef, assemblyName);
} else {
var proxyDictTypeSpec = MakeIReadOnlyDictTypeSpec (pe, iReadOnlyDictOpenRef, systemTypeRef, keyIsString: false);
var initializeRef = AddInitializeAggregateNoArraysRef (pe, trimmableTypeMapRef, iReadOnlyDictOpenRef, systemTypeRef);
EmitInitializeWithAggregateTypeMapNoArrays (pe, perAssemblyTypeMapNames, getExternalMemberRef, getProxyMemberRef,
- initializeRef, externalDictTypeSpec, proxyDictTypeSpec, iReadOnlyDictOpenRef, systemTypeRef, assemblyName);
+ initializeRef, externalDictTypeSpec, proxyDictTypeSpec, iReadOnlyDictOpenRef, systemTypeRef, assemblyName, hasSharedFrameworkUniverse);
}
}
@@ -251,18 +274,30 @@ static void EmitInitializeWithAggregateTypeMapNoArrays (PEAssemblyBuilder pe,
MemberReferenceHandle initializeRef,
TypeSpecificationHandle externalDictTypeSpec, TypeSpecificationHandle proxyDictTypeSpec,
TypeReferenceHandle iReadOnlyDictOpenRef, TypeReferenceHandle systemTypeRef,
- string assemblyName)
+ string assemblyName,
+ bool hasSharedFrameworkUniverse = false)
{
- var count = perAssemblyTypeMapNames.Count;
+ // When a pre-generated framework typemap is present (e.g. _Mono.Android.TypeMap), it lives in
+ // the Java.Lang.Object universe. Emit it as universe [0] (via
+ // GetOrCreate*TypeMapping()), followed by the app's per-assembly universes.
+ var count = perAssemblyTypeMapNames.Count + (hasSharedFrameworkUniverse ? 1 : 0);
var getExternalSpecs = new EntityHandle [count];
var getProxySpecs = new EntityHandle [count];
- for (int i = 0; i < count; i++) {
+ int offset = 0;
+ if (hasSharedFrameworkUniverse) {
+ var javaLangObjectRef = pe.Metadata.AddTypeReference (pe.MonoAndroidRef,
+ pe.Metadata.GetOrAddString ("Java.Lang"), pe.Metadata.GetOrAddString ("Object"));
+ getExternalSpecs [0] = MakeGenericMethodSpec (pe, getExternalMemberRef, javaLangObjectRef);
+ getProxySpecs [0] = MakeGenericMethodSpec (pe, getProxyMemberRef, javaLangObjectRef);
+ offset = 1;
+ }
+ for (int i = 0; i < perAssemblyTypeMapNames.Count; i++) {
var asmRef = pe.FindOrAddAssemblyRef (perAssemblyTypeMapNames [i]);
var perAsmAnchorRef = pe.Metadata.AddTypeReference (asmRef,
default, pe.Metadata.GetOrAddString ("__TypeMapAnchor"));
- getExternalSpecs [i] = MakeGenericMethodSpec (pe, getExternalMemberRef, perAsmAnchorRef);
- getProxySpecs [i] = MakeGenericMethodSpec (pe, getProxyMemberRef, perAsmAnchorRef);
+ getExternalSpecs [offset + i] = MakeGenericMethodSpec (pe, getExternalMemberRef, perAsmAnchorRef);
+ getProxySpecs [offset + i] = MakeGenericMethodSpec (pe, getProxyMemberRef, perAsmAnchorRef);
}
pe.EmitBody ("Initialize",
diff --git a/src/Microsoft.Android.Sdk.TrimmableTypeMap/Scanner/JavaPeerScanner.cs b/src/Microsoft.Android.Sdk.TrimmableTypeMap/Scanner/JavaPeerScanner.cs
index a9b28686132..fdee6bd7d42 100644
--- a/src/Microsoft.Android.Sdk.TrimmableTypeMap/Scanner/JavaPeerScanner.cs
+++ b/src/Microsoft.Android.Sdk.TrimmableTypeMap/Scanner/JavaPeerScanner.cs
@@ -175,9 +175,15 @@ public List Scan (IReadOnlyList<(string Name, PEReader Reader)> as
public List Scan (IEnumerable assemblies)
{
+ // Reference-only assemblies (ScanForPeers == false) are indexed so base-type resolution
+ // works, but are not scanned for peer emission (their typemap is pre-generated elsewhere).
+ var referenceOnlyAssemblyNames = new HashSet (StringComparer.Ordinal);
foreach (var assembly in assemblies) {
var index = AssemblyIndex.Create (assembly.Reader, assembly.Name, assembly.Path);
assemblyCache [index.AssemblyName] = index;
+ if (!assembly.ScanForPeers) {
+ referenceOnlyAssemblyNames.Add (index.AssemblyName);
+ }
}
// Key by (managedTypeName, assemblyName) to avoid collisions when two assemblies
@@ -185,6 +191,9 @@ public List Scan (IEnumerable assemblies)
// Java.Interop and Mono.Android).
var resultsByQualifiedName = new Dictionary<(string ManagedName, string AssemblyName), JavaPeerInfo> ();
foreach (var index in assemblyCache.Values) {
+ if (referenceOnlyAssemblyNames.Contains (index.AssemblyName)) {
+ continue;
+ }
ScanAssembly (index, resultsByQualifiedName);
}
ForceUnconditionalCrossReferences (resultsByQualifiedName, assemblyCache);
diff --git a/src/Microsoft.Android.Sdk.TrimmableTypeMap/TrimmableTypeMapGenerator.cs b/src/Microsoft.Android.Sdk.TrimmableTypeMap/TrimmableTypeMapGenerator.cs
index be49c266d47..8035fbcaf72 100644
--- a/src/Microsoft.Android.Sdk.TrimmableTypeMap/TrimmableTypeMapGenerator.cs
+++ b/src/Microsoft.Android.Sdk.TrimmableTypeMap/TrimmableTypeMapGenerator.cs
@@ -35,13 +35,26 @@ public TrimmableTypeMapResult Execute (
XDocument? manifestTemplate = null,
string? packageNamingPolicy = null,
bool generateTypeMapAssemblies = true,
- bool errorOnCustomJavaObject = true)
+ bool errorOnCustomJavaObject = true,
+ bool generateRootAssembly = true,
+ IReadOnlyList? sharedFrameworkTypeMapNames = null)
{
_ = assemblies ?? throw new ArgumentNullException (nameof (assemblies));
_ = systemRuntimeVersion ?? throw new ArgumentNullException (nameof (systemRuntimeVersion));
_ = frameworkAssemblyNames ?? throw new ArgumentNullException (nameof (frameworkAssemblyNames));
var (allPeers, assemblyManifestInfo) = ScanAssemblies (assemblies, packageNamingPolicy, frameworkAssemblyNames, errorOnCustomJavaObject);
if (allPeers.Count == 0) {
+ if (generateTypeMapAssemblies &&
+ generateRootAssembly &&
+ sharedFrameworkTypeMapNames is { Count: > 0 }) {
+ var rootAssemblies = GenerateTypeMapAssemblies (
+ allPeers,
+ systemRuntimeVersion,
+ useSharedTypemapUniverse,
+ generateRootAssembly,
+ sharedFrameworkTypeMapNames);
+ return new TrimmableTypeMapResult (rootAssemblies, [], allPeers);
+ }
logger.LogNoJavaPeerTypesFound ();
return new TrimmableTypeMapResult ([], [], allPeers);
}
@@ -55,7 +68,7 @@ public TrimmableTypeMapResult Execute (
}
var generatedAssemblies = generateTypeMapAssemblies
- ? GenerateTypeMapAssemblies (allPeers, systemRuntimeVersion, useSharedTypemapUniverse)
+ ? GenerateTypeMapAssemblies (allPeers, systemRuntimeVersion, useSharedTypemapUniverse, generateRootAssembly, sharedFrameworkTypeMapNames)
: [];
var jcwPeers = allPeers.Where (ShouldGenerateJcw).ToList ();
logger.LogGeneratingJcwFilesInfo (jcwPeers.Count, allPeers.Count);
@@ -262,7 +275,9 @@ GeneratedManifest GenerateManifest (List allPeers, AssemblyManifes
List GenerateTypeMapAssemblies (
List allPeers,
Version systemRuntimeVersion,
- bool useSharedTypemapUniverse)
+ bool useSharedTypemapUniverse,
+ bool generateRootAssembly = true,
+ IReadOnlyList? sharedFrameworkTypeMapNames = null)
{
List<(string AssemblyName, List Peers)> peersByAssembly;
@@ -296,12 +311,20 @@ List GenerateTypeMapAssemblies (
generatedAssemblies.Add (new GeneratedAssembly (typeMapAssemblyName, stream));
logger.LogGeneratedTypeMapAssemblyInfo (typeMapAssemblyName, peers.Count);
}
- var rootStream = new MemoryStream ();
- var rootGenerator = new RootTypeMapAssemblyGenerator (systemRuntimeVersion);
- rootGenerator.Generate (perAssemblyNames, useSharedTypemapUniverse, rootStream);
- rootStream.Position = 0;
- generatedAssemblies.Add (new GeneratedAssembly ("_Microsoft.Android.TypeMaps", rootStream));
- logger.LogGeneratedRootTypeMapInfo (perAssemblyNames.Count);
+ // The root assembly (_Microsoft.Android.TypeMaps) carries the
+ // [assembly: TypeMapAssemblyTarget] attributes and TypeMapLoader.Initialize() that
+ // bind the per-assembly typemaps into universes at runtime. When pre-generating a
+ // framework typemap (e.g. Mono.Android) at SDK build time, the root is intentionally
+ // skipped: it is emitted by the app build, which references the pre-generated per-assembly
+ // typemap alongside the app's own.
+ if (generateRootAssembly) {
+ var rootStream = new MemoryStream ();
+ var rootGenerator = new RootTypeMapAssemblyGenerator (systemRuntimeVersion);
+ rootGenerator.Generate (perAssemblyNames, useSharedTypemapUniverse, rootStream, sharedFrameworkTypeMapNames: sharedFrameworkTypeMapNames);
+ rootStream.Position = 0;
+ generatedAssemblies.Add (new GeneratedAssembly ("_Microsoft.Android.TypeMaps", rootStream));
+ logger.LogGeneratedRootTypeMapInfo (perAssemblyNames.Count);
+ }
logger.LogGeneratedTypeMapAssembliesInfo (generatedAssemblies.Count);
return generatedAssemblies;
}
diff --git a/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.TypeMap.Trimmable.CoreCLR.targets b/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.TypeMap.Trimmable.CoreCLR.targets
index b12f80fdc8f..ec6da99964d 100644
--- a/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.TypeMap.Trimmable.CoreCLR.targets
+++ b/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.TypeMap.Trimmable.CoreCLR.targets
@@ -47,6 +47,7 @@
Outputs="$(_ProguardProjectConfiguration)">
@@ -62,6 +63,10 @@
out-of-date and run it on every build. -->
<_PostTrimTrimmableTypeMapInputAssemblies Include="@(ResolvedFileToPublish)"
Condition=" '%(Extension)' == '.dll' and Exists('%(FullPath)') and ('%(RuntimeIdentifier)' == '' or '$(_PostTrimTypeMapFirstRuntimeIdentifier)' == '' or '%(RuntimeIdentifier)' == '$(_PostTrimTypeMapFirstRuntimeIdentifier)') " />
+ <_PostTrimPreGeneratedTypeMapAssemblyInput Condition=" '$(_AndroidUsePreGeneratedMonoAndroidTypeMap)' == 'true' "
+ Include="@(_PostTrimTrimmableTypeMapInputAssemblies)" KeepDuplicates="false" />
+ <_PostTrimPreGeneratedTypeMapAssemblyInput Remove="@(_PostTrimPreGeneratedTypeMapAssemblyInput)"
+ Condition=" '%(Filename)' != 'Mono.Android' and '%(Filename)' != 'Java.Interop' " />
@@ -108,6 +113,7 @@
<_PostTrimTrimmableTypeMapInputAssemblies Remove="@(_PostTrimTrimmableTypeMapInputAssemblies)" />
+ <_PostTrimPreGeneratedTypeMapAssemblyInput Remove="@(_PostTrimPreGeneratedTypeMapAssemblyInput)" />
<_PostTrimGeneratedJavaFiles Remove="@(_PostTrimGeneratedJavaFiles)" />
<_PostTrimDeletedJavaFiles Remove="@(_PostTrimDeletedJavaFiles)" />
diff --git a/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.TypeMap.Trimmable.NativeAOT.targets b/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.TypeMap.Trimmable.NativeAOT.targets
index a485ef744fe..9919d333504 100644
--- a/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.TypeMap.Trimmable.NativeAOT.targets
+++ b/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.TypeMap.Trimmable.NativeAOT.targets
@@ -228,14 +228,40 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.TypeMap.Trimmable.targets b/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.TypeMap.Trimmable.targets
index a2dfc834ca8..e71e469ef0c 100644
--- a/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.TypeMap.Trimmable.targets
+++ b/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.TypeMap.Trimmable.targets
@@ -67,6 +67,31 @@
+
+
+ <_PreGeneratedTypeMapDir>$([MSBuild]::NormalizeDirectory('$(MSBuildThisFileDirectory)..\data\prebuilt-typemap'))
+ <_PreGeneratedMonoAndroidTypeMapAssembly>$(_PreGeneratedTypeMapDir)_Mono.Android.TypeMap.dll
+ <_PreGeneratedJavaInteropTypeMapAssembly>$(_PreGeneratedTypeMapDir)_Java.Interop.TypeMap.dll
+ <_PreGeneratedMonoAndroidTypeMapJar>$(_PreGeneratedTypeMapDir)mono.android-typemaps.jar
+ <_PreGeneratedMonoAndroidTypeMapAcwMap>$(_PreGeneratedTypeMapDir)mono.android-acw-map.txt
+ <_AndroidUsePreGeneratedMonoAndroidTypeMap Condition=" '$(_AndroidUsePreGeneratedMonoAndroidTypeMap)' == '' and '$(AndroidIncludeDebugSymbols)' == 'true' and Exists('$(_PreGeneratedMonoAndroidTypeMapAssembly)') and Exists('$(_PreGeneratedJavaInteropTypeMapAssembly)') and Exists('$(_PreGeneratedMonoAndroidTypeMapJar)') and Exists('$(_PreGeneratedMonoAndroidTypeMapAcwMap)') ">true
+ <_AndroidUsePreGeneratedMonoAndroidTypeMap Condition=" '$(_AndroidUsePreGeneratedMonoAndroidTypeMap)' == '' ">false
+ <_AndroidUsePreGeneratedMonoAndroidTypeMap Condition=" '$(AndroidIncludeDebugSymbols)' != 'true' ">false
+ <_UseTrimmableCoreClrProguardConfiguration Condition=" '$(_AndroidRuntime)' == 'CoreCLR' and '$(_AndroidUsePreGeneratedMonoAndroidTypeMap)' == 'true' ">true
+
+ <_TrimmableTypeMapKeepRulesAcwMapFile>$(IntermediateOutputPath)acw-map.txt
+ <_TrimmableTypeMapKeepRulesAcwMapFile Condition=" '$(_AndroidUsePreGeneratedMonoAndroidTypeMap)' == 'true' ">$(IntermediateOutputPath)acw-map.prebuilt-merged.txt
+
+
<_MergedManifestDocuments Condition=" '$(AndroidManifestMerger)' == 'legacy' " Include="@(ExtractedManifestDocuments)" />
+
+
+ <_PreGeneratedTypeMapAssemblyInput Condition=" '$(_AndroidUsePreGeneratedMonoAndroidTypeMap)' == 'true' "
+ Include="@(_TypeMapInputAssemblies)" KeepDuplicates="false" />
+ <_PreGeneratedTypeMapAssemblyInput Remove="@(_PreGeneratedTypeMapAssemblyInput)"
+ Condition=" '%(Filename)' != 'Mono.Android' and '%(Filename)' != 'Java.Interop' " />
+
+
+ <_GeneratedTypeMapAssembliesFromList Include="$(_PreGeneratedTypeMapDir)*.TypeMap.dll" />
+
+
+
+
+
+