Skip to content

Commit fb637e0

Browse files
[.NET 5] support for binding projects (#4646)
The current idea for binding projects in .NET 5 is they won't be a distinct project type at all anymore. It would be completely valid to put this in a .NET 5 Xamarin.Android app with `$(OutputType)` of `Exe`: <InputJar Include="foo.jar" /> A project with an `$(OutputType)` of `Library` would likely do: <EmbeddedJar Include="foo.jar" /> To make this work, I've split up `Xamarin.Android.Bindings.targets` into a few different files: * `Xamarin.Android.Bindings.Core.targets`: the targets shared between .NET 5 and "legacy" binding projects. It imports the other new files. * `Xamarin.Android.Bindings.ClassParse.targets`: is only imported when `$(AndroidClassParser)` is `class-parse`. * `Xamarin.Android.Bindings.JarToXml.targets`: is only imported when `$(AndroidClassParser)` is `jar2xml`. * `Xamarin.Android.Bindings.Documentation.targets`: is imported by "legacy" binding projects, contains targets related to documentation extraction/generation. We will eventually use this in .NET 5 when `mdoc.exe` is available or we have an alternative. Once these were split up, to get bindings working in .NET 5 projects I had to: 1. Import `Xamarin.Android.Bindings.Core.targets`. 2. Update `Microsoft.Android.Sdk.BuildOrder.targets` to include the binding-specific targets. 3. Make the binding targets only run if there are any `@(InputJar)` or `@(EmbeddedJar)`. One hangup is that bindings require: <AllowUnsafeBlocks>true</AllowUnsafeBlocks> We probably don't want this set for all projects by default. I set this if any of the binding targets run, so that once you add a `@(InputJar)` it gets turned on. I updated `XASdkTests` to verify binding `.jar` files works in a library project and an app project. Other changes: * Added a new `AndroidDotnetToolTask` for swapping between `generator.exe` and `dotnet generator.dll` calls. * I ported `javadoc2mdoc.csproj` to use short-form projects, and multi-target both `net472` and `netcoreapp3.1`. * The `<ImportJavaDoc/>` task now extends `AndroidDotnetToolTask`. * `$(ApplicationResolveReferencesDependsOn)` is unused, so I removed usage of it. * I removed the `_ResolveMonoAndroidFramework` target, it was not needed. TODO: * Item groups like `@(JavaSourceJar)` can't fully work yet in .NET 5. `Xamarin.Android.Documentation.targets` uses `mdoc.exe`, which won't run under `dotnet` yet. * For now, `Xamarin.Android.Documentation.targets` is not imported in .NET 5 projects.
1 parent 268c40d commit fb637e0

22 files changed

+673
-445
lines changed

Documentation/guides/DotNet5.md

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,32 @@ See the [Target Framework Names in .NET 5][net5spec] spec for details.
2222

2323
[net5spec]: https://github.com/dotnet/designs/blob/5e921a9dc8ecce33b3195dcdb6f10ef56ef8b9d7/accepted/2020/net5/net5.md
2424

25+
## Consolidation of binding projects
26+
27+
In .NET 5, there will no longer be a concept of a [binding
28+
project][binding] as a separate project type. Any of the MSBuild item
29+
groups or build actions that currently work in binding projects will
30+
be supported through a .NET 5 Android application or library.
31+
32+
For example, a binding library could look like:
33+
34+
```xml
35+
<Project Sdk="Microsoft.NET.Sdk">
36+
<PropertyGroup>
37+
<TargetFramework>net5.0-android</TargetFramework>
38+
</PropertyGroup>
39+
<ItemGroup>
40+
<TransformFile Include="Transforms\Metadata.xml" />
41+
<EmbeddedJar Include="Jars\foo.jar" />
42+
</ItemGroup>
43+
</Project>
44+
```
45+
46+
This will bind C# types for the Java types found in `foo.jar` using
47+
the metadata fixups from `Metadata.xml`.
48+
49+
[binding]: https://docs.microsoft.com/xamarin/android/platform/binding-java-library/
50+
2551
## Changes to MSBuild tasks
2652

2753
In .NET 5 the behavior of the following MSBuild tasks will change, but
@@ -45,6 +71,16 @@ In .NET 5 the behavior of the following MSBuild tasks will change, but
4571
better align with existing .NET 5 semantics, at the cost of compatibility with
4672
previous Xamarin.Android releases.
4773

74+
`$(AndroidClassParser)` will be `class-parse` by default. `jar2xml`
75+
will not be supported.
76+
77+
`$(AndroidCodegenTarget)` will be `XAJavaInterop1` by default.
78+
`XamarinAndroid` will not be supported.
79+
80+
If Java binding is enabled with `@(InputJar)`, `@(EmbeddedJar)`,
81+
`@(LibraryProjectZip)`, etc. then `$(AllowUnsafeBlocks)` will default
82+
to `True`.
83+
4884
[abet-sys]: https://github.com/xamarin/xamarin-android/issues/4127
4985

5086
## Default file inclusion

build-tools/create-packs/Microsoft.Android.Sdk.proj

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ the new entry point for short-form style Android projets in .NET 5.
3636
DependsOnTargets="ConstructInstallerItems;_GenerateBundledVersions" >
3737
<PropertyGroup>
3838
<ToolsSourceDir>$(XamarinAndroidSourcePath)bin\Build$(Configuration)\packs\tools\</ToolsSourceDir>
39+
<NetCoreAppToolsSourceDir>$(XamarinAndroidSourcePath)bin\$(Configuration)-netcoreapp3.1\</NetCoreAppToolsSourceDir>
3940
</PropertyGroup>
4041
<ItemGroup>
4142
<AndroidSdkBuildTools Include="@(_MSBuildFiles);@(_MSBuildFilesWin)" >
@@ -66,6 +67,10 @@ the new entry point for short-form style Android projets in .NET 5.
6667
/>
6768
<ItemGroup>
6869
<_PackageFiles Include="$(ToolsSourceDir)**" PackagePath="tools" />
70+
<_PackageFiles Include="$(NetCoreAppToolsSourceDir)generator.dll" PackagePath="tools" />
71+
<_PackageFiles Include="$(NetCoreAppToolsSourceDir)generator.runtimeconfig.json" PackagePath="tools" />
72+
<_PackageFiles Include="$(NetCoreAppToolsSourceDir)javadoc-to-mdoc.dll" PackagePath="tools" />
73+
<_PackageFiles Include="$(NetCoreAppToolsSourceDir)javadoc-to-mdoc.runtimeconfig.json" PackagePath="tools" />
6974
<_PackageFiles Include="$(XAInstallPrefix)xbuild-frameworks\Microsoft.Android\Version*" PackagePath="tools" />
7075
<_PackageFiles Include="$(XamarinAndroidSourcePath)src\Xamarin.Android.Build.Tasks\Microsoft.Android.Sdk\Sdk\**" PackagePath="Sdk" />
7176
<_PackageFiles Include="$(XamarinAndroidSourcePath)src\Xamarin.Android.Build.Tasks\Microsoft.Android.Sdk\targets\**"

build-tools/installers/create-installers.targets

Lines changed: 29 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -115,25 +115,25 @@
115115
</ItemGroup>
116116
<ItemGroup>
117117
<_MSBuildFiles Include="$(MSBuildSrcDir)\android-support-multidex.jar" />
118-
<_MSBuildFiles Include="$(MSBuildSrcDir)\aprofutil.exe" />
119-
<_MSBuildFiles Include="$(MSBuildSrcDir)\aprofutil.pdb" />
120-
<_MSBuildFiles Include="$(MSBuildSrcDir)\cil-strip.exe" />
121-
<_MSBuildFiles Include="$(MSBuildSrcDir)\cil-strip.pdb" />
122-
<_MSBuildFiles Include="$(MSBuildSrcDir)\class-parse.exe" />
123-
<_MSBuildFiles Include="$(MSBuildSrcDir)\class-parse.pdb" />
118+
<_MSBuildFiles Include="$(MSBuildSrcDir)\aprofutil.exe" Condition=" '$(PackageId)' != 'Microsoft.Android.Sdk' " />
119+
<_MSBuildFiles Include="$(MSBuildSrcDir)\aprofutil.pdb" Condition=" '$(PackageId)' != 'Microsoft.Android.Sdk' " />
120+
<_MSBuildFiles Include="$(MSBuildSrcDir)\cil-strip.exe" Condition=" '$(PackageId)' != 'Microsoft.Android.Sdk' " />
121+
<_MSBuildFiles Include="$(MSBuildSrcDir)\cil-strip.pdb" Condition=" '$(PackageId)' != 'Microsoft.Android.Sdk' " />
122+
<_MSBuildFiles Include="$(MSBuildSrcDir)\class-parse.exe" Condition=" '$(PackageId)' != 'Microsoft.Android.Sdk' " />
123+
<_MSBuildFiles Include="$(MSBuildSrcDir)\class-parse.pdb" Condition=" '$(PackageId)' != 'Microsoft.Android.Sdk' " />
124124
<_MSBuildFiles Include="$(MSBuildSrcDir)\FSharp.Core.dll" />
125-
<_MSBuildFiles Include="$(MSBuildSrcDir)\generator.exe" />
126-
<_MSBuildFiles Include="$(MSBuildSrcDir)\generator.pdb" />
125+
<_MSBuildFiles Include="$(MSBuildSrcDir)\generator.exe" Condition=" '$(PackageId)' != 'Microsoft.Android.Sdk' " />
126+
<_MSBuildFiles Include="$(MSBuildSrcDir)\generator.pdb" Condition=" '$(PackageId)' != 'Microsoft.Android.Sdk' " />
127127
<_MSBuildFiles Include="$(MSBuildSrcDir)\HtmlAgilityPack.dll" />
128128
<_MSBuildFiles Include="$(MSBuildSrcDir)\HtmlAgilityPack.pdb" />
129129
<_MSBuildFiles Include="$(MSBuildSrcDir)\ICSharpCode.SharpZipLib.dll" />
130130
<_MSBuildFiles Include="$(MSBuildSrcDir)\ICSharpCode.SharpZipLib.pdb" />
131-
<_MSBuildFiles Include="$(MSBuildSrcDir)\illinkanalyzer.exe" />
132-
<_MSBuildFiles Include="$(MSBuildSrcDir)\illinkanalyzer.pdb" />
131+
<_MSBuildFiles Include="$(MSBuildSrcDir)\illinkanalyzer.exe" Condition=" '$(PackageId)' != 'Microsoft.Android.Sdk' " />
132+
<_MSBuildFiles Include="$(MSBuildSrcDir)\illinkanalyzer.pdb" Condition=" '$(PackageId)' != 'Microsoft.Android.Sdk' " />
133133
<_MSBuildFiles Include="$(MSBuildSrcDir)\Irony.dll" />
134134
<_MSBuildFiles Include="$(MSBuildSrcDir)\java-interop.jar" />
135-
<_MSBuildFiles Include="$(MSBuildSrcDir)\javadoc-to-mdoc.exe" />
136-
<_MSBuildFiles Include="$(MSBuildSrcDir)\javadoc-to-mdoc.pdb" />
135+
<_MSBuildFiles Include="$(MSBuildSrcDir)\javadoc-to-mdoc.exe" Condition=" '$(PackageId)' != 'Microsoft.Android.Sdk' " />
136+
<_MSBuildFiles Include="$(MSBuildSrcDir)\javadoc-to-mdoc.pdb" Condition=" '$(PackageId)' != 'Microsoft.Android.Sdk' " />
137137
<_MSBuildFiles Include="$(MSBuildSrcDir)\Java.Interop.dll" />
138138
<_MSBuildFiles Include="$(MSBuildSrcDir)\Java.Interop.pdb" />
139139
<_MSBuildFiles Include="$(MSBuildSrcDir)\Java.Interop.dll.config" />
@@ -148,10 +148,10 @@
148148
<_MSBuildFiles Include="$(MSBuildSrcDir)\Java.Runtime.Environment.dll" />
149149
<_MSBuildFiles Include="$(MSBuildSrcDir)\Java.Runtime.Environment.pdb" />
150150
<_MSBuildFiles Include="$(MSBuildSrcDir)\Java.Runtime.Environment.dll.config" Condition=" '$(HostOS)' != 'Windows' " />
151-
<_MSBuildFiles Include="$(MSBuildSrcDir)\jcw-gen.exe" />
152-
<_MSBuildFiles Include="$(MSBuildSrcDir)\jcw-gen.pdb" />
153-
<_MSBuildFiles Include="$(MSBuildSrcDir)\jit-times.exe" />
154-
<_MSBuildFiles Include="$(MSBuildSrcDir)\jit-times.pdb" />
151+
<_MSBuildFiles Include="$(MSBuildSrcDir)\jcw-gen.exe" Condition=" '$(PackageId)' != 'Microsoft.Android.Sdk' " />
152+
<_MSBuildFiles Include="$(MSBuildSrcDir)\jcw-gen.pdb" Condition=" '$(PackageId)' != 'Microsoft.Android.Sdk' " />
153+
<_MSBuildFiles Include="$(MSBuildSrcDir)\jit-times.exe" Condition=" '$(PackageId)' != 'Microsoft.Android.Sdk' " />
154+
<_MSBuildFiles Include="$(MSBuildSrcDir)\jit-times.pdb" Condition=" '$(PackageId)' != 'Microsoft.Android.Sdk' " />
155155
<_MSBuildFiles Include="$(MSBuildSrcDir)\jnimarshalmethod-gen.exe" Condition=" '$(PackageId)' != 'Microsoft.Android.Sdk' " />
156156
<_MSBuildFiles Include="$(MSBuildSrcDir)\jnimarshalmethod-gen.pdb" Condition=" '$(PackageId)' != 'Microsoft.Android.Sdk' " />
157157
<_MSBuildFiles Include="$(MSBuildSrcDir)\LayoutBinding.cs" />
@@ -176,15 +176,15 @@
176176
<_MSBuildFiles Include="$(MSBuildSrcDir)\libZipSharp.pdb" />
177177
<_MSBuildFiles Include="$(MSBuildSrcDir)\Mono.Profiler.Log.dll" />
178178
<_MSBuildFiles Include="$(MSBuildSrcDir)\Mono.Profiler.Log.pdb" />
179-
<_MSBuildFiles Include="$(MSBuildSrcDir)\logcat-parse.exe" />
180-
<_MSBuildFiles Include="$(MSBuildSrcDir)\logcat-parse.pdb" />
181-
<_MSBuildFiles Include="$(MSBuildSrcDir)\mdoc.exe" />
182-
<_MSBuildFiles Include="$(MSBuildSrcDir)\mdoc.pdb" />
183-
<_MSBuildFiles Include="$(MSBuildSrcDir)\mkbundle.exe" />
184-
<_MSBuildFiles Include="$(MSBuildSrcDir)\mkbundle.pdb" />
179+
<_MSBuildFiles Include="$(MSBuildSrcDir)\logcat-parse.exe" Condition=" '$(PackageId)' != 'Microsoft.Android.Sdk' " />
180+
<_MSBuildFiles Include="$(MSBuildSrcDir)\logcat-parse.pdb" Condition=" '$(PackageId)' != 'Microsoft.Android.Sdk' " />
181+
<_MSBuildFiles Include="$(MSBuildSrcDir)\mdoc.exe" Condition=" '$(PackageId)' != 'Microsoft.Android.Sdk' " />
182+
<_MSBuildFiles Include="$(MSBuildSrcDir)\mdoc.pdb" Condition=" '$(PackageId)' != 'Microsoft.Android.Sdk' " />
183+
<_MSBuildFiles Include="$(MSBuildSrcDir)\mkbundle.exe" Condition=" '$(PackageId)' != 'Microsoft.Android.Sdk' " />
184+
<_MSBuildFiles Include="$(MSBuildSrcDir)\mkbundle.pdb" Condition=" '$(PackageId)' != 'Microsoft.Android.Sdk' " />
185185
<_MSBuildFiles Include="$(MSBuildSrcDir)\mkbundle-api.h" />
186-
<_MSBuildFiles Include="$(MSBuildSrcDir)\mono-symbolicate.exe" />
187-
<_MSBuildFiles Include="$(MSBuildSrcDir)\mono-symbolicate.pdb" />
186+
<_MSBuildFiles Include="$(MSBuildSrcDir)\mono-symbolicate.exe" Condition=" '$(PackageId)' != 'Microsoft.Android.Sdk' " />
187+
<_MSBuildFiles Include="$(MSBuildSrcDir)\mono-symbolicate.pdb" Condition=" '$(PackageId)' != 'Microsoft.Android.Sdk' " />
188188
<_MSBuildFiles Include="$(MSBuildSrcDir)\Mono.CSharp.dll" />
189189
<_MSBuildFiles Include="$(MSBuildSrcDir)\Mono.CompilerServices.SymbolWriter.dll" />
190190
<_MSBuildFiles Include="$(MSBuildSrcDir)\Mono.CompilerServices.SymbolWriter.pdb" />
@@ -214,6 +214,10 @@
214214
<_MSBuildFiles Include="$(MSBuildSrcDir)\Xamarin.Android.Analysis.targets" />
215215
<_MSBuildFiles Include="$(MSBuildSrcDir)\Xamarin.Android.Application.targets" />
216216
<_MSBuildFiles Include="$(MSBuildSrcDir)\Xamarin.Android.Bindings.targets" />
217+
<_MSBuildFiles Include="$(MSBuildSrcDir)\Xamarin.Android.Bindings.ClassParse.targets" />
218+
<_MSBuildFiles Include="$(MSBuildSrcDir)\Xamarin.Android.Bindings.Core.targets" />
219+
<_MSBuildFiles Include="$(MSBuildSrcDir)\Xamarin.Android.Bindings.Documentation.targets" />
220+
<_MSBuildFiles Include="$(MSBuildSrcDir)\Xamarin.Android.Bindings.JarToXml.targets" Condition=" '$(PackageId)' != 'Microsoft.Android.Sdk' " />
217221
<_MSBuildFiles Include="$(MSBuildSrcDir)\Xamarin.Android.Build.Tasks.dll" />
218222
<_MSBuildFiles Include="$(MSBuildSrcDir)\Xamarin.Android.Build.Tasks.pdb" />
219223
<_MSBuildFiles Include="@(_LocalizationLanguages->'$(MSBuildSrcDir)\%(Identity)\Xamarin.Android.Build.Tasks.resources.dll')" />
@@ -369,7 +373,7 @@
369373
<!-- monodroid -->
370374
<ItemGroup Condition=" '$(_HasCommercialFiles)' == 'True' ">
371375
<_MSBuildFiles Include="$(MSBuildSrcDir)\INIFileParser.dll" />
372-
<_MSBuildFiles Include="$(MSBuildSrcDir)\jar2xml.jar" />
376+
<_MSBuildFiles Include="$(MSBuildSrcDir)\jar2xml.jar" Condition=" '$(PackageId)' != 'Microsoft.Android.Sdk' " />
373377
<_MSBuildFiles Include="$(MSBuildSrcDir)\Mono.AndroidTools.dll" />
374378
<_MSBuildFiles Include="$(MSBuildSrcDir)\Mono.AndroidTools.pdb" />
375379
<_MSBuildFiles Include="$(MSBuildSrcDir)\Mono.Android.DebugRuntime-arm64-v8a.apk" Condition=" '$(PackageId)' != 'Microsoft.Android.Sdk' " />
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
<!--
2+
***********************************************************************************************
3+
Xamarin.Android.Bindings.ClassParse.targets
4+
5+
This file contains MSBuild targets used when $(AndroidClassParser) is 'class-parse'.
6+
7+
This file is only used by binding projects.
8+
9+
***********************************************************************************************
10+
-->
11+
12+
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
13+
14+
<UsingTask TaskName="Xamarin.Android.Tasks.ClassParse" AssemblyFile="Xamarin.Android.Build.Tasks.dll" />
15+
16+
<Target Name="_ExportJarToXml"
17+
Inputs="@(EmbeddedJar);@(EmbeddedReferenceJar);@(InputJar);@(ReferenceJar);$(MSBuildAllProjects)"
18+
Outputs="$(ApiOutputFile)">
19+
<ItemGroup>
20+
<_AndroidDocumentationPath Include="@(JavaDocIndex->'%(RootDir)\%(Directory)')" />
21+
<_AndroidDocumentationPath Include="$(JavaDocPaths)" />
22+
<_AndroidDocumentationPath Include="$(Java7DocPaths)" />
23+
<_AndroidDocumentationPath Include="$(Java8DocPaths)" />
24+
<_AndroidDocumentationPath Include="$(DroidDocPaths)" />
25+
<_AndroidDocumentationPath Include="@(JavaDocJar->'$(IntermediateOutputPath)javadocs\%(FileName)')" />
26+
</ItemGroup>
27+
<ClassParse
28+
OutputFile="$(ApiOutputFile).class-parse"
29+
SourceJars="@(EmbeddedJar);@(InputJar)"
30+
DocumentationPaths="@(_AndroidDocumentationPath)"
31+
/>
32+
<BindingsGenerator
33+
OnlyRunXmlAdjuster="true"
34+
XmlAdjusterOutput="$(ApiOutputFile)"
35+
OutputDirectory="$(GeneratedOutputPath)src"
36+
AndroidApiLevel="$(_AndroidApiLevel)"
37+
ApiXmlInput="$(ApiOutputFile).class-parse"
38+
ReferencedManagedLibraries="@(ReferencePath);@(ReferenceDependencyPaths)"
39+
MonoAndroidFrameworkDirectories="$(_XATargetFrameworkDirectories)"
40+
ToolPath="$(MonoAndroidToolsDirectory)"
41+
ToolExe="$(BindingsGeneratorToolExe)"
42+
/>
43+
</Target>
44+
45+
</Project>

0 commit comments

Comments
 (0)