diff --git a/Documentation/guides/DotNet5.md b/Documentation/guides/DotNet5.md index 290aa4096f6..b4d28cc0128 100644 --- a/Documentation/guides/DotNet5.md +++ b/Documentation/guides/DotNet5.md @@ -3,16 +3,21 @@ _NOTE: this document is very likely to change, as the requirements for .NET 5 are better understood._ -A .NET 5 project for Xamarin.Android will look something like: +A .NET 5 project for a Xamarin.Android application will look something +like: ```xml net5.0-android + Exe ``` +For a "library" project, you would omit the `$(OutputType)` property +completely or specify `Library`. + See the [Target Framework Names in .NET 5][net5spec] spec for details. [net5spec]: https://github.com/dotnet/designs/blob/5e921a9dc8ecce33b3195dcdb6f10ef56ef8b9d7/accepted/2020/net5/net5.md diff --git a/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.props b/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.props index 4e0f37006cf..d46c155f2fc 100644 --- a/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.props +++ b/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.props @@ -22,10 +22,6 @@ Assets Resource $(MonoAndroidResourcePrefix)\$(_AndroidResourceDesigner) - Properties\AndroidManifest.xml - true - false - true true Xamarin.Android.Net.AndroidClientHandler true diff --git a/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.targets b/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.targets index 8d48d505226..b1a30e23148 100644 --- a/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.targets +++ b/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.targets @@ -5,6 +5,15 @@ <_XamarinAndroidBuildTasksAssembly>$(MSBuildThisFileDirectory)..\tools\Xamarin.Android.Build.Tasks.dll + + true + false + true + Properties\AndroidManifest.xml + + Library + + diff --git a/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Xamarin.Android.Sdk.Lite.targets b/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Xamarin.Android.Sdk.Lite.targets index 0e89ba3f73d..098ecc5743f 100644 --- a/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Xamarin.Android.Sdk.Lite.targets +++ b/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Xamarin.Android.Sdk.Lite.targets @@ -23,6 +23,14 @@ MonoAndroid + + Properties\AndroidManifest.xml + true + false + + Library + + diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/XASdkTests.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/XASdkTests.cs index 458a274f3cd..e99a993c1b2 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/XASdkTests.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/XASdkTests.cs @@ -1,9 +1,11 @@ using System.IO; using System.Linq; using System.Reflection; +using Mono.Cecil; using NUnit.Framework; using Xamarin.Android.Tasks; using Xamarin.ProjectTools; +using Xamarin.Tools.Zip; namespace Xamarin.Android.Build.Tests { @@ -29,6 +31,29 @@ public void DotNetBuild ([Values (false, true)] bool isRelease) Assert.IsTrue (dotnet.Build (), "`dotnet build` should succeed"); } + [Test] + [Category ("SmokeTests")] + public void DotNetBuildLibrary ([Values (false, true)] bool isRelease) + { + var proj = new XASdkProject (SdkVersion, outputType: "Library") { + IsRelease = isRelease + }; + var dotnet = CreateDotNetBuilder (proj); + Assert.IsTrue (dotnet.Build (), "`dotnet build` should succeed"); + + var assemblyPath = Path.Combine (Root, dotnet.ProjectDirectory, proj.OutputPath, "UnnamedProject.dll"); + FileAssert.Exists (assemblyPath); + using (var assembly = AssemblyDefinition.ReadAssembly (assemblyPath)) { + var resourceName = "__AndroidLibraryProjects__.zip"; + var resource = assembly.MainModule.Resources.OfType ().FirstOrDefault (r => r.Name == resourceName); + Assert.IsNotNull (resource, $"{assemblyPath} should contain a {resourceName} EmbeddedResource"); + using (var zip = ZipArchive.Open (resource.GetResourceStream ())) { + var entry = "library_project_imports/res/values/strings.xml"; + Assert.IsTrue (zip.ContainsEntry (entry), $"{resourceName} should contain {entry}"); + } + } + } + static readonly object [] DotNetPublishSource = new object [] { new object [] { /* runtimeIdentifier */ "android.21-arm", diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Android/KnownProperties.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Android/KnownProperties.cs index cdc210020be..2a59e9df6f0 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Android/KnownProperties.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Android/KnownProperties.cs @@ -29,6 +29,7 @@ public static class KnownProperties public const string OutputPath = "OutputPath"; public const string IntermediateOutputPath = "IntermediateOutputPath"; + public const string OutputType = "OutputType"; public const string AndroidFastDeploymentType = "AndroidFastDeploymentType"; public const string AndroidClassParser = "AndroidClassParser"; } diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Android/XASdkProject.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Android/XASdkProject.cs index 84de96a29d9..89689ac290b 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Android/XASdkProject.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Android/XASdkProject.cs @@ -24,7 +24,7 @@ public class XASdkProject : DotNetStandard public string PackageName { get; set; } public string JavaPackageName { get; set; } - public XASdkProject (string sdkVersion = "") + public XASdkProject (string sdkVersion = "", string outputType = "Exe") { Sdk = string.IsNullOrEmpty (sdkVersion) ? "Microsoft.Android.Sdk" : $"Microsoft.Android.Sdk/{sdkVersion}"; TargetFramework = "netcoreapp5.0"; @@ -33,6 +33,7 @@ public XASdkProject (string sdkVersion = "") JavaPackageName = JavaPackageName ?? PackageName.ToLowerInvariant (); ExtraNuGetConfigSources = new List { Path.Combine (XABuildPaths.BuildOutputDirectory, "nupkgs") }; GlobalPackagesFolder = Path.Combine (XABuildPaths.TopDirectory, "packages"); + SetProperty (KnownProperties.OutputType, outputType); using (var sr = new StreamReader (typeof (XamarinAndroidApplicationProject).Assembly.GetManifestResourceStream ("Xamarin.ProjectTools.Resources.Base.AndroidManifest.xml"))) default_android_manifest = sr.ReadToEnd (); @@ -46,9 +47,11 @@ public XASdkProject (string sdkVersion = "") } // Add relevant Android content to our project without writing it to the .csproj file - Sources.Add (new BuildItem.Source ("Properties\\AndroidManifest.xml") { - TextContent = () => default_android_manifest.Replace ("${PROJECT_NAME}", ProjectName).Replace ("${PACKAGENAME}", string.Format ("{0}.{0}", ProjectName)) - }); + if (outputType == "Exe") { + Sources.Add (new BuildItem.Source ("Properties\\AndroidManifest.xml") { + TextContent = () => default_android_manifest.Replace ("${PROJECT_NAME}", ProjectName).Replace ("${PACKAGENAME}", string.Format ("{0}.{0}", ProjectName)) + }); + } Sources.Add (new BuildItem.Source ($"MainActivity{Language.DefaultExtension}") { TextContent = () => ProcessSourceTemplate (default_main_activity_cs) }); Sources.Add (new BuildItem.Source ("Resources\\layout\\Main.axml") { TextContent = () => default_layout_main }); Sources.Add (new BuildItem.Source ("Resources\\values\\Strings.xml") { TextContent = () => default_strings_xml.Replace ("${PROJECT_NAME}", ProjectName) }); diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Android/XamarinAndroidProject.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Android/XamarinAndroidProject.cs index fdb77afca4a..cf5442240d1 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Android/XamarinAndroidProject.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Android/XamarinAndroidProject.cs @@ -21,7 +21,7 @@ protected XamarinAndroidProject (string debugConfigurationName = "Debug", string SetProperty ("ProjectTypeGuids", () => "{" + Language.ProjectTypeGuid + "};{" + ProjectTypeGuid + "}"); SetProperty ("ProjectGuid", () => "{" + ProjectGuid + "}"); - SetProperty ("OutputType", "Library"); + SetProperty (KnownProperties.OutputType, "Library"); SetProperty ("MonoAndroidAssetsPrefix", "Assets"); SetProperty ("MonoAndroidResourcePrefix", "Resources"); diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Common/XamarinPCLProject.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Common/XamarinPCLProject.cs index 2aa7176ca3f..c98a32753bd 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Common/XamarinPCLProject.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Common/XamarinPCLProject.cs @@ -12,7 +12,7 @@ public XamarinPCLProject () SetProperty ("ProjectGuid", () => "{" + ProjectGuid + "}"); SetProperty ("TargetFrameworkProfile", "Profile78"); SetProperty ("TargetFrameworkVersion", "v4.5"); - SetProperty ("OutputType", "Library"); + SetProperty (KnownProperties.OutputType, "Library"); } public override string ProjectTypeGuid {