Skip to content

Commit eac51f2

Browse files
committed
Progress towards per-assembly DSOs
1 parent de47560 commit eac51f2

File tree

3 files changed

+147
-24
lines changed

3 files changed

+147
-24
lines changed

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

Lines changed: 85 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
<UsingTask TaskName="Xamarin.Android.Tasks.GenerateJniRemappingNativeCode" AssemblyFile="$(_XamarinAndroidBuildTasksAssembly)" />
77
<UsingTask TaskName="Xamarin.Android.Tasks.LinkApplicationSharedLibraries" AssemblyFile="$(_XamarinAndroidBuildTasksAssembly)" />
88
<UsingTask TaskName="Xamarin.Android.Tasks.PrepareAbiItems" AssemblyFile="$(_XamarinAndroidBuildTasksAssembly)" />
9+
<UsingTask TaskName="Xamarin.Android.Tasks.PrepareStandaloneAssemblyDSOItems" AssemblyFile="$(_XamarinAndroidBuildTasksAssembly)" />
910

1011
<PropertyGroup>
1112
<_AndroidUseAssemblySharedLibraries Condition=" '$(EmbedAssembliesIntoApk)' != 'true' or '$(AndroidIncludeDebugSymbols)' == 'true' ">false</_AndroidUseAssemblySharedLibraries>
@@ -57,16 +58,42 @@
5758
</PrepareAbiItems>
5859
</Target>
5960

60-
<Target Name="_PrepareAssemblySharedLibrariesSources"
61-
Condition=" '$(_AndroidUseAssemblySharedLibraries)' == 'true' ">
61+
<Target Name="_PrepareAssemblyDSOSources">
62+
63+
<!-- These assemblies data will be placed in `libxamarin-app.so` instead of in
64+
individual shared libraries. This group should, in principle, include those
65+
assemblies which are involved in the runtime startup process (before we call
66+
the main activity's OnCreate -->
67+
<ItemGroup>
68+
<_DSOFastPathAssembly Include="Java.Interop.dll" />
69+
<_DSOFastPathAssembly Include="Mono.Android.Runtime.dll" />
70+
<_DSOFastPathAssembly Include="Mono.Android.dll" />
71+
<_DSOFastPathAssembly Include="System.Private.CoreLib.dll" />
72+
<_DSOFastPathAssembly Include="System.Runtime" />
73+
<_DSOFastPathAssembly Include="$(AssemblyName).dll" />
74+
</ItemGroup>
75+
76+
<!-- These source files will be built into `libxamarin-app.so` and will include data
77+
of the above assemblies -->
6278
<PrepareAbiItems
6379
BuildTargetAbis="@(_BuildTargetAbis)"
6480
NativeSourcesDir="$(_NativeAssemblySourceDir)"
6581
InstantRunEnabled="$(_InstantRunEnabled)"
6682
Debug="$(AndroidIncludeDebugSymbols)"
6783
Mode="assembly_dsos">
68-
<Output TaskParameter="AssemblySources" ItemName="_AssemblyDSOSource" />
84+
<Output TaskParameter="AssemblySources" ItemName="_AssemblyDSOSourceApplication" />
6985
</PrepareAbiItems>
86+
87+
<!-- These sources will be used to build per-assembly shared libraries. Each of the
88+
returned files will be compiled into its own .so library -->
89+
<PrepareStandaloneAssemblyDSOItems
90+
Condition=" '$(_AndroidUseAssemblySharedLibraries)' == 'true' "
91+
Assemblies="@(_ResolvedUserAssemblies);@(_ResolvedFrameworkAssemblies);@(_AndroidResolvedSatellitePaths)"
92+
SupportedAbis="@(_BuildTargetAbis)"
93+
NativeSourcesDir="$(_NativeAssemblySourceDir)"
94+
FastPathAssemblies="@(_DSOFastPathAssembly)">
95+
<Output TaskParameter="AssemblySources" ItemName="_AssemblyDSOSourceStandalone" />
96+
</PrepareStandaloneAssemblyDSOItems>
7097
</Target>
7198

7299
<Target Name="_PrepareAndroidRemapNativeAssemblySources">
@@ -102,7 +129,7 @@
102129
<abi>%(_AndroidRemapAssemblySource.abi)</abi>
103130
</_NativeAssemblyTarget>
104131

105-
<_NativeAssemblyTarget Include="@(_AssemblyDSOSource->'$([System.IO.Path]::ChangeExtension('%(Identity)', '.o'))')">
132+
<_NativeAssemblyTarget Include="@(_AssemblyDSOSourceApplication->'$([System.IO.Path]::ChangeExtension('%(Identity)', '.o'))')">
106133
<abi>%(_AssemblyDSOSource.abi)</abi>
107134
</_NativeAssemblyTarget>
108135
</ItemGroup>
@@ -116,31 +143,37 @@
116143
</ItemGroup>
117144
</Target>
118145

119-
<Target Name="_PrepareDSOFastPathAssemblyNames">
120-
<ItemGroup>
121-
<_DSOFastPathAssembly Include="Java.Interop.dll" />
122-
<_DSOFastPathAssembly Include="Mono.Android.Runtime.dll" />
123-
<_DSOFastPathAssembly Include="Mono.Android.dll" />
124-
<_DSOFastPathAssembly Include="System.Private.CoreLib.dll" />
125-
<_DSOFastPathAssembly Include="System.Runtime" />
126-
<_DSOFastPathAssembly Include="$(AndroidApplication)" />
127-
</ItemGroup>
146+
<!-- Native source code generation targets -->
147+
<Target Name="_GenerateApplicationAssemblyDsoNativeSourceFiles"
148+
Condition=" '$(_AndroidUseAssemblySharedLibraries)' == 'true' "
149+
Inputs="@(_ResolvedUserAssemblies);@(_ResolvedFrameworkAssemblies);@(_AndroidResolvedSatellitePaths)"
150+
Outputs="@(_AssemblyDSOSourceApplication)">
151+
<!-- TODO:
152+
* Pass items produced by the _CreateStandaloneAssemblyDSOs target and use metadata when generating the
153+
source to be included in libxamarin-app.so
154+
-->
155+
<GenerateAssemblyDsoNativeSourceFiles
156+
SourcesOutputDirectory="$(_NativeAssemblySourceDir)"
157+
CompressedAssembliesOutputDirectory="$(_CompressedAssembliesOutputDir)"
158+
SupportedAbis="@(_BuildTargetAbis)"
159+
Assemblies="@(_ResolvedUserAssemblies);@(_ResolvedFrameworkAssemblies);@(_AndroidResolvedSatellitePaths)"
160+
FastPathAssemblyNames="@(_DSOFastPathAssembly)"
161+
EnableCompression="$(AndroidEnableAssemblyCompression)"
162+
StandaloneOnly="false" />
128163
</Target>
129164

130-
<!-- Native source code generation targets -->
131-
<Target Name="_GenerateAssemblyDsoNativeSourceFiles"
132-
DependsOnTargets="_PrepareDSOFastPathAssemblyNames"
165+
<Target Name="_GenerateStandaloneAssemblyDsoNativeSourceFiles"
133166
Condition=" '$(_AndroidUseAssemblySharedLibraries)' == 'true' "
134167
Inputs="@(_ResolvedUserAssemblies);@(_ResolvedFrameworkAssemblies);@(_AndroidResolvedSatellitePaths)"
135-
Outputs="@(_AssemblyDSOSource)">
168+
Outputs="(@_AssemblyDSOSourceStandalone)">
136169
<GenerateAssemblyDsoNativeSourceFiles
137170
SourcesOutputDirectory="$(_NativeAssemblySourceDir)"
138171
CompressedAssembliesOutputDirectory="$(_CompressedAssembliesOutputDir)"
139172
SupportedAbis="@(_BuildTargetAbis)"
140173
Assemblies="@(_ResolvedUserAssemblies);@(_ResolvedFrameworkAssemblies);@(_AndroidResolvedSatellitePaths)"
141174
FastPathAssemblyNames="@(_DSOFastPathAssembly)"
142175
EnableCompression="$(AndroidEnableAssemblyCompression)"
143-
/>
176+
StandaloneOnly="true" />
144177
</Target>
145178

146179
<Target Name="_GenerateEmptyAndroidRemapNativeCode"
@@ -182,12 +215,17 @@
182215
</Target>
183216

184217
<!-- Native code compilation targets -->
185-
<Target Name="_CompileNativeAssemblySources"
186-
DependsOnTargets="_PrepareAssemblySharedLibrariesSources;_PrepareNativeAssemblyItems;_GenerateCompressedAssembliesNativeSourceFiles;_GenerateAssemblyDsoNativeSourceFiles"
187-
Inputs="@(_TypeMapAssemblySource);@(_TypeMapAssemblyInclude);@(_EnvironmentAssemblySource);@(_CompressedAssembliesAssemblySource);@(_MarshalMethodsAssemblySource);@(_AndroidRemapAssemblySource);@(_AssemblyDSOSource)"
218+
<Target Name="_CompileAssemblyStandaloneDSOs"
219+
DependsOnTargets="_GenerateStandaloneAssemblyDsoNativeSourceFiles"
220+
Condition=" '$(_AndroidUseAssemblySharedLibraries)' == 'true' ">
221+
</Target>
222+
223+
<Target Name="_CompileApplicationNativeAssemblySources"
224+
DependsOnTargets="_PrepareNativeAssemblyItems;_GenerateApplicationAssemblyDsoNativeSourceFiles;_GenerateCompressedAssembliesNativeSourceFiles"
225+
Inputs="@(_TypeMapAssemblySource);@(_TypeMapAssemblyInclude);@(_EnvironmentAssemblySource);@(_CompressedAssembliesAssemblySource);@(_MarshalMethodsAssemblySource);@(_AndroidRemapAssemblySource);@(_AssemblyDSOSourceApplication)"
188226
Outputs="@(_NativeAssemblyTarget)">
189227
<CompileNativeAssembly
190-
Sources="@(_TypeMapAssemblySource);@(_EnvironmentAssemblySource);@(_CompressedAssembliesAssemblySource);@(_MarshalMethodsAssemblySource);@(_AndroidRemapAssemblySource);@(_AssemblyDSOSource)"
228+
Sources="@(_TypeMapAssemblySource);@(_EnvironmentAssemblySource);@(_CompressedAssembliesAssemblySource);@(_MarshalMethodsAssemblySource);@(_AndroidRemapAssemblySource);@(_AssemblyDSOSourceApplication)"
191229
DebugBuild="$(AndroidIncludeDebugSymbols)"
192230
WorkingDirectory="$(_NativeAssemblySourceDir)"
193231
AndroidBinUtilsDirectory="$(AndroidBinUtilsDirectory)"
@@ -197,9 +235,32 @@
197235
</ItemGroup>
198236
</Target>
199237

200-
<!-- Shared library linking targets -->
238+
<!-- Shared library creation targets -->
239+
<Target Name="_CreateStandaloneAssemblyDSOs"
240+
DependsOnTargets="_CompileAssemblyStandaloneDSOs"
241+
Condition=" '$(_AndroidUseAssemblySharedLibraries)' == 'true' ">
242+
<!-- TODO:
243+
* Link standalone assembly shared libraries
244+
* Return their paths with the following metadata:
245+
* offset into the .so where assembly data begins
246+
* assembly data size
247+
* a flag whether the assembly was compressed
248+
* path to the source assembly
249+
-->
250+
</Target>
251+
252+
<PropertyGroup>
253+
<!-- Order of targets is **crucial** here -->
254+
<_CreateApplicationSharedLibrariesDependsOn>
255+
_PrepareAssemblyDSOSources;
256+
_CreateStandaloneAssemblyDSOs;
257+
_CompileApplicationNativeAssemblySources;
258+
_PrepareApplicationSharedLibraryItems
259+
</_CreateApplicationSharedLibrariesDependsOn>
260+
</PropertyGroup>
261+
201262
<Target Name="_CreateApplicationSharedLibraries"
202-
DependsOnTargets="_CompileNativeAssemblySources;_PrepareApplicationSharedLibraryItems"
263+
DependsOnTargets="$(_CreateApplicationSharedLibrariesDependsOn)"
203264
Inputs="@(_NativeAssemblyTarget)"
204265
Outputs="@(_ApplicationSharedLibrary)">
205266
<LinkApplicationSharedLibraries

src/Xamarin.Android.Build.Tasks/Tasks/GenerateAssemblyDsoNativeSourceFiles.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,9 @@ public class GenerateAssemblyDsoNativeSourceFiles : AndroidTask
3131
[Required]
3232
public string[] FastPathAssemblyNames { get; set; }
3333

34+
[Required]
35+
public bool StandaloneOnly { get; set; }
36+
3437
public override bool RunTask ()
3538
{
3639
Dictionary<AndroidTargetArch, List<DSOAssemblyInfo>> dsoAssembliesInfo = new ();
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
using System;
2+
using System.IO;
3+
using System.Collections.Generic;
4+
5+
using Microsoft.Build.Framework;
6+
using Microsoft.Build.Utilities;
7+
using Microsoft.Android.Build.Tasks;
8+
9+
namespace Xamarin.Android.Tasks;
10+
11+
public class PrepareStandaloneAssemblyDSOItems : AndroidTask
12+
{
13+
public override string TaskPrefix => "PSADI";
14+
15+
[Required]
16+
public ITaskItem[] Assemblies { get; set; }
17+
18+
[Required]
19+
public string[] SupportedAbis { get; set; }
20+
21+
[Required]
22+
public string NativeSourcesDir { get; set; }
23+
24+
[Required]
25+
public ITaskItem[] FastPathAssemblies { get; set; }
26+
27+
[Output]
28+
public ITaskItem[] AssemblySources { get; set; }
29+
30+
public override bool RunTask ()
31+
{
32+
var fastAssemblies = new HashSet<string> (StringComparer.OrdinalIgnoreCase);
33+
34+
foreach (ITaskItem asm in FastPathAssemblies) {
35+
fastAssemblies.Add (Path.GetFileName (asm.ItemSpec));
36+
}
37+
38+
var seenAssemblyNames = new HashSet<string> (StringComparer.OrdinalIgnoreCase);
39+
var sources = new List<ITaskItem> ();
40+
foreach (ITaskItem asm in Assemblies) {
41+
string asmName = Path.GetFileName (asm.ItemSpec);
42+
if (fastAssemblies.Contains (asmName) || seenAssemblyNames.Contains (asmName)) {
43+
continue;
44+
}
45+
seenAssemblyNames.Add (asmName);
46+
47+
string baseName = Path.GetFileNameWithoutExtension (asmName);
48+
foreach (string abi in SupportedAbis) {
49+
var item = new TaskItem (Path.Combine (NativeSourcesDir, MonoAndroidHelper.MakeNativeAssemblyFileName (baseName, abi)));
50+
item.SetMetadata ("abi", abi);
51+
52+
sources.Add (item);
53+
}
54+
}
55+
56+
AssemblySources = sources.ToArray ();
57+
return !Log.HasLoggedErrors;
58+
}
59+
}

0 commit comments

Comments
 (0)