Skip to content

Commit d99facb

Browse files
authored
[ci] Use commandlinetools' avdmanager (dotnet#4770)
Context: dotnet#4567 Context: https://devdiv.visualstudio.com/DevDiv/_build/results?buildId=3711144&view=logs&jobId=4348ab7c-72f0-52b0-44fd-6f17a16a558f&j=8556562a-ae5f-5bd1-7c4d-bf1af4b6f1e1&t=9f016295-34d3-5b55-55cb-51df877e2cc6 Usage of `avdmanager` fails under JDK 11: TestApks.targets(45,5): error : Exception in thread "main" java.lang.NoClassDefFoundError: javax/xml/bind/annotation/XmlSchema TestApks.targets(45,5): error : at com.android.repository.api.SchemaModule$SchemaModuleVersion.<init>(SchemaModule.java:156) TestApks.targets(45,5): error : at com.android.repository.api.SchemaModule.<init>(SchemaModule.java:75) TestApks.targets(45,5): error : at com.android.sdklib.repository.AndroidSdkHandler.<clinit>(AndroidSdkHandler.java:81) TestApks.targets(45,5): error : at com.android.sdklib.tool.AvdManagerCli.run(AvdManagerCli.java:213) TestApks.targets(45,5): error : at com.android.sdklib.tool.AvdManagerCli.main(AvdManagerCli.java:200) TestApks.targets(45,5): error : Caused by: java.lang.ClassNotFoundException: javax.xml.bind.annotation.XmlSchema TestApks.targets(45,5): error : at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:583) TestApks.targets(45,5): error : at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178) TestApks.targets(45,5): error : at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521) TestApks.targets(45,5): error : ... 5 more TestApks.targets(45,5): error : Process `/Users/runner/Library/Android/sdk/tools/bin/avdmanager` exited with value 1. This is because the "normal" `tools`' `avdmanager` doesn't support JDK 11, and has been replaced with a *new* `commandlinetools` package whicih *does* support JDK 11. Begin installing the `commandlinetools` SDK package, and use it for `sdkmanager` invocations.
1 parent f52e89f commit d99facb

File tree

11 files changed

+97
-2
lines changed

11 files changed

+97
-2
lines changed

Configuration.props

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,9 @@
135135
<AndroidToolPath Condition=" '$(AndroidToolPath)' == '' ">$(AndroidSdkFullPath)\tools</AndroidToolPath>
136136
<AndroidToolsBinPath Condition=" '$(AndroidToolsBinPath)' == '' ">$(AndroidToolPath)\bin</AndroidToolsBinPath>
137137
<AndroidToolExe Condition=" '$(AndroidToolExe)' == '' ">android</AndroidToolExe>
138+
<CommandLineToolsFolder Condition=" '$(CommandLineToolsFolder)' == '' ">1.0</CommandLineToolsFolder>
139+
<CommandLineToolsVersion Condition=" '$(CommandLineToolsVersion)' == '' ">6200805_latest</CommandLineToolsVersion>
140+
<CommandLineToolsBinPath Condition=" '$(CommandLineToolsBinPath)' == '' ">$(AndroidSdkFullPath)\cmdline-tools\$(CommandLineToolsFolder)\bin</CommandLineToolsBinPath>
138141
<EmulatorVersion Condition=" '$(EmulatorVersion)' == '' ">6466327</EmulatorVersion>
139142
<EmulatorPkgRevision Condition=" '$(EmulatorPkgRevision)' == '' ">30.0.12</EmulatorPkgRevision>
140143
<EmulatorToolPath Condition=" '$(EmulatorToolPath)' == '' ">$(AndroidSdkFullPath)\emulator</EmulatorToolPath>

build-tools/check-boot-times/Program.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -509,21 +509,29 @@ static string GetProgramPath (params string [] filenames)
509509
if (!string.IsNullOrWhiteSpace (sdkPath)) {
510510
potentialLocations.AddRange (new []{
511511
$"{sdkPath}/platform-tools",
512+
$"{sdkPath}/cmdline-tools/1.0/bin",
513+
$"{sdkPath}/cmdline-tools/latest/bin",
512514
$"{sdkPath}/emulator",
513515
$"{sdkPath}/tools",
514516
$"{sdkPath}/tools/bin",
515517
});
516518
} else {
517519
potentialLocations.AddRange (new []{
518520
"AppData/Local/Android/Sdk/platform-tools",
521+
"AppData/Local/Android/Sdk/cmdline-tools/1.0/bin",
522+
"AppData/Local/Android/Sdk/cmdline-tools/latest/bin",
519523
"AppData/Local/Android/Sdk/emulator",
520524
"AppData/Local/Android/Sdk/tools",
521525
"AppData/Local/Android/Sdk/tools/bin",
522526
"Library/Android/sdk/platform-tools",
527+
"Library/Android/sdk/cmdline-tools/1.0/bin",
528+
"Library/Android/sdk/cmdline-tools/latest/bin",
523529
"Library/Android/sdk/emulator",
524530
"Library/Android/sdk/tools",
525531
"Library/Android/sdk/tools/bin",
526532
"android-toolchain/sdk/platform-tools",
533+
"android-toolchain/sdk/cmdline-tools/1.0/bin",
534+
"android-toolchain/sdk/cmdline-tools/latest/bin",
527535
"android-toolchain/sdk/emulator",
528536
"android-toolchain/sdk/tools",
529537
"android-toolchain/sdk/tools/bin",
@@ -532,6 +540,8 @@ static string GetProgramPath (params string [] filenames)
532540
if (RunningOnWindowsEnvironment) {
533541
potentialLocations.AddRange (new []{
534542
"C:/Program Files (x86)/Android/android-sdk/platform-tools",
543+
"C:/Program Files (x86)/Android/android-sdk/cmdline-tools/1.0/bin",
544+
"C:/Program Files (x86)/Android/android-sdk/cmdline-tools/latest/bin",
535545
"C:/Program Files (x86)/Android/android-sdk/emulator",
536546
"C:/Program Files (x86)/Android/android-sdk/tools",
537547
"C:/Program Files (x86)/Android/android-sdk/tools/bin",

build-tools/scripts/TestApks.targets

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@
5050
SdkVersion="29"
5151
ImageName="$(_TestImageName)"
5252
ToolExe="$(AvdManagerToolExe)"
53-
ToolPath="$(AndroidToolsBinPath)"
53+
ToolPath="$(CommandLineToolsBinPath)"
5454
RamSizeMB="3072"
5555
DataPartitionSizeMB="4096"
5656
/>

build-tools/xaprepare/xaprepare/Application/KnownProperties.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ static class KnownProperties
1616
public const string AutoProvision = "AutoProvision";
1717
public const string AutoProvisionUsesSudo = "AutoProvisionUsesSudo";
1818
public const string Configuration = "Configuration";
19+
public const string CommandLineToolsVersion = nameof (CommandLineToolsVersion);
20+
public const string CommandLineToolsFolder = nameof (CommandLineToolsFolder);
1921
public const string EmulatorVersion = "EmulatorVersion";
2022
public const string EmulatorPkgRevision = "EmulatorPkgRevision";
2123
public const string IgnoreMaxMonoVersion = "IgnoreMaxMonoVersion";

build-tools/xaprepare/xaprepare/Application/Properties.Defaults.cs.in

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ namespace Xamarin.Android.Prepare
2020
properties.Add (KnownProperties.AutoProvision, StripQuotes ("@AutoProvision@"));
2121
properties.Add (KnownProperties.AutoProvisionUsesSudo, StripQuotes ("@AutoProvisionUsesSudo@"));
2222
properties.Add (KnownProperties.Configuration, StripQuotes ("@Configuration@"));
23+
properties.Add (KnownProperties.CommandLineToolsFolder, StripQuotes ("@CommandLineToolsFolder@"));
24+
properties.Add (KnownProperties.CommandLineToolsVersion, StripQuotes ("@CommandLineToolsVersion@"));
2325
properties.Add (KnownProperties.EmulatorVersion, StripQuotes ("@EmulatorVersion@"));
2426
properties.Add (KnownProperties.EmulatorPkgRevision, StripQuotes ("@EmulatorPkgRevision@"));
2527
properties.Add (KnownProperties.IgnoreMaxMonoVersion, StripQuotes ("@IgnoreMaxMonoVersion@"));

build-tools/xaprepare/xaprepare/ConfigAndData/Dependencies/AndroidToolchain.Linux.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,6 @@ partial class AndroidToolchain
88
{
99
static readonly string osTag = "linux";
1010
static readonly string altOsTag = osTag;
11+
static readonly string cltOsTag = osTag;
1112
}
1213
}

build-tools/xaprepare/xaprepare/ConfigAndData/Dependencies/AndroidToolchain.MacOS.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,6 @@ partial class AndroidToolchain
44
{
55
static readonly string osTag = "darwin";
66
static readonly string altOsTag = "macosx";
7+
static readonly string cltOsTag = "mac";
78
}
89
}

build-tools/xaprepare/xaprepare/ConfigAndData/Dependencies/AndroidToolchain.Windows.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,6 @@ partial class AndroidToolchain
44
{
55
static readonly string osTag = "windows";
66
static readonly string altOsTag = osTag;
7+
static readonly string cltOsTag = "win";
78
}
89
}

build-tools/xaprepare/xaprepare/ConfigAndData/Dependencies/AndroidToolchain.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ public AndroidToolchain ()
1717
string AndroidNdkDirectory = GetRequiredProperty (KnownProperties.AndroidNdkDirectory);
1818
string AndroidCmakeVersion = GetRequiredProperty (KnownProperties.AndroidCmakeVersion);
1919
string AndroidCmakeVersionPath = GetRequiredProperty (KnownProperties.AndroidCmakeVersionPath);
20+
string CommandLineToolsVersion = GetRequiredProperty (KnownProperties.CommandLineToolsVersion);
21+
string CommandLineToolsFolder = GetRequiredProperty (KnownProperties.CommandLineToolsFolder);
2022
string EmulatorVersion = GetRequiredProperty (KnownProperties.EmulatorVersion);
2123
string EmulatorPkgRevision = GetRequiredProperty (KnownProperties.EmulatorPkgRevision);
2224
string XABuildToolsFolder = GetRequiredProperty (KnownProperties.XABuildToolsFolder);
@@ -51,6 +53,8 @@ public AndroidToolchain ()
5153
new AndroidToolchainComponent ($"x86-29_r07-{osTag}", destDir: Path.Combine ("system-images", "android-29", "default", "x86"), relativeUrl: new Uri ("sys-img/android/", UriKind.Relative), pkgRevision: "7"),
5254
new AndroidToolchainComponent ($"android-ndk-r{AndroidNdkVersion}-{osTag}-x86_64", destDir: AndroidNdkDirectory, pkgRevision: AndroidPkgRevision),
5355
new AndroidToolchainComponent ($"build-tools_r{XABuildToolsVersion}-{altOsTag}", destDir: Path.Combine ("build-tools", XABuildToolsFolder), isMultiVersion: true),
56+
new AndroidToolchainComponent ($"commandlinetools-{cltOsTag}-{CommandLineToolsVersion}",
57+
destDir: Path.Combine ("cmdline-tools", CommandLineToolsFolder), isMultiVersion: true),
5458
new AndroidToolchainComponent ($"platform-tools_r{XAPlatformToolsVersion}-{osTag}", destDir: "platform-tools", pkgRevision: XAPlatformToolsVersion),
5559
new AndroidToolchainComponent ($"sdk-tools-{osTag}-4333796", destDir: "tools", pkgRevision: "26.1.1"),
5660
new AndroidToolchainComponent ($"emulator-{osTag}-{EmulatorVersion}", destDir: "emulator", pkgRevision: EmulatorPkgRevision),

build-tools/xaprepare/xaprepare/Steps/Step_Android_SDK_NDK.cs

Lines changed: 70 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
using System.IO;
55
using System.Linq;
66
using System.Threading.Tasks;
7+
using System.Xml.Linq;
78
using Kajabity.Tools.Java;
89

910
namespace Xamarin.Android.Prepare
@@ -50,6 +51,7 @@ protected override async Task<bool> Execute (Context context)
5051
Log.ErrorLine ("Failed to accept Android SDK licenses");
5152
return false;
5253
}
54+
WritePackageXmls (sdkRoot);
5355
return GatherNDKInfo (context, ndkRoot);
5456
}
5557

@@ -94,12 +96,24 @@ protected override async Task<bool> Execute (Context context)
9496
return false;
9597
}
9698

99+
WritePackageXmls (sdkRoot);
100+
97101
return GatherNDKInfo (context, ndkRoot);
98102
}
99103

100104
bool AcceptLicenses (Context context, string sdkRoot)
101105
{
102-
string sdkManager = context.OS.Which (Path.Combine (sdkRoot, "tools", "bin", "sdkmanager"));
106+
string[] sdkManagerPaths = new[]{
107+
Path.Combine (sdkRoot, "cmdline-tools", context.Properties [KnownProperties.CommandLineToolsFolder], "bin", "sdkmanager"),
108+
Path.Combine (sdkRoot, "cmdline-tools", "latest", "bin", "sdkmanager"),
109+
Path.Combine (sdkRoot, "tools", "bin", "sdkmanager"),
110+
};
111+
string sdkManager = "";
112+
foreach (var sdkManagerPath in sdkManagerPaths) {
113+
sdkManager = context.OS.Which (sdkManagerPath, required: false);
114+
if (!string.IsNullOrEmpty (sdkManager))
115+
break;
116+
}
103117
if (sdkManager.Length == 0)
104118
throw new InvalidOperationException ("sdkmanager not found");
105119
string jdkDir = context.OS.JavaHome;
@@ -317,5 +331,60 @@ bool IsNdk (AndroidToolchainComponent component)
317331
{
318332
return component.Name.StartsWith ("android-ndk", StringComparison.OrdinalIgnoreCase);
319333
}
334+
335+
static readonly XNamespace AndroidRepositoryCommon = "http://schemas.android.com/repository/android/common/01";
336+
static readonly XNamespace AndroidRepositoryGeneric = "http://schemas.android.com/repository/android/generic/01";
337+
338+
void WritePackageXmls (string sdkRoot)
339+
{
340+
string[] packageXmlDirs = new[]{
341+
Path.Combine (sdkRoot, "emulator"),
342+
};
343+
foreach (var path in packageXmlDirs) {
344+
var properties = ReadSourceProperties (path);
345+
if (properties == null)
346+
continue;
347+
string packageXml = Path.Combine (path, "package.xml");
348+
Log.DebugLine ($"Writing '{packageXml}'");
349+
var doc = new XDocument(
350+
new XElement (AndroidRepositoryCommon + "repository",
351+
new XAttribute (XNamespace.Xmlns + "ns2", AndroidRepositoryCommon.NamespaceName),
352+
new XAttribute (XNamespace.Xmlns + "ns3", AndroidRepositoryGeneric.NamespaceName),
353+
new XElement ("localPackage",
354+
new XAttribute ("path", properties ["Pkg.Path"]),
355+
new XAttribute ("obsolete", "false"),
356+
new XElement ("revision", GetRevision (properties ["Pkg.Revision"])),
357+
new XElement ("display-name", properties ["Pkg.Desc"]))));
358+
doc.Save (packageXml, SaveOptions.None);
359+
}
360+
}
361+
362+
Dictionary<string, string>? ReadSourceProperties (string dir)
363+
{
364+
var path = Path.Combine (dir, "source.properties");
365+
if (!File.Exists (path))
366+
return null;
367+
var dict = new Dictionary<string, string> ();
368+
foreach (var line in File.ReadLines (path)) {
369+
if (line.Length == 0)
370+
continue;
371+
var entry = line.Split (new[]{'='}, 2, StringSplitOptions.None);
372+
if (entry.Length != 2)
373+
continue;
374+
dict.Add (entry [0], entry [1]);
375+
}
376+
return dict;
377+
}
378+
379+
IEnumerable<XElement> GetRevision (string revision)
380+
{
381+
var parts = revision.Split ('.');
382+
if (parts.Length > 0)
383+
yield return new XElement ("major", parts [0]);
384+
if (parts.Length > 1)
385+
yield return new XElement ("minor", parts [1]);
386+
if (parts.Length > 2)
387+
yield return new XElement ("micro", parts [2]);
388+
}
320389
}
321390
}

0 commit comments

Comments
 (0)