Skip to content

Commit 4aff8b7

Browse files
committed
Merge branch 'main' into llvm-generator-update
* main: [Xamarin.Android.Build.Tasks] per-RID assemblies & typemaps (dotnet#8164) [AndroidDependenciesTests] Test both manifest types (dotnet#8186) [AndroidDependenciesTests] Use platform-tools 34.0.4 (dotnet#8184)
2 parents 2a781e2 + 6836818 commit 4aff8b7

File tree

5 files changed

+272
-290
lines changed

5 files changed

+272
-290
lines changed

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

Lines changed: 35 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using System.Collections.Generic;
33
using System.IO;
44
using System.Linq;
5+
using System.Text;
56
using System.Xml;
67
using System.Xml.Linq;
78
using NUnit.Framework;
@@ -16,11 +17,9 @@ public class AndroidDependenciesTests : BaseTest
1617
{
1718
[Test]
1819
[NonParallelizable] // Do not run environment modifying tests in parallel.
19-
public void InstallAndroidDependenciesTest ()
20+
public void InstallAndroidDependenciesTest ([Values ("GoogleV2", "Xamarin")] string manifestType)
2021
{
2122
AssertCommercialBuild ();
22-
// We need to grab the latest API level *before* changing env vars
23-
var apiLevel = AndroidSdkResolver.GetMaxInstalledPlatform ();
2423
var oldSdkPath = Environment.GetEnvironmentVariable ("TEST_ANDROID_SDK_PATH");
2524
var oldJdkPath = Environment.GetEnvironmentVariable ("TEST_ANDROID_JDK_PATH");
2625
try {
@@ -33,41 +32,48 @@ public void InstallAndroidDependenciesTest ()
3332
Directory.Delete (path, recursive: true);
3433
Directory.CreateDirectory (path);
3534
}
36-
var proj = new XamarinAndroidApplicationProject {
37-
TargetSdkVersion = apiLevel.ToString (),
35+
36+
var proj = new XamarinAndroidApplicationProject ();
37+
var buildArgs = new List<string> {
38+
"AcceptAndroidSDKLicenses=true",
39+
$"AndroidManifestType={manifestType}",
3840
};
39-
const string ExpectedPlatformToolsVersion = "34.0.3";
41+
// When using the default Xamarin manifest, this test should fail if we can't install any of the defaults in Xamarin.Android.Tools.Versions.props
42+
// When using the Google manifest, override the platform tools version to the one in their manifest as it only ever contains one version
43+
if (manifestType == "GoogleV2") {
44+
buildArgs.Add ($"AndroidSdkPlatformToolsVersion={GetCurrentPlatformToolsVersion ()}");
45+
}
46+
4047
using (var b = CreateApkBuilder ()) {
4148
b.CleanupAfterSuccessfulBuild = false;
4249
string defaultTarget = b.Target;
4350
b.Target = "InstallAndroidDependencies";
4451
b.BuildLogFile = "install-deps.log";
45-
Assert.IsTrue (b.Build (proj, parameters: new string [] {
46-
"AcceptAndroidSDKLicenses=true",
47-
"AndroidManifestType=GoogleV2", // Need GoogleV2 so we can install API-32
48-
$"AndroidSdkPlatformToolsVersion={ExpectedPlatformToolsVersion}",
49-
}), "InstallAndroidDependencies should have succeeded.");
50-
b.Target = defaultTarget;
51-
b.BuildLogFile = "build.log";
52-
Assert.IsTrue (b.Build (proj, true), "build should have succeeded.");
53-
bool usedNewDir = b.LastBuildOutput.ContainsText ($"Output Property: _AndroidSdkDirectory={sdkPath}");
54-
if (!usedNewDir) {
55-
// Is this because the platform-tools version changed (again?!)
56-
try {
57-
var currentPlatformToolsVersion = GetCurrentPlatformToolsVersion ();
58-
if (currentPlatformToolsVersion != ExpectedPlatformToolsVersion) {
59-
Assert.Fail ($"_AndroidSdkDirectory not set to new SDK path `{sdkPath}`, *probably* because Google's repository has a newer platform-tools package! " +
60-
$"repository2-3.xml contains platform-tools {currentPlatformToolsVersion}; expected {ExpectedPlatformToolsVersion}!");
52+
Assert.IsTrue (b.Build (proj, parameters: buildArgs.ToArray ()), "InstallAndroidDependencies should have succeeded.");
53+
54+
// When dependencies can not be resolved/installed a warning will be present in build output:
55+
// Dependency `platform-tools` should have been installed but could not be resolved.
56+
var depFailedMessage = "should have been installed but could not be resolved";
57+
bool failedToInstall = b.LastBuildOutput.ContainsText (depFailedMessage);
58+
if (failedToInstall) {
59+
var sb = new StringBuilder ();
60+
foreach (var line in b.LastBuildOutput) {
61+
if (line.Contains (depFailedMessage)) {
62+
sb.AppendLine (line);
6163
}
6264
}
63-
catch (Exception e) {
64-
TestContext.WriteLine ($"Could not extract platform-tools version from repository2-3.xml: {e}");
65-
}
65+
Assert.Fail ($"A required dependency was not installed, warnings are listed below. Please check the task output in 'install-deps.log'.\n{sb.ToString ()}");
6666
}
67-
Assert.IsTrue (usedNewDir, $"_AndroidSdkDirectory was not set to new SDK path `{sdkPath}`.");
67+
68+
b.Target = defaultTarget;
69+
b.BuildLogFile = "build.log";
70+
Assert.IsTrue (b.Build (proj, true), "build should have succeeded.");
71+
Assert.IsTrue ( b.LastBuildOutput.ContainsText ($"Output Property: _AndroidSdkDirectory={sdkPath}"),
72+
$"_AndroidSdkDirectory was not set to new SDK path `{sdkPath}`. Please check the task output in 'install-deps.log'");
6873
Assert.IsTrue (b.LastBuildOutput.ContainsText ($"Output Property: _JavaSdkDirectory={jdkPath}"),
69-
$"_JavaSdkDirectory was not set to new JDK path `{jdkPath}`.");
70-
Assert.IsTrue (b.LastBuildOutput.ContainsText ($"JavaPlatformJarPath={sdkPath}"), $"JavaPlatformJarPath did not contain new SDK path `{sdkPath}`.");
74+
$"_JavaSdkDirectory was not set to new JDK path `{jdkPath}`. Please check the task output in 'install-deps.log'");
75+
Assert.IsTrue (b.LastBuildOutput.ContainsText ($"JavaPlatformJarPath={sdkPath}"),
76+
$"JavaPlatformJarPath did not contain new SDK path `{sdkPath}`. Please check the task output in 'install-deps.log'");
7177
}
7278
} finally {
7379
Environment.SetEnvironmentVariable ("TEST_ANDROID_SDK_PATH", oldSdkPath);
@@ -89,7 +95,7 @@ static string GetCurrentPlatformToolsVersion ()
8995

9096
var revision = platformToolsPackage.Element ("revision");
9197

92-
return $"{revision.Element ("major")}.{revision.Element ("minor")}.{revision.Element ("micro")}";
98+
return $"{revision.Element ("major")?.Value}.{revision.Element ("minor")?.Value}.{revision.Element ("micro")?.Value}";
9399
}
94100

95101
[Test]

src/Xamarin.Android.Build.Tasks/Utilities/MonoAndroidHelper.cs

Lines changed: 21 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -536,6 +536,17 @@ public static string GetRelativePathForAndroidAsset (string assetsDirectory, ITa
536536
return path;
537537
}
538538

539+
public static AndroidTargetArch AbiToTargetArch (string abi)
540+
{
541+
return abi switch {
542+
"armeabi-v7a" => AndroidTargetArch.Arm,
543+
"arm64-v8a" => AndroidTargetArch.Arm64,
544+
"x86_64" => AndroidTargetArch.X86_64,
545+
"x86" => AndroidTargetArch.X86,
546+
_ => throw new NotSupportedException ($"Internal error: unsupported ABI '{abi}'")
547+
};
548+
}
549+
539550
public static string AbiToRid (string abi)
540551
{
541552
switch (abi) {
@@ -556,36 +567,6 @@ public static string AbiToRid (string abi)
556567
}
557568
}
558569

559-
public static AndroidTargetArch AbiToTargetArch (string abi)
560-
{
561-
switch (abi) {
562-
case "arm64-v8a":
563-
return AndroidTargetArch.Arm64;
564-
565-
case "armeabi-v7a":
566-
return AndroidTargetArch.Arm;
567-
568-
case "x86":
569-
return AndroidTargetArch.X86;
570-
571-
case "x86_64":
572-
return AndroidTargetArch.X86_64;
573-
574-
default:
575-
throw new InvalidOperationException ($"Internal error: unsupported ABI '{abi}'");
576-
}
577-
}
578-
579-
public static AndroidTargetArch GetTargetArch (ITaskItem asmItem)
580-
{
581-
string? abi = asmItem.GetMetadata ("Abi");
582-
if (String.IsNullOrEmpty (abi)) {
583-
return AndroidTargetArch.None;
584-
}
585-
586-
return AbiToTargetArch (abi);
587-
}
588-
589570
public static string ArchToRid (AndroidTargetArch arch)
590571
{
591572
return arch switch {
@@ -623,6 +604,16 @@ public static int ConvertSupportedOSPlatformVersionToApiLevel (string version)
623604
return apiLevel;
624605
}
625606

607+
public static AndroidTargetArch GetTargetArch (ITaskItem asmItem)
608+
{
609+
string? abi = asmItem.GetMetadata ("Abi");
610+
if (String.IsNullOrEmpty (abi)) {
611+
return AndroidTargetArch.None;
612+
}
613+
614+
return AbiToTargetArch (abi);
615+
}
616+
626617
static string GetToolsRootDirectoryRelativePath (string androidBinUtilsDirectory)
627618
{
628619
// We need to link against libc and libm, but since NDK is not in use, the linker won't be able to find the actual Android libraries.

src/Xamarin.Android.Build.Tasks/Utilities/TypeMapGenerator.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ public ReleaseGenerationState (string[] supportedAbis)
113113
if (TempModulesAbiAgnostic == null) {
114114
TempModulesAbiAgnostic = dict;
115115
}
116-
tempModules.Add (GeneratePackageManagerJava.GetAndroidTargetArchForAbi (abi), dict);
116+
tempModules.Add (MonoAndroidHelper.AbiToTargetArch (abi), dict);
117117
}
118118

119119
TempModules = new ReadOnlyDictionary<AndroidTargetArch, Dictionary<byte[], ModuleReleaseData>> (tempModules);

0 commit comments

Comments
 (0)