Skip to content

Commit 6e16103

Browse files
dellis1972jonpryor
authored andcommitted
[Xamarin.Android.Build.Tasks] $(AndroidUseLatestPlatformSdk) uses STABLE levels (#1228)
Fixes: #1221 Currently when a user sets `$(AndroidUseLatestPlatformSdk)` it will automatically use the maximum known API level. This is not always a stable ApiLevel, e.g. when a preview API level has been bound, and the binding has been installed. Users will generally want to use the maximum *stable* API level when `$(AndroidUseLatestPlatformSdk)` is True. Alters things so that we use the maximum Stable API level when `$(AndroidUseLatestPlatformSdk)` is True. However, allow users to use unstable API levels if desired. This can be achieved by setting `$(TargetFrameworkVersion)` to the desired unstable framework version. (For example, when API-O was in preview, this would be `v7.99`. When API-P is presumably announced, it will be bound as `v8.99`.) This will require a *manual* change to the `.csproj`, as we do not anticipate the IDEs showing unstable API levels (though this could plausibly be done with sufficient warnings...).
1 parent 48bd2f8 commit 6e16103

File tree

8 files changed

+278
-18
lines changed

8 files changed

+278
-18
lines changed

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

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -423,13 +423,21 @@ bool ValidateApiLevels ()
423423

424424
if (UseLatestAndroidPlatformSdk) {
425425
AndroidApiLevel = GetMaxInstalledApiLevel ().ToString ();
426-
SupportedApiLevel = GetMaxSupportedApiLevel (AndroidApiLevel);
426+
SupportedApiLevel = GetMaxStableApiLevel ().ToString ();
427427
int maxInstalled, maxSupported = 0;
428428
if (int.TryParse (AndroidApiLevel, out maxInstalled) && int.TryParse (SupportedApiLevel, out maxSupported) && maxInstalled > maxSupported) {
429429
Log.LogDebugMessage ($"API Level {AndroidApiLevel} is greater than the maximum supported API level of {SupportedApiLevel}. " +
430430
"Support for this API will be added in a future release.");
431431
AndroidApiLevel = SupportedApiLevel;
432432
}
433+
if (!string.IsNullOrWhiteSpace (TargetFrameworkVersion)) {
434+
var userSelected = MonoAndroidHelper.SupportedVersions.GetApiLevelFromFrameworkVersion (TargetFrameworkVersion);
435+
// overwrite using user version only if it is
436+
// above the maxStableApi and a valid apiLevel.
437+
if (userSelected != null && userSelected > maxSupported && userSelected <= maxInstalled) {
438+
SupportedApiLevel = userSelected.ToString ();
439+
}
440+
}
433441
TargetFrameworkVersion = GetTargetFrameworkVersionFromApiLevel ();
434442
return TargetFrameworkVersion != null;
435443
}
@@ -461,17 +469,17 @@ bool ValidateApiLevels ()
461469
int GetMaxInstalledApiLevel ()
462470
{
463471
string platformsDir = Path.Combine (AndroidSdkPath, "platforms");
464-
var apiLevels = Directory.EnumerateDirectories (platformsDir)
472+
var apiIds = Directory.EnumerateDirectories (platformsDir)
465473
.Select (platformDir => Path.GetFileName (platformDir))
466474
.Where (dir => dir.StartsWith ("android-", StringComparison.OrdinalIgnoreCase))
467475
.Select (dir => dir.Substring ("android-".Length))
468476
.Select (apiName => MonoAndroidHelper.SupportedVersions.GetIdFromApiLevel (apiName));
469477
int maxApiLevel = int.MinValue;
470-
foreach (var level in apiLevels) {
471-
int v;
472-
if (!int.TryParse (level, NumberStyles.Integer, CultureInfo.InvariantCulture, out v))
478+
foreach (var id in apiIds) {
479+
int? v = MonoAndroidHelper.SupportedVersions.GetApiLevelFromId (id);
480+
if (!v.HasValue)
473481
continue;
474-
maxApiLevel = Math.Max (maxApiLevel, v);
482+
maxApiLevel = Math.Max (maxApiLevel, v.Value);
475483
}
476484
if (maxApiLevel < 0)
477485
Log.LogCodedError ("XA5300",
@@ -480,6 +488,11 @@ int GetMaxInstalledApiLevel ()
480488
return maxApiLevel;
481489
}
482490

491+
int GetMaxStableApiLevel ()
492+
{
493+
return MonoAndroidHelper.SupportedVersions.MaxStableVersion.ApiLevel;
494+
}
495+
483496
string GetMaxSupportedApiLevel (string apiLevel)
484497
{
485498
int level = 0;

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

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2228,6 +2228,64 @@ public void IfAndroidJarDoesNotExistThrowXA5207 ()
22282228
Directory.Delete (AndroidSdkDirectory, recursive: true);
22292229
}
22302230

2231+
[Test]
2232+
public void ValidateUseLatestAndroid ()
2233+
{
2234+
var path = Path.Combine ("temp", TestName);
2235+
var androidSdkPath = CreateFauxAndroidSdkDirectory (Path.Combine (path, "android-sdk"),
2236+
"23.0.6", minApiLevel: 10, maxApiLevel: 28, alphaApiLevel: "P");
2237+
var referencesPath = CreateFauxReferencesDirectory (Path.Combine (path, "xbuild-frameworks"), new ApiInfo [] {
2238+
new ApiInfo () { Id = "23", Level = 23, Name = "Marshmallow", FrameworkVersion = "v6.0", Stable = true },
2239+
new ApiInfo () { Id = "26", Level = 26, Name = "Oreo", FrameworkVersion = "v8.0", Stable = true },
2240+
new ApiInfo () { Id = "27", Level = 27, Name = "Oreo", FrameworkVersion = "v8.1", Stable = true },
2241+
new ApiInfo () { Id = "P", Level = 28, Name = "P", FrameworkVersion="v8.99", Stable = false },
2242+
});
2243+
var proj = new XamarinAndroidApplicationProject () {
2244+
IsRelease = true,
2245+
TargetFrameworkVersion = "v8.0",
2246+
UseLatestPlatformSdk = false,
2247+
};
2248+
var parameters = new string [] {
2249+
$"TargetFrameworkRootPath={referencesPath}",
2250+
$"AndroidSdkDirectory={androidSdkPath}",
2251+
};
2252+
var envVar = new Dictionary<string, string> {
2253+
{ "XBUILD_FRAMEWORK_FOLDERS_PATH", referencesPath },
2254+
};
2255+
using (var builder = CreateApkBuilder (Path.Combine (path, proj.ProjectName), false, false)) {
2256+
builder.ThrowOnBuildFailure = false;
2257+
builder.Target = "_SetLatestTargetFrameworkVersion";
2258+
Assert.True (builder.Build (proj, parameters: parameters, environmentVariables: envVar),
2259+
string.Format ("First Build should have succeeded"));
2260+
Assert.IsTrue (builder.LastBuildOutput.ContainsOccurances ("TargetFrameworkVersion: v8.0", 2), "TargetFrameworkVersion should be v8.0");
2261+
2262+
proj.TargetFrameworkVersion = "v8.0";
2263+
Assert.True (builder.Build (proj, parameters: parameters, environmentVariables: envVar),
2264+
string.Format ("Second Build should have succeeded"));
2265+
Assert.IsTrue (builder.LastBuildOutput.ContainsOccurances ("TargetFrameworkVersion: v8.0", 2), "TargetFrameworkVersion should be v8.0");
2266+
2267+
proj.UseLatestPlatformSdk = true;
2268+
proj.TargetFrameworkVersion = "v8.1";
2269+
Assert.True (builder.Build (proj, parameters: parameters, environmentVariables: envVar),
2270+
string.Format ("Third Build should have succeeded"));
2271+
Assert.IsTrue (builder.LastBuildOutput.ContainsOccurances ("TargetFrameworkVersion: v8.1", 2), "TargetFrameworkVersion should be v8.1");
2272+
2273+
proj.UseLatestPlatformSdk = true;
2274+
proj.TargetFrameworkVersion = "v8.99";
2275+
Assert.True (builder.Build (proj, parameters: parameters, environmentVariables: envVar),
2276+
string.Format ("Third Build should have succeeded"));
2277+
Assert.IsTrue (builder.LastBuildOutput.ContainsOccurances ("TargetFrameworkVersion: v8.99", 2), "TargetFrameworkVersion should be v8.99");
2278+
2279+
proj.UseLatestPlatformSdk = true;
2280+
proj.TargetFrameworkVersion = "v6.0";
2281+
Assert.True (builder.Build (proj, parameters: parameters, environmentVariables: envVar),
2282+
string.Format ("Forth Build should have succeeded"));
2283+
Assert.IsTrue (builder.LastBuildOutput.ContainsOccurances ("TargetFrameworkVersion: v6.0", 1), "TargetFrameworkVersion should initially be v6.0");
2284+
Assert.IsTrue (builder.LastBuildOutput.ContainsOccurances ("TargetFrameworkVersion: v8.1", 1), "TargetFrameworkVersion should be v8.1");
2285+
}
2286+
Directory.Delete (referencesPath, recursive: true);
2287+
}
2288+
22312289
[Test]
22322290
[NonParallelizable]
22332291
public void BuildAMassiveApp()

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ public void CheckNdkBundle ([Values(true, false)] bool ndkRequred)
1919
{
2020
var path = Path.Combine ("temp", TestName);
2121
var referencePath = CreateFauxReferencesDirectory (Path.Combine (path, "references"), new ApiInfo [] {
22-
new ApiInfo () { Id = 26, Level = 26, Name = "Oreo", FrameworkVersion = "v8.0", Stable = true },
22+
new ApiInfo () { Id = "26", Level = 26, Name = "Oreo", FrameworkVersion = "v8.0", Stable = true },
2323
});
2424
MonoAndroidHelper.RefreshSupportedVersions (new string [] { referencePath });
2525
IBuildEngine engine = new MockBuildEngine (TestContext.Out);
@@ -59,7 +59,7 @@ public void ManifestFileDoesNotExist ()
5959
{
6060
var path = Path.Combine ("temp", TestName);
6161
var referencePath = CreateFauxReferencesDirectory (Path.Combine (path, "references"), new ApiInfo[] {
62-
new ApiInfo () { Id = 26, Level = 26, Name = "Oreo", FrameworkVersion = "v8.0", Stable = true },
62+
new ApiInfo () { Id = "26", Level = 26, Name = "Oreo", FrameworkVersion = "v8.0", Stable = true },
6363
} );
6464
MonoAndroidHelper.RefreshSupportedVersions (new string [] { referencePath });
6565
IBuildEngine engine = new MockBuildEngine (TestContext.Out);
@@ -94,7 +94,7 @@ public void ManifestFileExists ()
9494
{
9595
var path = Path.Combine (Root, "temp", TestName);
9696
var referencePath = CreateFauxReferencesDirectory (Path.Combine (path, "references"), new ApiInfo[] {
97-
new ApiInfo () { Id = 26, Level = 26, Name = "Oreo", FrameworkVersion = "v8.0", Stable = true },
97+
new ApiInfo () { Id = "26", Level = 26, Name = "Oreo", FrameworkVersion = "v8.0", Stable = true },
9898
} );
9999
MonoAndroidHelper.RefreshSupportedVersions (new string [] { referencePath });
100100
IBuildEngine engine = new MockBuildEngine (TestContext.Out);

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

Lines changed: 166 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System;
2+
using System.Collections.Generic;
23
using NUnit.Framework;
34
using Xamarin.ProjectTools;
45
using System.IO;
@@ -11,8 +12,169 @@
1112
namespace Xamarin.Android.Build.Tests {
1213

1314
[TestFixture]
14-
[Parallelizable (ParallelScope.Children)]
15+
[Parallelizable (ParallelScope.Self)]
1516
public class ResolveSdksTaskTests : BaseTest {
17+
#pragma warning disable 414
18+
19+
static ApiInfo [] apiInfoSelection = new ApiInfo [] {
20+
new ApiInfo () { Id = "26", Level = 26, Name = "Oreo", FrameworkVersion = "v8.0", Stable = true },
21+
new ApiInfo () { Id = "27", Level = 27, Name = "Oreo", FrameworkVersion = "v8.1", Stable = true },
22+
new ApiInfo () { Id = "P", Level = 28, Name = "P", FrameworkVersion = "v8.99", Stable = false },
23+
};
24+
25+
static object [] UseLatestAndroidSdkTestCases = new object [] {
26+
new object[] {
27+
/* buildtools */ "26.0.3",
28+
/* jdk */ "1.8.0",
29+
/* apis*/ apiInfoSelection,
30+
/* useLatestAndroidSdk */ true,
31+
/* targetFrameworkVersion */ "v8.99",
32+
/* expectedTaskResult */ true,
33+
/* expectedTargetFramework */ "v8.99",
34+
/* expectedError */ "",
35+
/* expectedErrorMessage */ "",
36+
},
37+
new object[] {
38+
/* buildtools */ "26.0.3",
39+
/* jdk */ "1.8.0",
40+
/* apis*/ apiInfoSelection,
41+
/* useLatestAndroidSdk */ true,
42+
/* targetFrameworkVersion */ "v8.0",
43+
/* expectedTaskResult */ true,
44+
/* expectedTargetFramework */ "v8.1",
45+
/* expectedError */ "",
46+
/* expectedErrorMessage */ "",
47+
},
48+
new object[] {
49+
/* buildtools */ "26.0.3",
50+
/* jdk */ "1.8.0",
51+
/* apis*/ apiInfoSelection,
52+
/* useLatestAndroidSdk */ true,
53+
/* targetFrameworkVersion */ "v8.1",
54+
/* expectedTaskResult */ true,
55+
/* expectedTargetFramework */ "v8.1",
56+
/* expectedError */ "",
57+
/* expectedErrorMessage */ "",
58+
},
59+
new object[] {
60+
/* buildtools */ "26.0.3",
61+
/* jdk */ "1.8.0",
62+
/* apis*/ apiInfoSelection,
63+
/* useLatestAndroidSdk */ true,
64+
/* targetFrameworkVersion */ "v6.0",
65+
/* expectedTaskResult */ true,
66+
/* expectedTargetFramework */ "v8.1",
67+
/* expectedError */ "",
68+
/* expectedErrorMessage */ "",
69+
},
70+
new object[] {
71+
/* buildtools */ "26.0.3",
72+
/* jdk */ "1.8.0",
73+
/* apis*/ apiInfoSelection,
74+
/* useLatestAndroidSdk */ true,
75+
/* targetFrameworkVersion */ null,
76+
/* expectedTaskResult */ true,
77+
/* expectedTargetFramework */ "v8.1",
78+
/* expectedError */ "",
79+
/* expectedErrorMessage */ "",
80+
},
81+
new object[] {
82+
/* buildtools */ "26.0.3",
83+
/* jdk */ "1.8.0",
84+
/* apis*/ apiInfoSelection,
85+
/* useLatestAndroidSdk */ false,
86+
/* targetFrameworkVersion */ "v8.99",
87+
/* expectedTaskResult */ true,
88+
/* expectedTargetFramework */ "v8.99",
89+
/* expectedError */ "",
90+
/* expectedErrorMessage */ "",
91+
},
92+
new object[] {
93+
/* buildtools */ "26.0.3",
94+
/* jdk */ "1.8.0",
95+
/* apis*/ apiInfoSelection,
96+
/* useLatestAndroidSdk */ false,
97+
/* targetFrameworkVersion */ "v8.1",
98+
/* expectedTaskResult */ true,
99+
/* expectedTargetFramework */ "v8.1",
100+
/* expectedError */ "",
101+
/* expectedErrorMessage */ "",
102+
},
103+
new object[] {
104+
/* buildtools */ "26.0.3",
105+
/* jdk */ "1.8.0",
106+
/* apis*/ apiInfoSelection,
107+
/* useLatestAndroidSdk */ false,
108+
/* targetFrameworkVersion */ "v8.0",
109+
/* expectedTaskResult */ true,
110+
/* expectedTargetFramework */ "v8.0",
111+
/* expectedError */ "",
112+
/* expectedErrorMessage */ "",
113+
},
114+
new object[] {
115+
/* buildtools */ "26.0.3",
116+
/* jdk */ "1.8.0",
117+
/* apis*/ apiInfoSelection,
118+
/* useLatestAndroidSdk */ false,
119+
/* targetFrameworkVersion */ null,
120+
/* expectedTaskResult */ true,
121+
/* expectedTargetFramework */ "v8.1",
122+
/* expectedError */ "",
123+
/* expectedErrorMessage */ "",
124+
},
125+
new object[] {
126+
/* buildtools */ "26.0.3",
127+
/* jdk */ "1.8.0",
128+
/* apis*/ apiInfoSelection,
129+
/* useLatestAndroidSdk */ false,
130+
/* targetFrameworkVersion */ "v6.0",
131+
/* expectedTaskResult */ false,
132+
/* expectedTargetFramework */ "v6.0",
133+
/* expectedError */ "XA0001",
134+
/* expectedErrorMessage */ "Unsupported or invalid $(TargetFrameworkVersion) value of 'v6.0'. Please update your Project Options.",
135+
},
136+
};
137+
#pragma warning restore 414
138+
[Test]
139+
[TestCaseSource(nameof(UseLatestAndroidSdkTestCases))]
140+
public void UseLatestAndroidSdk (string buildtools, string jdk, ApiInfo[] apis, bool useLatestAndroidSdk, string targetFrameworkVersion, bool expectedTaskResult, string expectedTargetFramework, string expectedError = "", string expectedErrorMessage = "")
141+
{
142+
var path = Path.Combine ("temp", "UseLatestAndroidSdk_" + Guid.NewGuid ());
143+
var androidSdkPath = CreateFauxAndroidSdkDirectory (Path.Combine (path, "android-sdk"), buildtools, minApiLevel: 26, maxApiLevel: 27, alphaApiLevel: "P");
144+
string javaExe = string.Empty;
145+
var javaPath = CreateFauxJavaSdkDirectory (Path.Combine (path, "jdk"), jdk, out javaExe);
146+
var referencePath = CreateFauxReferencesDirectory (Path.Combine (path, "references"), apis);
147+
var errors = new List<BuildErrorEventArgs> ();
148+
IBuildEngine engine = new MockBuildEngine (TestContext.Out, errors);
149+
var task = new ResolveSdks {
150+
BuildEngine = engine
151+
};
152+
task.AndroidSdkPath = androidSdkPath;
153+
task.AndroidNdkPath = androidSdkPath;
154+
task.JavaSdkPath = javaPath;
155+
task.TargetFrameworkVersion = targetFrameworkVersion;
156+
task.AndroidSdkBuildToolsVersion = buildtools;
157+
task.BuildingInsideVisualStudio = "true";
158+
task.UseLatestAndroidPlatformSdk = useLatestAndroidSdk;
159+
task.AotAssemblies = false;
160+
task.LatestSupportedJavaVersion = "1.8.0";
161+
task.MinimumSupportedJavaVersion = "1.7.0";
162+
task.ReferenceAssemblyPaths = new string [] {
163+
Path.Combine (referencePath, "MonoAndroid"),
164+
};
165+
task.CacheFile = Path.Combine (Root, path, "sdk.xml");
166+
task.SequencePointsMode = "None";
167+
task.JavaToolExe = javaExe;
168+
Assert.AreEqual (expectedTaskResult, task.Execute (), $"Task should have {(expectedTaskResult ? "succeeded" : "failed" )}.");
169+
Assert.AreEqual (expectedTargetFramework, task.TargetFrameworkVersion, $"TargetFrameworkVersion should be {expectedTargetFramework} but was {targetFrameworkVersion}");
170+
if (!string.IsNullOrWhiteSpace (expectedError)) {
171+
Assert.AreEqual (1, errors.Count (), "An error should have been raised.");
172+
Assert.AreEqual (expectedError, errors [0].Code, $"Expected error code {expectedError} but found {errors [0].Code}");
173+
Assert.AreEqual (expectedErrorMessage, errors [0].Message, $"Expected error code {expectedErrorMessage} but found {errors [0].Message}");
174+
}
175+
Directory.Delete (Path.Combine (Root, path), recursive: true);
176+
}
177+
16178
[Test]
17179
public void ResolveSdkTiming ()
18180
{
@@ -21,8 +183,8 @@ public void ResolveSdkTiming ()
21183
string javaExe = string.Empty;
22184
var javaPath = CreateFauxJavaSdkDirectory (Path.Combine (path, "jdk"), "1.8.0", out javaExe);
23185
var referencePath = CreateFauxReferencesDirectory (Path.Combine (path, "references"), new ApiInfo [] {
24-
new ApiInfo () { Id = 26, Level = 26, Name = "Oreo", FrameworkVersion = "v8.0", Stable = true },
25-
new ApiInfo () { Id = 27, Level = 27, Name = "Oreo", FrameworkVersion = "v8.1", Stable = true },
186+
new ApiInfo () { Id = "26", Level = 26, Name = "Oreo", FrameworkVersion = "v8.0", Stable = true },
187+
new ApiInfo () { Id = "27", Level = 27, Name = "Oreo", FrameworkVersion = "v8.1", Stable = true },
26188
});
27189
IBuildEngine engine = new MockBuildEngine (TestContext.Out);
28190
var task = new ResolveSdks {
@@ -75,6 +237,7 @@ public void ResolveSdkTiming ()
75237
Assert.AreEqual (task.AndroidUseApkSigner, false, "AndroidUseApkSigner should be false");
76238
Assert.AreEqual (task.JdkVersion, "1.8.0", "JdkVersion should be 1.8.0");
77239
Assert.AreEqual (task.MinimumRequiredJdkVersion, "1.8", "MinimumRequiredJdkVersion should be 1.8");
240+
Directory.Delete (Path.Combine (Root, path), recursive: true);
78241
}
79242
}
80243
}

src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Utilities/BaseTest.cs

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ protected string RunProcess (string exe, string args) {
104104
return result;
105105
}
106106

107-
protected string CreateFauxAndroidSdkDirectory (string path, string buildToolsVersion, int minApiLevel = 10, int maxApiLevel = 26)
107+
protected string CreateFauxAndroidSdkDirectory (string path, string buildToolsVersion, int minApiLevel = 10, int maxApiLevel = 26, string alphaApiLevel = "")
108108
{
109109
var androidSdkDirectory = Path.Combine (Root, path);
110110
var androidSdkToolsPath = Path.Combine (androidSdkDirectory, "tools");
@@ -129,11 +129,16 @@ protected string CreateFauxAndroidSdkDirectory (string path, string buildToolsVe
129129
Directory.CreateDirectory(dir);
130130
File.WriteAllText (Path.Combine (dir, "android.jar"), "");
131131
}
132+
if (!string.IsNullOrEmpty (alphaApiLevel)) {
133+
var dir = Path.Combine (androidSdkPlatformsPath, $"android-{alphaApiLevel}");
134+
Directory.CreateDirectory (dir);
135+
File.WriteAllText (Path.Combine (dir, "android.jar"), "");
136+
}
132137
return androidSdkDirectory;
133138
}
134139

135140
public struct ApiInfo {
136-
public int Id;
141+
public string Id;
137142
public int Level;
138143
public string Name;
139144
public string FrameworkVersion;
@@ -142,11 +147,12 @@ public struct ApiInfo {
142147

143148
protected string CreateFauxReferencesDirectory (string path, ApiInfo [] versions)
144149
{
145-
146150
string referencesDirectory = Path.Combine (Root, path);
147151
Directory.CreateDirectory (referencesDirectory);
148-
Directory.CreateDirectory (Path.Combine (referencesDirectory, "MonoAndroid", "v1.0"));
152+
Directory.CreateDirectory (Path.Combine (referencesDirectory, "MonoAndroid", "v1.0", "RedistList"));
149153
File.WriteAllText (Path.Combine (referencesDirectory, "MonoAndroid", "v1.0", "mscorlib.dll"), "");
154+
File.WriteAllText (Path.Combine (referencesDirectory, "MonoAndroid", "v1.0", "RedistList", "FrameworkList.xml"),
155+
$"<FileList Redist=\"MonoAndroid\" Name=\"Xamarin.Android Base Class Libraries\"></FileList>");
150156
foreach (var v in versions) {
151157
Directory.CreateDirectory (Path.Combine (referencesDirectory, "MonoAndroid", v.FrameworkVersion));
152158
Directory.CreateDirectory (Path.Combine (referencesDirectory, "MonoAndroid", v.FrameworkVersion, "RedistList"));

0 commit comments

Comments
 (0)