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" /> + + + + + +