Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 9 additions & 3 deletions src/Xamarin.Android.Build.Tasks/Tasks/ResolveAndroidTooling.cs
Original file line number Diff line number Diff line change
Expand Up @@ -90,11 +90,17 @@ public override bool RunTask ()
AndroidApiLevel = GetMaxStableApiLevel ().ToString ();
}

var androidSdk = MonoAndroidHelper.AndroidSdk;
if (androidSdk == null || AndroidSdkPath.IsNullOrEmpty ()) {
Log.LogCodedError ("XA5300", Properties.Resources.XA5300_Android_SDK);
return false;
}

string toolsZipAlignPath = Path.Combine (AndroidSdkPath, "tools", ZipAlign);
bool findZipAlign = (ZipAlignPath.IsNullOrEmpty () || !Directory.Exists (ZipAlignPath)) && !File.Exists (toolsZipAlignPath);

var lintPaths = MonoAndroidHelper.AndroidSdk.GetCommandLineToolsPaths (CommandLineToolsVersion ?? "")
.SelectMany (p => new[]{
var lintPaths = androidSdk.GetCommandLineToolsPaths (CommandLineToolsVersion ?? "")
.SelectMany (p => new [] {
p,
Path.Combine (p, "bin"),
});
Expand All @@ -107,7 +113,7 @@ public override bool RunTask ()
}
}

foreach (var dir in MonoAndroidHelper.AndroidSdk.GetBuildToolsPaths (AndroidSdkBuildToolsVersion ?? "")) {
foreach (var dir in androidSdk.GetBuildToolsPaths (AndroidSdkBuildToolsVersion ?? "")) {
Log.LogDebugMessage ("Trying build-tools path: {0}", dir);
if (dir == null || !Directory.Exists (dir))
continue;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,12 @@ protected virtual bool ValidateJava (string javaExe, Regex versionRegex)
return version;
}

if (JavaSdkPath.IsNullOrEmpty ()) {
Log.LogDebugMessage ("JavaSdkPath is not set, unable to locate Java tools.");
Log.LogCodedError ("XA5300", Properties.Resources.XA5300_Java_SDK);
return null;
}

// NOTE: this doesn't need to use GetRegisteredTaskObjectAssemblyLocal()
// because the path to java/javac is the key and the value is a System.Version.
var javaTool = Path.Combine (JavaSdkPath, "bin", javaExe);
Expand Down Expand Up @@ -145,7 +151,7 @@ protected virtual bool ValidateJava (string javaExe, Regex versionRegex)
bool GetVersionFromFile (string javaExe, out Version version)
{
var path = Path.Combine (Path.GetDirectoryName (javaExe), "..", "release");
if (!File.Exists (path)) {
if (!File.Exists (path) && !JavaSdkPath.IsNullOrEmpty ()) {
path = Path.Combine (JavaSdkPath, "release");
}
if (!File.Exists (path)) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -219,5 +219,36 @@ public void ResolveSdkTiming ()
Directory.Delete (Path.Combine (Root, path), recursive: true);
}

[Test]
public void ResolveAndroidToolingWithMissingResolvedSdkDoesNotThrow ()
{
var path = Path.Combine (Path.GetTempPath (), "xa-tests", nameof (ResolveAndroidToolingWithMissingResolvedSdkDoesNotThrow), Guid.NewGuid ().ToString ("N"));
Directory.CreateDirectory (path);
var errors = new List<BuildErrorEventArgs> ();
var originalAndroidSdk = MonoAndroidHelper.AndroidSdk;
try {
MonoAndroidHelper.AndroidSdk = null;
IBuildEngine engine = new MockBuildEngine (TestContext.Out, errors);
var androidTooling = new Xamarin.Android.Tasks.ResolveAndroidTooling {
BuildEngine = engine,
AndroidSdkPath = path,
AndroidSdkBuildToolsVersion = "36.0.0",
TargetPlatformVersion = "37.0",
AotAssemblies = false,
SequencePointsMode = "None",
AndroidApplication = true,
};

Assert.IsFalse (androidTooling.Execute (), "ResolveAndroidTooling should fail when SDK resolution has not succeeded.");
Comment thread
jonathanpeppers marked this conversation as resolved.
Assert.AreEqual ("37", androidTooling.AndroidApiLevel, "AndroidApiLevel should still be calculated for dependency resolution.");
Assert.IsTrue (errors.Any (e => e.Code == "XA5300"), "XA5300 should be logged when Android SDK tooling is unavailable.");
Assert.IsFalse (errors.Any (e => e.Code == "XARAT7001"), "ResolveAndroidTooling should not throw when AndroidSdk is unavailable.");
} finally {
MonoAndroidHelper.AndroidSdk = originalAndroidSdk;
if (Directory.Exists (path))
Directory.Delete (path, recursive: true);
}
}

}
}
Original file line number Diff line number Diff line change
Expand Up @@ -200,5 +200,40 @@ public void ReleaseFile_Invalid ()
Assert.IsTrue (validateJavaVersion.Execute (), "Execute should succeed!");
Assert.IsTrue (messages.Any (m => m.Message.Contains ("did not contain a valid JAVA_VERSION")), "valid JAVA_VERSION should *not* be found");
}

[Test]
public void NullJavaSdkPathDoesNotThrow ()
{
var validateJavaVersion = new Xamarin.Android.Tasks.ValidateJavaVersion {
BuildEngine = engine,
JavaSdkPath = null,
JavaToolExe = "java",
JavacToolExe = "javac",
LatestSupportedJavaVersion = "17.99.0",
MinimumSupportedJavaVersion = "11.0.0",
UseJavaExeVersion = true,
};

Assert.IsFalse (validateJavaVersion.Execute (), "Execute should fail when JavaSdkPath is null.");
Assert.IsFalse (errors.Any (e => e.Code == "XAVJV7001"), "ValidateJavaVersion should not throw when JavaSdkPath is null.");
Assert.IsTrue (messages.Any (m => m.Message.Contains ("JavaSdkPath is not set")), "Should log debug message about missing JavaSdkPath.");
}

[Test]
public void NullJavaSdkPathWithReleaseFileDoesNotThrow ()
{
var validateJavaVersion = new Xamarin.Android.Tasks.ValidateJavaVersion {
BuildEngine = engine,
JavaSdkPath = null,
JavaToolExe = "java",
JavacToolExe = "javac",
LatestSupportedJavaVersion = "17.99.0",
MinimumSupportedJavaVersion = "11.0.0",
UseJavaExeVersion = false,
};

Assert.IsFalse (validateJavaVersion.Execute (), "Execute should fail when JavaSdkPath is null.");
Assert.IsFalse (errors.Any (e => e.Code == "XAVJV7001"), "ValidateJavaVersion should not throw when JavaSdkPath is null (release file path).");
}
}
}