Skip to content

Commit ebcf2bd

Browse files
Fix XALNS7015: run _LinkAssembliesNoShrink before R2R in non-trimmed builds
Move _LinkAssembliesNoShrink from the outer build into the inner (per-RID) build using BeforeTargets="_PrepareForReadyToRunCompilation". This ensures assembly modifications (FixAbstractMethods, AddKeepAlives, FindJavaObjects, etc.) operate on pure IL assemblies BEFORE crossgen2 creates R2R images, preventing Mono.Cecil from attempting to write mixed-mode assemblies. Changes: - Rewrite _LinkAssembliesNoShrink to run in the inner build, consuming @(ResolvedFileToPublish) instead of @(ResolvedAssemblies), writing to an intermediate linked-noshrink/ directory - Properly classify framework vs user assemblies by known names (matching the trimmed path in _AfterILLinkAdditionalSteps) - Update ResolvedFileToPublish so R2R and publish consume modified copies - Simplify _PrepareAssemblies: populate _ResolvedAssemblies unconditionally from @(ResolvedAssemblies) (no longer redirect through intermediate dir) - Extend _CopySidecarXmlToAssemblyPaths to handle both trimmed (linked/) and non-trimmed (android/linked-noshrink/) sidecar XML files - Remove _LinkAssembliesNoShrink from _LinkAssemblies DependsOnTargets - Remove Assert.Ignore workarounds in BuildTest.SimilarAndroidXAssemblyNames and LinkerTests.AndroidAddKeepAlives for CoreCLR non-trimmed Release builds Fixes: #11025 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent d344c9a commit ebcf2bd

4 files changed

Lines changed: 112 additions & 76 deletions

File tree

src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.AssemblyResolution.targets

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -206,20 +206,18 @@ _ResolveAssemblies MSBuild target.
206206

207207
<Target Name="_PrepareAssemblies"
208208
DependsOnTargets="$(_PrepareAssembliesDependsOnTargets)">
209+
<ItemGroup>
210+
<_ResolvedAssemblies Include="@(ResolvedAssemblies)" />
211+
<_ResolvedUserAssemblies Include="@(ResolvedUserAssemblies)" />
212+
<_ResolvedFrameworkAssemblies Include="@(ResolvedFrameworkAssemblies)" />
213+
<_ResolvedSymbols Include="@(ResolvedSymbols)" />
214+
</ItemGroup>
209215
<ItemGroup Condition=" '$(PublishTrimmed)' != 'true' ">
210-
<_ResolvedAssemblies Include="@(ResolvedAssemblies->'$(MonoAndroidIntermediateAssemblyDir)%(DestinationSubPath)')" Condition=" '%(DestinationSubPath)' != '' " />
211-
<_ResolvedUserAssemblies Include="@(ResolvedUserAssemblies->'$(MonoAndroidIntermediateAssemblyDir)%(DestinationSubPath)')" Condition=" '%(DestinationSubPath)' != '' " />
212-
<_ResolvedFrameworkAssemblies Include="@(ResolvedFrameworkAssemblies->'$(MonoAndroidIntermediateAssemblyDir)%(DestinationSubPath)')" Condition=" '%(DestinationSubPath)' != '' " />
213-
<_ResolvedSymbols Include="@(ResolvedSymbols->'$(MonoAndroidIntermediateAssemblyDir)%(DestinationSubPath)')" Condition=" '%(DestinationSubPath)' != '' " />
214216
<_ShrunkAssemblies Include="@(_ResolvedAssemblies)" />
215217
<_ShrunkUserAssemblies Include="@(_ResolvedUserAssemblies)" />
216218
<_ShrunkFrameworkAssemblies Include="@(_ResolvedFrameworkAssemblies)" />
217219
</ItemGroup>
218220
<ItemGroup Condition=" '$(PublishTrimmed)' == 'true' ">
219-
<_ResolvedAssemblies Include="@(ResolvedAssemblies)" />
220-
<_ResolvedUserAssemblies Include="@(ResolvedUserAssemblies)" />
221-
<_ResolvedFrameworkAssemblies Include="@(ResolvedFrameworkAssemblies)" />
222-
<_ResolvedSymbols Include="@(ResolvedSymbols)" />
223221
<_ShrunkFrameworkAssemblies
224222
Include="@(_ShrunkAssemblies)"
225223
Condition=" '%(_ShrunkAssemblies.FrameworkAssembly)' == 'true' "

src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/BuildTest.cs

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2178,21 +2178,6 @@ public void CheckLintResourceFileReferencesAreFixed ([Values] AndroidRuntime run
21782178
// TODO: [TestCase (false, AndroidRuntime.NativeAOT)]
21792179
public void SimilarAndroidXAssemblyNames (bool publishTrimmed, AndroidRuntime runtime)
21802180
{
2181-
if (!publishTrimmed && runtime == AndroidRuntime.CoreCLR) {
2182-
// This currently fails with the following exception:
2183-
//
2184-
// error XALNS7015: System.NotSupportedException: Writing mixed-mode assemblies is not supported
2185-
// at Mono.Cecil.ModuleWriter.Write(ModuleDefinition module, Disposable`1 stream, WriterParameters parameters)
2186-
// at Mono.Cecil.ModuleWriter.WriteModule(ModuleDefinition module, Disposable`1 stream, WriterParameters parameters)
2187-
// at Mono.Cecil.ModuleDefinition.Write(String fileName, WriterParameters parameters)
2188-
// at Mono.Cecil.AssemblyDefinition.Write(String fileName, WriterParameters parameters)
2189-
// at Xamarin.Android.Tasks.SaveChangedAssemblyStep.ProcessAssembly(AssemblyDefinition assembly, StepContext context) in src/Xamarin.Android.Build.Tasks/Tasks/AssemblyModifierPipeline.cs:line 197
2190-
// at Xamarin.Android.Tasks.AssemblyPipeline.Run(AssemblyDefinition assembly, StepContext context) in src/Xamarin.Android.Build.Tasks/Utilities/AssemblyPipeline.cs:line 26
2191-
// at Xamarin.Android.Tasks.AssemblyModifierPipeline.RunPipeline(AssemblyPipeline pipeline, ITaskItem source, ITaskItem destination) in src/Xamarin.Android.Build.Tasks/Tasks/AssemblyModifierPipeline.cs:line 175
2192-
Assert.Ignore ("CoreCLR: fails because of a Mono.Cecil lack of support");
2193-
return;
2194-
}
2195-
21962181
bool aotAssemblies = runtime == AndroidRuntime.MonoVM && publishTrimmed;
21972182
var proj = new XamarinAndroidApplicationProject {
21982183
IsRelease = true,

src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Tasks/LinkerTests.cs

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -469,22 +469,6 @@ public void AndroidAddKeepAlives (bool isRelease, bool setAndroidAddKeepAlivesTr
469469
return;
470470
}
471471

472-
if (runtime == AndroidRuntime.CoreCLR && isRelease && !setAndroidAddKeepAlivesTrue && setLinkModeNone && shouldAddKeepAlives) {
473-
// This currently fails with the following exception:
474-
//
475-
// error XALNS7015: System.NotSupportedException: Writing mixed-mode assemblies is not supported
476-
// at Mono.Cecil.ModuleWriter.Write(ModuleDefinition module, Disposable`1 stream, WriterParameters parameters)
477-
// at Mono.Cecil.ModuleWriter.WriteModule(ModuleDefinition module, Disposable`1 stream, WriterParameters parameters)
478-
// at Mono.Cecil.ModuleDefinition.Write(String fileName, WriterParameters parameters)
479-
// at Mono.Cecil.AssemblyDefinition.Write(String fileName, WriterParameters parameters)
480-
// at Xamarin.Android.Tasks.SaveChangedAssemblyStep.ProcessAssembly(AssemblyDefinition assembly, StepContext context) in src/Xamarin.Android.Build.Tasks/Tasks/AssemblyModifierPipeline.cs:line 197
481-
// at Xamarin.Android.Tasks.AssemblyPipeline.Run(AssemblyDefinition assembly, StepContext context) in src/Xamarin.Android.Build.Tasks/Utilities/AssemblyPipeline.cs:line 26
482-
// at Xamarin.Android.Tasks.AssemblyModifierPipeline.RunPipeline(AssemblyPipeline pipeline, ITaskItem source, ITaskItem destination) in src/Xamarin.Android.Build.Tasks/Tasks/AssemblyModifierPipeline.cs:line 175
483-
// at Xamarin.Android.Tasks.AssemblyModifierPipeline.RunTask() in src/Xamarin.Android.Build.Tasks/Tasks/AssemblyModifierPipeline.cs:line 123
484-
Assert.Ignore ("CoreCLR: fails because of a Mono.Cecil lack of support");
485-
return;
486-
};
487-
488472
var proj = new XamarinAndroidApplicationProject {
489473
IsRelease = isRelease,
490474
OtherBuildItems = {

src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.targets

Lines changed: 106 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1419,38 +1419,98 @@ because xbuild doesn't support framework reference assemblies.
14191419
<Error Text="%24(AndroidGenerateJniMarshalMethods)=True is not supported at this time." />
14201420
</Target>
14211421

1422-
<Target Name="_LinkAssembliesNoShrinkInputs">
1422+
<!--
1423+
Inner build only: runs assembly modifications (FixAbstractMethods, FixLegacyResourceDesigner,
1424+
AddKeepAlives, FindJavaObjects, SaveChangedAssembly, FindTypeMapObjects) for non-trimmed builds
1425+
BEFORE crossgen2 creates R2R images.
1426+
1427+
@(ResolvedAssemblies) is empty in the inner build (the Android-specific _ResolveAssemblies
1428+
target only runs in the outer build), so we gather assemblies from @(ResolvedFileToPublish).
1429+
1430+
Assemblies are copied to an intermediate directory (not modified in-place) because
1431+
ResolvedFileToPublish items may point to shared locations (NuGet cache, runtime packs)
1432+
that must not be mutated. After the task runs, ResolvedFileToPublish is updated to point
1433+
to the intermediate copies so that downstream targets (R2R, publish) pick them up.
1434+
1435+
The condition '$(_ComputeFilesToPublishForRuntimeIdentifiers)' == 'true' ensures this only
1436+
runs in the inner build. In the outer build the target is a no-op, so existing dependency
1437+
chain references are harmlessly satisfied.
1438+
-->
1439+
<Target Name="_LinkAssembliesNoShrink"
1440+
BeforeTargets="_PrepareForReadyToRunCompilation"
1441+
Condition=" '$(PublishTrimmed)' != 'true' and '$(_ComputeFilesToPublishForRuntimeIdentifiers)' == 'true' ">
1442+
<PropertyGroup>
1443+
<_LinkAssembliesNoShrinkDir>$(IntermediateOutputPath)android\linked-noshrink\</_LinkAssembliesNoShrinkDir>
1444+
</PropertyGroup>
1445+
1446+
<!-- Compute ABI from RuntimeIdentifier since _ResolveAndroidTooling doesn't run in the inner build -->
1447+
<RuntimeIdentifierToAbi RuntimeIdentifier="$(RuntimeIdentifier)">
1448+
<Output TaskParameter="SupportedAbis" PropertyName="_LinkAssembliesNoShrinkAbi" />
1449+
</RuntimeIdentifierToAbi>
1450+
1451+
<!-- Collect all DLL files from ResolvedFileToPublish and set Abi metadata -->
14231452
<ItemGroup>
1424-
<!-- We need this in its own item group so it isn't lost during a partial build -->
1425-
<_AllResolvedAssemblies Include="@(ResolvedAssemblies)" />
1453+
<_LinkNoShrinkAllAssemblies Include="@(ResolvedFileToPublish)" Condition=" '%(Extension)' == '.dll' ">
1454+
<Abi>$(_LinkAssembliesNoShrinkAbi)</Abi>
1455+
</_LinkNoShrinkAllAssemblies>
1456+
</ItemGroup>
1457+
1458+
<!-- Ensure the root assembly has HasMonoAndroidReference=true so that IsAndroidAssembly()
1459+
returns true for it in FindJavaObjectsStep and FixAbstractMethodsStep -->
1460+
<ItemGroup>
1461+
<_LinkNoShrinkAllAssemblies
1462+
Update="@(_LinkNoShrinkAllAssemblies)"
1463+
Condition=" '%(Filename)' == '$(TargetName)' "
1464+
HasMonoAndroidReference="true" />
1465+
</ItemGroup>
1466+
1467+
<!-- Classify user vs framework assemblies for FindJavaObjectsStep.
1468+
Framework assemblies (Mono.Android, Java.Interop, etc.) already have their JCWs
1469+
pre-built in mono.android.jar — marking them as user assemblies would cause
1470+
duplicate JCW generation that conflicts at Java compilation time.
1471+
Filter by the same 4 known framework assembly names used by
1472+
MonoAndroidHelper.IsFrameworkAssembly(string). -->
1473+
<ItemGroup>
1474+
<_LinkNoShrinkUserAssemblies Include="@(_LinkNoShrinkAllAssemblies)"
1475+
Condition=" '%(Filename)' != 'Mono.Android' and '%(Filename)' != 'Mono.Android.Export' and '%(Filename)' != 'Mono.Android.Runtime' and '%(Filename)' != 'Java.Interop' " />
14261476
</ItemGroup>
1427-
</Target>
14281477

1429-
<Target Name="_LinkAssembliesNoShrink"
1430-
DependsOnTargets="_LinkAssembliesNoShrinkInputs"
1431-
Condition="'$(PublishTrimmed)' != 'true'"
1432-
Inputs="@(ResolvedAssemblies);$(_AndroidBuildPropertiesCache)"
1433-
Outputs="@(ResolvedAssemblies->'$(MonoAndroidIntermediateAssemblyDir)%(DestinationSubPath)')">
14341478
<LinkAssembliesNoShrink
14351479
ApplicationJavaClass="$(AndroidApplicationJavaClass)"
14361480
CodeGenerationTarget="$(AndroidCodegenTarget)"
14371481
Debug="$(AndroidIncludeDebugSymbols)"
14381482
EnableMarshalMethods="$(_AndroidUseMarshalMethods)"
14391483
ErrorOnCustomJavaObject="$(AndroidErrorOnCustomJavaObject)"
14401484
PackageNamingPolicy="$(AndroidPackageNamingPolicy)"
1441-
ResolvedAssemblies="@(_AllResolvedAssemblies)"
1442-
ResolvedUserAssemblies="@(ResolvedUserAssemblies)"
1443-
SourceFiles="@(ResolvedAssemblies)"
1444-
DestinationFiles="@(ResolvedAssemblies->'$(MonoAndroidIntermediateAssemblyDir)%(DestinationSubPath)')"
1485+
ResolvedAssemblies="@(_LinkNoShrinkAllAssemblies)"
1486+
ResolvedUserAssemblies="@(_LinkNoShrinkUserAssemblies)"
1487+
SourceFiles="@(_LinkNoShrinkAllAssemblies)"
1488+
DestinationFiles="@(_LinkNoShrinkAllAssemblies->'$(_LinkAssembliesNoShrinkDir)%(RelativePath)')"
14451489
TargetName="$(TargetName)"
14461490
AddKeepAlives="$(AndroidAddKeepAlives)"
14471491
UseDesignerAssembly="$(AndroidUseDesignerAssembly)"
14481492
Deterministic="$(Deterministic)"
14491493
ReadSymbols="$(_AndroidLinkAssembliesReadSymbols)">
14501494
</LinkAssembliesNoShrink>
14511495

1496+
<!-- Replace ResolvedFileToPublish DLL items with their intermediate copies so that
1497+
downstream targets (R2R, publish) consume the modified assemblies. -->
1498+
<ItemGroup>
1499+
<ResolvedFileToPublish Remove="@(_LinkNoShrinkAllAssemblies)" />
1500+
<ResolvedFileToPublish Include="@(_LinkNoShrinkAllAssemblies->'$(_LinkAssembliesNoShrinkDir)%(RelativePath)')" />
1501+
<FileWrites Include="$(_LinkAssembliesNoShrinkDir)**" />
1502+
</ItemGroup>
1503+
1504+
<ItemGroup>
1505+
<FileWrites Include="@(_LinkNoShrinkAllAssemblies->'$(_LinkAssembliesNoShrinkDir)%(RelativePath)')" />
1506+
<FileWrites Include="@(_LinkNoShrinkAllAssemblies->'$(_LinkAssembliesNoShrinkDir)%(Filename).jlo.xml')" />
1507+
<FileWrites Include="@(_LinkNoShrinkAllAssemblies->'$(_LinkAssembliesNoShrinkDir)%(Filename).typemap.xml')" />
1508+
</ItemGroup>
1509+
1510+
<!-- Clean up temporary item groups -->
14521511
<ItemGroup>
1453-
<FileWrites Include="$(MonoAndroidIntermediateAssemblyDir)**" />
1512+
<_LinkNoShrinkAllAssemblies Remove="@(_LinkNoShrinkAllAssemblies)" />
1513+
<_LinkNoShrinkUserAssemblies Remove="@(_LinkNoShrinkUserAssemblies)" />
14541514
</ItemGroup>
14551515
</Target>
14561516

@@ -1595,23 +1655,27 @@ because xbuild doesn't support framework reference assemblies.
15951655
<!--
15961656
_CopySidecarXmlToAssemblyPaths
15971657
===============================
1598-
When _AfterILLinkAdditionalSteps runs in the inner build (AfterTargets="ILLink"), it generates
1599-
sidecar XML files next to the trimmed assemblies in $(IntermediateLinkDir):
1658+
When _AfterILLinkAdditionalSteps (trimmed) or _LinkAssembliesNoShrink (non-trimmed) runs
1659+
in the inner build, it generates sidecar XML files next to the processed assemblies:
16001660
- .jlo.xml (Java-like objects found by FindJavaObjectsStep)
16011661
- .typemap.xml (type mappings found by FindTypeMapObjectsStep)
16021662
1603-
After ILLink, subsequent inner-build steps (CreateReadyToRunImages, IlcCompile, AOT) may move
1604-
assemblies to different directories (e.g. R2R/, publish/). The sidecar XML files stay in linked/.
1663+
For trimmed builds, these reside in $(IntermediateLinkDir) (linked/).
1664+
For non-trimmed builds, these reside in android/linked-noshrink/.
1665+
1666+
After assembly processing, subsequent inner-build steps (CreateReadyToRunImages, IlcCompile, AOT)
1667+
may move assemblies to different directories (e.g. R2R/, publish/). The sidecar XML files stay
1668+
in their original directory.
16051669
16061670
The outer build's _GenerateJavaStubs and GenerateTypeMappings expect these files next to the
16071671
assembly paths in @(_ResolvedAssemblies) (which may point to R2R/, publish/, etc.).
1608-
This target copies sidecar XML files from linked/ to those locations.
1672+
This target copies sidecar XML files from the inner build directory to those locations.
16091673
1610-
Only runs in the outer build (_ComputeFilesToPublishForRuntimeIdentifiers != 'true') for trimmed builds.
1674+
Only runs in the outer build (_ComputeFilesToPublishForRuntimeIdentifiers != 'true').
16111675
-->
16121676
<Target Name="_CopySidecarXmlToAssemblyPaths"
16131677
AfterTargets="_PrepareAssemblies"
1614-
Condition=" '$(PublishTrimmed)' == 'true' and '$(_ComputeFilesToPublishForRuntimeIdentifiers)' != 'true' ">
1678+
Condition=" '$(_ComputeFilesToPublishForRuntimeIdentifiers)' != 'true' ">
16151679

16161680
<!-- Separate R2R composite assemblies (e.g. UnnamedProject.r2r.dll) from regular assemblies.
16171681
R2R composites are produced by CreateReadyToRunImages AFTER ILLink by merging individual
@@ -1640,36 +1704,41 @@ because xbuild doesn't support framework reference assemblies.
16401704
Files="@(_MissingR2RCompositeSidecarFiles)"
16411705
AlwaysCreate="true" />
16421706

1643-
<!-- Compute the path to the inner build's linked/ directory where sidecar XML files reside.
1707+
<!-- Compute the path to the inner build's sidecar directory where XML files reside.
1708+
For trimmed builds, sidecar files are in linked/ (alongside ILLink output).
1709+
For non-trimmed builds, sidecar files are in android/linked-noshrink/ (alongside
1710+
_LinkAssembliesNoShrink output).
16441711
The inner build is dispatched by _ResolveAssemblies with AppendRuntimeIdentifierToOutputPath=true,
16451712
so its IntermediateOutputPath is always $(OuterIntermediateOutputPath)$(RuntimeIdentifier)/.
16461713
In the outer build:
1647-
- Multi-RID (RuntimeIdentifier == ''): use $(IntermediateOutputPath)%(RuntimeIdentifier)/linked/
1714+
- Multi-RID (RuntimeIdentifier == ''): use $(IntermediateOutputPath)%(RuntimeIdentifier)/<subdir>/
16481715
- Single-RID (RuntimeIdentifier != ''): $(IntermediateOutputPath) may or may not already
1649-
contain the RID. If it does (normal SDK behavior), use $(IntermediateOutputPath)linked/.
1716+
contain the RID. If it does (normal SDK behavior), use $(IntermediateOutputPath)<subdir>/.
16501717
If it doesn't (e.g. RuntimeIdentifier set after path evaluation), append the RID first. -->
1718+
<PropertyGroup>
1719+
<_SidecarSubDir Condition=" '$(PublishTrimmed)' == 'true' ">linked\</_SidecarSubDir>
1720+
<_SidecarSubDir Condition=" '$(PublishTrimmed)' != 'true' ">android\linked-noshrink\</_SidecarSubDir>
1721+
</PropertyGroup>
16511722
<PropertyGroup Condition=" '$(RuntimeIdentifier)' != '' ">
1652-
<_SidecarLinkedDir Condition=" $(IntermediateOutputPath.Replace('\','/').TrimEnd('/').EndsWith('$(RuntimeIdentifier)')) ">$(IntermediateOutputPath)linked\</_SidecarLinkedDir>
1653-
<_SidecarLinkedDir Condition=" '$(_SidecarLinkedDir)' == '' ">$(IntermediateOutputPath)$(RuntimeIdentifier)\linked\</_SidecarLinkedDir>
1723+
<_SidecarLinkedDir Condition=" $(IntermediateOutputPath.Replace('\','/').TrimEnd('/').EndsWith('$(RuntimeIdentifier)')) ">$(IntermediateOutputPath)$(_SidecarSubDir)</_SidecarLinkedDir>
1724+
<_SidecarLinkedDir Condition=" '$(_SidecarLinkedDir)' == '' ">$(IntermediateOutputPath)$(RuntimeIdentifier)\$(_SidecarSubDir)</_SidecarLinkedDir>
16541725
</PropertyGroup>
16551726
<ItemGroup Condition=" '$(RuntimeIdentifier)' == '' ">
1656-
<_SidecarXmlCopySource Include="@(_NonCompositeAssemblies->'$(IntermediateOutputPath)%(RuntimeIdentifier)\linked\%(Filename).jlo.xml')" />
1657-
<_SidecarXmlCopySource Include="@(_NonCompositeAssemblies->'$(IntermediateOutputPath)%(RuntimeIdentifier)\linked\%(Filename).typemap.xml')" />
1727+
<_SidecarXmlCopySource Include="@(_NonCompositeAssemblies->'$(IntermediateOutputPath)%(RuntimeIdentifier)\$(_SidecarSubDir)%(Filename).jlo.xml')" />
1728+
<_SidecarXmlCopySource Include="@(_NonCompositeAssemblies->'$(IntermediateOutputPath)%(RuntimeIdentifier)\$(_SidecarSubDir)%(Filename).typemap.xml')" />
16581729
</ItemGroup>
16591730
<ItemGroup Condition=" '$(RuntimeIdentifier)' != '' ">
16601731
<_SidecarXmlCopySource Include="@(_NonCompositeAssemblies->'$(_SidecarLinkedDir)%(Filename).jlo.xml')" />
16611732
<_SidecarXmlCopySource Include="@(_NonCompositeAssemblies->'$(_SidecarLinkedDir)%(Filename).typemap.xml')" />
16621733
</ItemGroup>
16631734

1664-
<!-- Some assemblies (e.g. _Microsoft.Android.Resource.Designer.dll) end up in linked/ but were
1665-
NOT processed by AssemblyModifierPipeline (they weren't in @(ManagedAssemblyToLink) at ILLink
1666-
time). They have no sidecar files in linked/. Create empty (zero-length) sidecar files for
1667-
them so the Copy below doesn't fail. Zero-length = "not scanned" which is correct.
1735+
<!-- Some assemblies (e.g. _Microsoft.Android.Resource.Designer.dll) end up in the assembly
1736+
output but were NOT processed by the assembly modification pipeline. They have no sidecar
1737+
files. Create empty (zero-length) sidecar files for them so the Copy below doesn't fail.
1738+
Zero-length = "not scanned" which is correct.
16681739
1669-
The linked/ directory may not exist if the RID changed between builds without a clean
1670-
(e.g. switching from android-arm64 to android-x64 via RuntimeIdentifier parameter while
1671-
RuntimeIdentifiers still points to the old RID). In that case the inner build ran for the
1672-
old RID and never created the new RID's linked/ directory. MakeDir ensures it exists.
1740+
The sidecar directory may not exist if the RID changed between builds without a clean.
1741+
MakeDir ensures it exists.
16731742
16741743
Only touch files that don't already exist to preserve timestamps and avoid breaking
16751744
incremental builds (Copy SkipUnchangedFiles="true" compares timestamps). -->
@@ -3109,7 +3178,7 @@ because xbuild doesn't support framework reference assemblies.
31093178
</Target>
31103179

31113180
<Target Name="_LinkAssemblies"
3112-
DependsOnTargets="_ResolveAssemblies;_CreatePackageWorkspace;$(_BeforeLinkAssemblies);_GenerateJniMarshalMethods;_LinkAssembliesNoShrink"
3181+
DependsOnTargets="_ResolveAssemblies;_CreatePackageWorkspace;$(_BeforeLinkAssemblies);_GenerateJniMarshalMethods"
31133182
/>
31143183

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

0 commit comments

Comments
 (0)