Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -207,20 +207,18 @@ _ResolveAssemblies MSBuild target.

<Target Name="_PrepareAssemblies"
DependsOnTargets="$(_PrepareAssembliesDependsOnTargets)">
<ItemGroup>
<_ResolvedAssemblies Include="@(ResolvedAssemblies)" />
<_ResolvedUserAssemblies Include="@(ResolvedUserAssemblies)" />
<_ResolvedFrameworkAssemblies Include="@(ResolvedFrameworkAssemblies)" />
<_ResolvedSymbols Include="@(ResolvedSymbols)" />
</ItemGroup>
<ItemGroup Condition=" '$(PublishTrimmed)' != 'true' ">
<_ResolvedAssemblies Include="@(ResolvedAssemblies->'$(MonoAndroidIntermediateAssemblyDir)%(DestinationSubPath)')" Condition=" '%(DestinationSubPath)' != '' " />
<_ResolvedUserAssemblies Include="@(ResolvedUserAssemblies->'$(MonoAndroidIntermediateAssemblyDir)%(DestinationSubPath)')" Condition=" '%(DestinationSubPath)' != '' " />
<_ResolvedFrameworkAssemblies Include="@(ResolvedFrameworkAssemblies->'$(MonoAndroidIntermediateAssemblyDir)%(DestinationSubPath)')" Condition=" '%(DestinationSubPath)' != '' " />
<_ResolvedSymbols Include="@(ResolvedSymbols->'$(MonoAndroidIntermediateAssemblyDir)%(DestinationSubPath)')" Condition=" '%(DestinationSubPath)' != '' " />
<_ShrunkAssemblies Include="@(_ResolvedAssemblies)" />
<_ShrunkUserAssemblies Include="@(_ResolvedUserAssemblies)" />
<_ShrunkFrameworkAssemblies Include="@(_ResolvedFrameworkAssemblies)" />
</ItemGroup>
<ItemGroup Condition=" '$(PublishTrimmed)' == 'true' ">
<_ResolvedAssemblies Include="@(ResolvedAssemblies)" />
<_ResolvedUserAssemblies Include="@(ResolvedUserAssemblies)" />
<_ResolvedFrameworkAssemblies Include="@(ResolvedFrameworkAssemblies)" />
<_ResolvedSymbols Include="@(ResolvedSymbols)" />
<_ShrunkFrameworkAssemblies
Include="@(_ShrunkAssemblies)"
Condition=" '%(_ShrunkAssemblies.FrameworkAssembly)' == 'true' "
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2178,21 +2178,6 @@ public void CheckLintResourceFileReferencesAreFixed ([Values] AndroidRuntime run
// TODO: [TestCase (false, AndroidRuntime.NativeAOT)]
public void SimilarAndroidXAssemblyNames (bool publishTrimmed, AndroidRuntime runtime)
{
if (!publishTrimmed && runtime == AndroidRuntime.CoreCLR) {
// This currently fails with the following exception:
//
// error XALNS7015: System.NotSupportedException: Writing mixed-mode assemblies is not supported
// at Mono.Cecil.ModuleWriter.Write(ModuleDefinition module, Disposable`1 stream, WriterParameters parameters)
// at Mono.Cecil.ModuleWriter.WriteModule(ModuleDefinition module, Disposable`1 stream, WriterParameters parameters)
// at Mono.Cecil.ModuleDefinition.Write(String fileName, WriterParameters parameters)
// at Mono.Cecil.AssemblyDefinition.Write(String fileName, WriterParameters parameters)
// at Xamarin.Android.Tasks.SaveChangedAssemblyStep.ProcessAssembly(AssemblyDefinition assembly, StepContext context) in src/Xamarin.Android.Build.Tasks/Tasks/AssemblyModifierPipeline.cs:line 197
// at Xamarin.Android.Tasks.AssemblyPipeline.Run(AssemblyDefinition assembly, StepContext context) in src/Xamarin.Android.Build.Tasks/Utilities/AssemblyPipeline.cs:line 26
// at Xamarin.Android.Tasks.AssemblyModifierPipeline.RunPipeline(AssemblyPipeline pipeline, ITaskItem source, ITaskItem destination) in src/Xamarin.Android.Build.Tasks/Tasks/AssemblyModifierPipeline.cs:line 175
Assert.Ignore ("CoreCLR: fails because of a Mono.Cecil lack of support");
return;
}

bool aotAssemblies = runtime == AndroidRuntime.MonoVM && publishTrimmed;
var proj = new XamarinAndroidApplicationProject {
IsRelease = true,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -469,22 +469,6 @@ public void AndroidAddKeepAlives (bool isRelease, bool setAndroidAddKeepAlivesTr
return;
}

if (runtime == AndroidRuntime.CoreCLR && isRelease && !setAndroidAddKeepAlivesTrue && setLinkModeNone && shouldAddKeepAlives) {
// This currently fails with the following exception:
//
// error XALNS7015: System.NotSupportedException: Writing mixed-mode assemblies is not supported
// at Mono.Cecil.ModuleWriter.Write(ModuleDefinition module, Disposable`1 stream, WriterParameters parameters)
// at Mono.Cecil.ModuleWriter.WriteModule(ModuleDefinition module, Disposable`1 stream, WriterParameters parameters)
// at Mono.Cecil.ModuleDefinition.Write(String fileName, WriterParameters parameters)
// at Mono.Cecil.AssemblyDefinition.Write(String fileName, WriterParameters parameters)
// at Xamarin.Android.Tasks.SaveChangedAssemblyStep.ProcessAssembly(AssemblyDefinition assembly, StepContext context) in src/Xamarin.Android.Build.Tasks/Tasks/AssemblyModifierPipeline.cs:line 197
// at Xamarin.Android.Tasks.AssemblyPipeline.Run(AssemblyDefinition assembly, StepContext context) in src/Xamarin.Android.Build.Tasks/Utilities/AssemblyPipeline.cs:line 26
// at Xamarin.Android.Tasks.AssemblyModifierPipeline.RunPipeline(AssemblyPipeline pipeline, ITaskItem source, ITaskItem destination) in src/Xamarin.Android.Build.Tasks/Tasks/AssemblyModifierPipeline.cs:line 175
// at Xamarin.Android.Tasks.AssemblyModifierPipeline.RunTask() in src/Xamarin.Android.Build.Tasks/Tasks/AssemblyModifierPipeline.cs:line 123
Assert.Ignore ("CoreCLR: fails because of a Mono.Cecil lack of support");
return;
};

var proj = new XamarinAndroidApplicationProject {
IsRelease = isRelease,
OtherBuildItems = {
Expand Down
61 changes: 45 additions & 16 deletions src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.targets
Original file line number Diff line number Diff line change
Expand Up @@ -1419,47 +1419,76 @@ because xbuild doesn't support framework reference assemblies.
<Error Text="%24(AndroidGenerateJniMarshalMethods)=True is not supported at this time." />
</Target>

<Target Name="_LinkAssembliesNoShrinkInputs">
<!--
Inner build only: runs assembly modifications (FixAbstractMethods, AddKeepAlives, etc.)
BEFORE crossgen2 creates R2R images. ResolvedAssemblies is empty in the inner build
because the Android-specific _ResolveAssemblies target only runs in the outer build,
so we gather assemblies from ResolvedFileToPublish instead.

Mark every DLL as HasMonoAndroidReference so FixAbstractMethodsStep inspects them;
the step's own MightNeedFix() guard (IsSubclassOf("Java.Lang.Object")) filters out
non-binding types.

Assemblies are copied to an intermediate directory (not modified in-place) because
ResolvedFileToPublish items may point to shared locations (NuGet cache, runtime packs)
that must not be mutated. After the task runs, ResolvedFileToPublish is updated to
point to the intermediate copies so that downstream targets (R2R, publish) pick them up.
-->
<Target Name="_LinkAssembliesNoShrink"
BeforeTargets="_PrepareForReadyToRunCompilation"
Condition=" '$(PublishTrimmed)' != 'true' and '$(_ComputeFilesToPublishForRuntimeIdentifiers)' == 'true' ">
<PropertyGroup>
<_LinkAssembliesNoShrinkDir>$(IntermediateOutputPath)android\linked-noshrink\</_LinkAssembliesNoShrinkDir>
</PropertyGroup>
<!-- Compute ABI from RuntimeIdentifier since _ResolveAndroidTooling doesn't run in the inner build -->
<RuntimeIdentifierToAbi RuntimeIdentifier="$(RuntimeIdentifier)">
<Output TaskParameter="SupportedAbis" PropertyName="_LinkAssembliesNoShrinkAbi" />
</RuntimeIdentifierToAbi>
<ItemGroup>
<!-- We need this in its own item group so it isn't lost during a partial build -->
<_AllResolvedAssemblies Include="@(ResolvedAssemblies)" />
<_ResolvedFileToPublishDlls Include="@(ResolvedFileToPublish)" Condition=" '%(Extension)' == '.dll' ">
<HasMonoAndroidReference>True</HasMonoAndroidReference>
<Abi>$(_LinkAssembliesNoShrinkAbi)</Abi>
</_ResolvedFileToPublishDlls>
</ItemGroup>
</Target>

<Target Name="_LinkAssembliesNoShrink"
DependsOnTargets="_LinkAssembliesNoShrinkInputs"
Condition="'$(PublishTrimmed)' != 'true'"
Inputs="@(ResolvedAssemblies);$(_AndroidBuildPropertiesCache)"
Outputs="@(ResolvedAssemblies->'$(MonoAndroidIntermediateAssemblyDir)%(DestinationSubPath)')">
<LinkAssembliesNoShrink
ApplicationJavaClass="$(AndroidApplicationJavaClass)"
CodeGenerationTarget="$(AndroidCodegenTarget)"
Debug="$(AndroidIncludeDebugSymbols)"
EnableMarshalMethods="$(_AndroidUseMarshalMethods)"
ErrorOnCustomJavaObject="$(AndroidErrorOnCustomJavaObject)"
PackageNamingPolicy="$(AndroidPackageNamingPolicy)"
ResolvedAssemblies="@(_AllResolvedAssemblies)"
ResolvedUserAssemblies="@(ResolvedUserAssemblies)"
SourceFiles="@(ResolvedAssemblies)"
DestinationFiles="@(ResolvedAssemblies->'$(MonoAndroidIntermediateAssemblyDir)%(DestinationSubPath)')"
ResolvedAssemblies="@(_ResolvedFileToPublishDlls)"
ResolvedUserAssemblies="@(_ResolvedFileToPublishDlls)"
SourceFiles="@(_ResolvedFileToPublishDlls)"
DestinationFiles="@(_ResolvedFileToPublishDlls->'$(_LinkAssembliesNoShrinkDir)%(RelativePath)')"
TargetName="$(TargetName)"
AddKeepAlives="$(AndroidAddKeepAlives)"
UseDesignerAssembly="$(AndroidUseDesignerAssembly)"
Deterministic="$(Deterministic)"
ReadSymbols="$(_AndroidLinkAssembliesReadSymbols)">
</LinkAssembliesNoShrink>

<!-- Replace ResolvedFileToPublish DLL items with their intermediate copies.
The item transform preserves all custom metadata (RelativePath, etc.).
PDB items are left untouched — CopyAssemblyAndSymbols already wrote updated
PDBs next to the intermediate DLLs, and the publish pipeline will copy them
from there via the updated DLL paths. -->
<ItemGroup>
<FileWrites Include="$(MonoAndroidIntermediateAssemblyDir)**" />
<ResolvedFileToPublish Remove="@(_ResolvedFileToPublishDlls)" />
<ResolvedFileToPublish Include="@(_ResolvedFileToPublishDlls->'$(_LinkAssembliesNoShrinkDir)%(RelativePath)')" />
<FileWrites Include="$(_LinkAssembliesNoShrinkDir)**" />
</ItemGroup>
</Target>

<!-- Runs additional steps after ILLink runs (_LinkAssemblies) -->
<Target Name="_AfterILLinkAdditionalSteps"
DependsOnTargets="_LinkAssembliesNoShrinkInputs"
Condition="'$(PublishTrimmed)' == 'true'"
Inputs="$(_AndroidLinkFlag)"
Outputs="$(_AdditionalPostLinkerStepsFlag)">
<ItemGroup>
<_AllResolvedAssemblies Include="@(ResolvedAssemblies)" />
</ItemGroup>
<AssemblyModifierPipeline
ApplicationJavaClass="$(AndroidApplicationJavaClass)"
CodeGenerationTarget="$(_AndroidJcwCodegenTarget)"
Expand Down Expand Up @@ -2881,7 +2910,7 @@ because xbuild doesn't support framework reference assemblies.
</Target>

<Target Name="_LinkAssemblies"
DependsOnTargets="_ResolveAssemblies;_CreatePackageWorkspace;$(_BeforeLinkAssemblies);_GenerateJniMarshalMethods;_LinkAssembliesNoShrink"
DependsOnTargets="_ResolveAssemblies;_CreatePackageWorkspace;$(_BeforeLinkAssemblies);_GenerateJniMarshalMethods"
/>

<!-- TypeMap imports must be last so their target overrides (e.g. _RemoveRegisterAttribute) take precedence -->
Expand Down
Loading