Skip to content

Commit 8aac09a

Browse files
committed
[Xamarin.Android.Build.Tasks] Netstandard Support
This adds Netstandard support to our msbuild unit test system. You can now create a new `DotNetStandard` project and add that as a reference. The builder also has a new property `RequiresMSBuild` which is used to force the system to use `msbuild` for its build process.
1 parent bdfa3af commit 8aac09a

File tree

14 files changed

+571
-160
lines changed

14 files changed

+571
-160
lines changed

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -401,6 +401,9 @@ public override bool Execute ()
401401
LogDebugMessage (" Skip assembly: {0}, it was already processed", fullPath);
402402
continue;
403403
}
404+
// don't try to even load mscorlib it will fail.
405+
if (string.Compare (Path.GetFileNameWithoutExtension (fullPath), "mscorlib", StringComparison.OrdinalIgnoreCase) == 0)
406+
continue;
404407
assemblies.Add (fullPath);
405408
resolver.Load (fullPath);
406409
// Append source file name (without the Xamarin. prefix or extension) to the base folder

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

Lines changed: 221 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -223,5 +223,226 @@ public void CheckSignApk ([Values(true, false)] bool useApkSigner)
223223
Assert.IsTrue (b.Build (proj), "build failed");
224224
}
225225
}
226+
227+
[Test]
228+
public void NetStandardReferenceTest ()
229+
{
230+
var netStandardProject = new DotNetStandard () {
231+
Language = XamarinAndroidProjectLanguage.CSharp,
232+
ProjectName = "XamFormsSample",
233+
ProjectGuid = Guid.NewGuid ().ToString (),
234+
Sdk = "Microsoft.NET.Sdk",
235+
TargetFramework = "netstandard1.4",
236+
IsRelease = true,
237+
PackageTargetFallback = "portable-net45+win8+wpa81+wp8",
238+
PackageReferences = {
239+
KnownPackages.XamarinFormsPCL_2_3_4_231,
240+
new Package () {
241+
Id = "System.IO.Packaging",
242+
Version = "4.4.0",
243+
},
244+
// Uncomment when https://bugzilla.xamarin.com/show_bug.cgi?id=59313 gets fixed
245+
// new Package () {
246+
// Id = "Newtonsoft.Json",
247+
// Version = "10.0.3"
248+
// },
249+
},
250+
OtherBuildItems = {
251+
new BuildItem ("None") {
252+
Remove = () => "**\\*.xaml",
253+
},
254+
new BuildItem ("Compile") {
255+
Update = () => "**\\*.xaml.cs",
256+
DependentUpon = () => "%(Filename)"
257+
},
258+
new BuildItem ("EmbeddedResource") {
259+
Include = () => "**\\*.xaml",
260+
SubType = () => "Designer",
261+
Generator = () => "MSBuild:UpdateDesignTimeXaml",
262+
},
263+
},
264+
Sources = {
265+
new BuildItem.Source ("App.xaml.cs") {
266+
TextContent = () => @"using System;
267+
using System.Collections.Generic;
268+
using System.Linq;
269+
using System.Text;
270+
//using Newtonsoft.Json;
271+
272+
using Xamarin.Forms;
273+
274+
namespace XamFormsSample
275+
{
276+
public partial class App : Application
277+
{
278+
public App()
279+
{
280+
// Uncomment when https://bugzilla.xamarin.com/show_bug.cgi?id=59313 gets fixed
281+
// JsonConvert.DeserializeObject<string>(""test"");
282+
InitializeComponent();
283+
}
284+
285+
protected override void OnStart()
286+
{
287+
// Handle when your app starts
288+
}
289+
290+
protected override void OnSleep()
291+
{
292+
// Handle when your app sleeps
293+
}
294+
295+
protected override void OnResume()
296+
{
297+
// Handle when your app resumes
298+
}
299+
}
300+
}",
301+
},
302+
new BuildItem.Source ("App.xaml") {
303+
TextContent = () => @"<?xml version=""1.0"" encoding=""utf-8"" ?>
304+
<Application xmlns=""http://xamarin.com/schemas/2014/forms""
305+
xmlns:x=""http://schemas.microsoft.com/winfx/2009/xaml""
306+
x:Class=""XamFormsSample.App"">
307+
<Application.Resources>
308+
<!-- Application resource dictionary -->
309+
</Application.Resources>
310+
</Application>",
311+
},
312+
},
313+
};
314+
315+
var app = new XamarinAndroidApplicationProject () {
316+
ProjectName = "App1",
317+
IsRelease = true,
318+
UseLatestPlatformSdk = true,
319+
References = {
320+
new BuildItem.Reference ("Mono.Android.Export"),
321+
new BuildItem.ProjectReference ($"..\\{netStandardProject.ProjectName}\\{netStandardProject.ProjectName}.csproj",
322+
netStandardProject.ProjectName, netStandardProject.ProjectGuid),
323+
},
324+
PackageReferences = {
325+
KnownPackages.SupportDesign_25_4_0_1,
326+
KnownPackages.SupportV7CardView_24_2_1,
327+
KnownPackages.AndroidSupportV4_25_4_0_1,
328+
KnownPackages.SupportCoreUtils_25_4_0_1,
329+
KnownPackages.SupportMediaCompat_25_4_0_1,
330+
KnownPackages.SupportFragment_25_4_0_1,
331+
KnownPackages.SupportCoreUI_25_4_0_1,
332+
KnownPackages.SupportCompat_25_4_0_1,
333+
KnownPackages.SupportV7AppCompat_25_4_0_1,
334+
KnownPackages.XamarinForms_2_3_4_231,
335+
}
336+
};
337+
app.SetProperty (KnownProperties.AndroidSupportedAbis, "x86;armeabi-v7a");
338+
var expectedFiles = new string [] {
339+
"Java.Interop.dll",
340+
"Mono.Android.dll",
341+
"mscorlib.dll",
342+
"mscorlib.dll.mdb",
343+
"System.Collections.Concurrent.dll",
344+
"System.Collections.dll",
345+
"System.Core.dll",
346+
"System.Diagnostics.Debug.dll",
347+
"System.dll",
348+
"System.Linq.dll",
349+
"System.Reflection.dll",
350+
"System.Reflection.Extensions.dll",
351+
"System.Runtime.dll",
352+
"System.Runtime.Extensions.dll",
353+
"System.Runtime.InteropServices.dll",
354+
"System.Runtime.Serialization.dll",
355+
"System.Threading.dll",
356+
"System.IO.Packaging.dll",
357+
"System.IO.Compression.dll",
358+
"System.IO.Compression.pdb",
359+
"Mono.Android.Export.dll",
360+
"Mono.Android.Export.pdb",
361+
"App1.dll",
362+
"App1.pdb",
363+
"FormsViewGroup.dll",
364+
"FormsViewGroup.dll.mdb",
365+
"Xamarin.Android.Support.Compat.dll",
366+
"Xamarin.Android.Support.Core.UI.dll",
367+
"Xamarin.Android.Support.Core.Utils.dll",
368+
"Xamarin.Android.Support.Design.dll",
369+
"Xamarin.Android.Support.Fragment.dll",
370+
"Xamarin.Android.Support.Media.Compat.dll",
371+
"Xamarin.Android.Support.v4.dll",
372+
"Xamarin.Android.Support.v7.AppCompat.dll",
373+
"Xamarin.Android.Support.Animated.Vector.Drawable.dll",
374+
"Xamarin.Android.Support.Vector.Drawable.dll",
375+
"Xamarin.Android.Support.Transition.dll",
376+
"Xamarin.Android.Support.v7.MediaRouter.dll",
377+
"Xamarin.Android.Support.v7.RecyclerView.dll",
378+
"Xamarin.Android.Support.Annotations.dll",
379+
"Xamarin.Android.Support.v7.CardView.dll",
380+
"Xamarin.Forms.Core.dll",
381+
"Xamarin.Forms.Core.dll.mdb",
382+
"Xamarin.Forms.Platform.Android.dll",
383+
"Xamarin.Forms.Platform.Android.dll.mdb",
384+
"Xamarin.Forms.Platform.dll",
385+
"Xamarin.Forms.Xaml.dll",
386+
"Xamarin.Forms.Xaml.dll.mdb",
387+
"XamFormsSample.dll",
388+
"XamFormsSample.pdb",
389+
"Mono.Android.pdb",
390+
"System.Core.pdb",
391+
"System.pdb",
392+
"Mono.Security.dll",
393+
"Mono.Security.pdb",
394+
"System.Xml.dll",
395+
"System.Xml.pdb",
396+
"System.ComponentModel.Composition.dll",
397+
"System.ComponentModel.Composition.pdb",
398+
"System.Net.Http.dll",
399+
"System.Net.Http.pdb",
400+
"System.Runtime.Serialization.pdb",
401+
"System.ServiceModel.Internals.dll",
402+
"System.ServiceModel.Internals.pdb",
403+
"System.Threading.Tasks.dll",
404+
"System.ObjectModel.dll",
405+
"System.Globalization.dll",
406+
"System.ComponentModel.dll",
407+
"System.Xml.ReaderWriter.dll",
408+
"System.Linq.Expressions.dll",
409+
"System.IO.dll",
410+
"System.Dynamic.Runtime.dll",
411+
"System.Text.RegularExpressions.dll",
412+
"System.Diagnostics.Tools.dll",
413+
};
414+
var path = Path.Combine ("temp", TestContext.CurrentContext.Test.Name);
415+
using (var builder = CreateDllBuilder (Path.Combine (path, netStandardProject.ProjectName))) {
416+
builder.RequiresMSBuild = true;
417+
builder.Target = "Restore";
418+
Assert.IsTrue (builder.Build (netStandardProject), "XamFormsSample Nuget packages should have been restored.");
419+
builder.Target = "Build";
420+
Assert.IsTrue (builder.Build (netStandardProject), "XamFormsSample should have built.");
421+
using (var ab = CreateApkBuilder (Path.Combine (path, app.ProjectName))) {
422+
ab.RequiresMSBuild = true;
423+
ab.Target = "Restore";
424+
Assert.IsTrue (ab.Build (app), "App should have built.");
425+
ab.Target = "SignAndroidPackage";
426+
Assert.IsTrue (ab.Build (app), "App should have built.");
427+
var apk = Path.Combine (Root, ab.ProjectDirectory,
428+
app.IntermediateOutputPath, "android", "bin", "UnnamedProject.UnnamedProject.apk");
429+
using (var zip = ZipHelper.OpenZip (apk)) {
430+
var existingFiles = zip.Where (a => a.FullName.StartsWith ("assemblies/", StringComparison.InvariantCultureIgnoreCase));
431+
var missingFiles = expectedFiles.Where (x => !zip.ContainsEntry ("assmelbies/" + Path.GetFileName (x)));
432+
Assert.IsTrue (missingFiles.Any (),
433+
string.Format ("The following Expected files are missing. {0}",
434+
string.Join (Environment.NewLine, missingFiles)));
435+
var additionalFiles = existingFiles.Where (x => !expectedFiles.Contains (Path.GetFileName (x.FullName)));
436+
Assert.IsTrue (!additionalFiles.Any (),
437+
string.Format ("Unexpected Files found! {0}",
438+
string.Join (Environment.NewLine, additionalFiles.Select (x => x.FullName))));
439+
}
440+
if (!HasDevices)
441+
Assert.Ignore ("Skipping Installation. No devices available.");
442+
ab.Target = "Install";
443+
Assert.IsTrue (ab.Build (app), "App should have installed.");
444+
}
445+
}
446+
}
226447
}
227448
}

src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Android/KnownPackages.cs

Lines changed: 60 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ public static class KnownPackages
6666
new BuildItem.Reference ("Xamarin.Android.Support.v13") {
6767
MetadataValues = "HintPath=..\\packages\\Xamarin.Android.Support.v13.20.0.0.4\\lib\\MonoAndroid32\\Xamarin.Android.Support.v13.dll" }
6868
}
69-
};
69+
};
7070
public static Package AndroidSupportV13Beta = new Package () {
7171
Id = "Xamarin.Android.Support.v13",
7272
Version = "21.0.0.0-beta1",
@@ -93,20 +93,20 @@ public static class KnownPackages
9393
new BuildItem.Reference ("Xamarin.Android.Wearable") {
9494
MetadataValues = "HintPath=..\\packages\\Xamarin.Android.Wear.1.0.0-preview7\\lib\\MonoAndroid10\\Xamarin.Android.Wearable.dll" }
9595
}
96-
};
96+
};
9797
public static Package SupportV7RecyclerView = new Package {
9898
Id = "Xamarin.Android.Support.v7.RecyclerView",
99-
Version="21.0.0.0-beta1",
100-
TargetFramework="MonoAndroid523",
99+
Version = "21.0.0.0-beta1",
100+
TargetFramework = "MonoAndroid523",
101101
References = {
102102
new BuildItem.Reference ("Xamarin.Android.Support.V7.RecyclerView") {
103103
MetadataValues = "HintPath=..\\packages\\Xamarin.Android.Support.v7.RecyclerView.21.0.0.0-beta1\\lib\\MonoAndroid\\Xamarin.Android.Support.v7.RecyclerView.dll" }
104104
}
105-
};
105+
};
106106
public static Package SupportV7CardView = new Package {
107107
Id = "Xamarin.Android.Support.v7.Cardview",
108-
Version="21.0.3.0",
109-
TargetFramework="MonoAndroid523",
108+
Version = "21.0.3.0",
109+
TargetFramework = "MonoAndroid523",
110110
References = {
111111
new BuildItem.Reference ("Xamarin.Android.Support.v7.CardView") {
112112
MetadataValues = "HintPath=..\\packages\\Xamarin.Android.Support.v7.CardView.21.0.3.0\\lib\\MonoAndroid403\\Xamarin.Android.Support.v7.CardView.dll" }
@@ -121,6 +121,15 @@ public static class KnownPackages
121121
MetadataValues = "HintPath=..\\packages\\Xamarin.Android.Support.v7.CardView.24.2.1\\lib\\MonoAndroid70\\Xamarin.Android.Support.v7.CardView.dll" }
122122
}
123123
};
124+
public static Package SupportV7CardView_25_4_0_1 = new Package {
125+
Id = "Xamarin.Android.Support.v7.Cardview",
126+
Version = "25.4.0.1",
127+
TargetFramework = "MonoAndroid70",
128+
References = {
129+
new BuildItem.Reference ("Xamarin.Android.Support.v7.CardView") {
130+
MetadataValues = "HintPath=..\\packages\\Xamarin.Android.Support.v7.CardView.25.4.0.1\\lib\\MonoAndroid70\\Xamarin.Android.Support.v7.CardView.dll" }
131+
}
132+
};
124133
public static Package SupportV7AppCompat_21_0_3_0 = new Package {
125134
Id = "Xamarin.Android.Support.v7.AppCompat",
126135
Version = "21.0.3.0",
@@ -220,6 +229,15 @@ public static class KnownPackages
220229
MetadataValues = "HintPath=..\\packages\\Xamarin.Android.Support.v7.Palette.22.1.1.1\\lib\\MonoAndroid403\\Xamarin.Android.Support.v7.Palette.dll" }
221230
}
222231
};
232+
public static Package SupportDesign_25_4_0_1 = new Package {
233+
Id = "Xamarin.Android.Support.Design",
234+
Version = "25.4.0.1",
235+
TargetFramework = "MonoAndroid70",
236+
References = {
237+
new BuildItem.Reference ("Xamarin.Android.Support.Design") {
238+
MetadataValues = "HintPath=..\\packages\\Xamarin.Android.Support.Design.25.4.0.1\\lib\\MonoAndroid70\\Xamarin.Android.Support.Design.dll" }
239+
}
240+
};
223241
public static Package GooglePlayServices_22_0_0_2 = new Package {
224242
Id = "Xamarin.GooglePlayServices",
225243
Version = "22.0.0.2",
@@ -265,6 +283,41 @@ public static class KnownPackages
265283
},
266284
}
267285
};
286+
public static Package XamarinFormsPCL_2_3_4_231 = new Package {
287+
Id = "Xamarin.Forms",
288+
Version = "2.3.4.231",
289+
TargetFramework = "portable-net45+win+wp80+MonoAndroid10+xamarinios10+MonoTouch10",
290+
References = {
291+
new BuildItem.Reference ("Xamarin.Forms.Core") {
292+
MetadataValues = "HintPath=..\\packages\\Xamarin.Forms.2.3.4.231\\lib\\portable-win+net45+wp80+win81+wpa81+MonoAndroid10+MonoTouch10+Xamarin.iOS10\\Xamarin.Forms.Core.dll"
293+
},
294+
new BuildItem.Reference ("Xamarin.Forms.Xaml") {
295+
MetadataValues = "HintPath=..\\packages\\Xamarin.Forms.2.3.4.231\\lib\\portable-win+net45+wp80+win81+wpa81+MonoAndroid10+MonoTouch10+Xamarin.iOS10\\Xamarin.Forms.Xaml.dll"
296+
},
297+
}
298+
};
299+
public static Package XamarinForms_2_3_4_231 = new Package {
300+
Id = "Xamarin.Forms",
301+
Version = "2.3.4.231",
302+
TargetFramework = "MonoAndroid44",
303+
References = {
304+
new BuildItem.Reference ("Xamarin.Forms.Platform.Android") {
305+
MetadataValues = "HintPath=..\\packages\\Xamarin.Forms.2.3.4.231\\lib\\MonoAndroid10\\Xamarin.Forms.Platform.Android.dll"
306+
},
307+
new BuildItem.Reference ("FormsViewGroup") {
308+
MetadataValues = "HintPath=..\\packages\\Xamarin.Forms.2.3.4.231\\lib\\MonoAndroid10\\FormsViewGroup.dll"
309+
},
310+
new BuildItem.Reference ("Xamarin.Forms.Core") {
311+
MetadataValues = "HintPath=..\\packages\\Xamarin.Forms.2.3.4.231\\lib\\MonoAndroid10\\Xamarin.Forms.Core.dll"
312+
},
313+
new BuildItem.Reference ("Xamarin.Forms.Xaml") {
314+
MetadataValues = "HintPath=..\\packages\\Xamarin.Forms.2.3.4.231\\lib\\MonoAndroid10\\Xamarin.Forms.Xaml.dll"
315+
},
316+
new BuildItem.Reference ("Xamarin.Forms.Platform") {
317+
MetadataValues = "HintPath=..\\packages\\Xamarin.Forms.2.3.4.231\\lib\\MonoAndroid10\\Xamarin.Forms.Platform.dll"
318+
},
319+
}
320+
};
268321
public static Package CocosSharp_PCL_Shared_1_5_0_0 = new Package {
269322
Id = "CocosSharp.PCL.Shared",
270323
Version = "1.5.0.0",

src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Android/XamarinAndroidProject.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
namespace Xamarin.ProjectTools
99
{
10-
public abstract class XamarinAndroidProject : XamarinProject
10+
public abstract class XamarinAndroidProject : DotNetXamarinProject
1111
{
1212
protected XamarinAndroidProject (string debugConfigurationName = "Debug", string releaseConfigurationName = "Release")
1313
: base (debugConfigurationName, releaseConfigurationName)

src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Common/BuildActions.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ public static class BuildActions
1111
{
1212
public const string None = "None";
1313
public const string ProjectReference = "ProjectReference";
14+
public const string PackageReference = "PackageReference";
1415
public const string Reference = "Reference";
1516
public const string Compile = "Compile";
1617
public const string EmbeddedResource = "EmbeddedResource";

src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Common/BuildItem.cs

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,19 +78,31 @@ public BuildItem (string buildAction, string include)
7878
{
7979
}
8080

81-
public BuildItem (string buildAction, Func<string> include)
81+
public BuildItem (string buildAction, Func<string> include = null)
8282
{
8383
BuildAction = buildAction;
8484
Include = include;
8585
Metadata = new Dictionary<string, string> ();
8686
Timestamp = DateTimeOffset.UtcNow;
8787
Encoding = Encoding.UTF8;
8888
Attributes = FileAttributes.Normal;
89+
Generator = null;
90+
Remove = null;
91+
SubType = null;
92+
Update = null;
93+
DependentUpon = null;
94+
Version = null;
8995
}
9096

9197
public DateTimeOffset? Timestamp { get; set; }
9298
public string BuildAction { get; set; }
9399
public Func<string> Include { get; set; }
100+
public Func<string> Remove { get; set; }
101+
public Func<string> Update { get; set; }
102+
public Func<string> SubType { get; set; }
103+
public Func<string> Generator { get; set; }
104+
public Func<string> DependentUpon { get; set; }
105+
public Func<string> Version { get; set; }
94106
public IDictionary<string,string> Metadata { get; private set; }
95107
public Func<string> TextContent { get; set; }
96108
public Func<byte[]> BinaryContent { get; set; }

0 commit comments

Comments
 (0)