From a9b344a69fe6197a04cef19da19dda30a4e1b234 Mon Sep 17 00:00:00 2001 From: Jonathan Pryor Date: Fri, 8 Sep 2017 14:53:08 -0400 Subject: [PATCH] [Xamarin.Android.Build.Tasks] Use Xamarin.Android.Tools.AndroidSdk There is some code which is conceptually, if not literally, duplicated between the xamarin-android and the IDEs (Visual Studio, Visual Studio for Mac), in particular code that deals with finding the Android SDK and Java JDK locations. This code has been split out into a new `xamarin-android-tools` repo to facilitate sharing, without the IDEs needing to submodule xamarin-android, which is quite large. Cleanup the xamarin-android repo to use the new xamarin-android-tools repo for Android SDK information/etc. --- .gitmodules | 6 +- Makefile | 1 + Xamarin.Android.sln | 79 +++-- .../JdkInfo.cs | 45 ++- .../xa-prep-tasks/xa-prep-tasks.csproj | 6 +- external/xamarin-android-tools | 1 + src/Xamarin.Android.Build.Tasks/Tasks/Aapt.cs | 2 +- .../Tasks/AdjustJavacVersionArguments.cs | 2 +- src/Xamarin.Android.Build.Tasks/Tasks/Aot.cs | 2 +- .../Tasks/BuildApk.cs | 2 +- .../Tasks/CheckTargetFrameworks.cs | 2 +- .../Tasks/CompileToDalvik.cs | 2 +- .../Tasks/CreateMultiDexMainDexClassList.cs | 2 +- .../Tasks/Crunch.cs | 2 +- src/Xamarin.Android.Build.Tasks/Tasks/Dx.cs | 2 +- .../Tasks/GeneratePackageManagerJava.cs | 1 - .../Tasks/Generator.cs | 2 +- .../Tasks/GetAndroidPackageName.cs | 2 +- .../Tasks/GetJavaPlatformJar.cs | 3 +- .../Tasks/ImportJavaDoc.cs | 2 +- .../Tasks/JarToXml.cs | 6 +- .../Tasks/JavaCompileToolTask.cs | 2 +- .../Tasks/JavaToolTask.cs | 2 +- src/Xamarin.Android.Build.Tasks/Tasks/Lint.cs | 2 +- src/Xamarin.Android.Build.Tasks/Tasks/MDoc.cs | 2 +- .../Tasks/MakeBundleNativeCodeExternal.cs | 2 +- .../Tasks/NdkUtils.cs | 6 +- .../ParseAndroidWearProjectAndManifest.cs | 2 +- .../Tasks/PrepareWearApplicationFiles.cs | 2 +- .../Tasks/Proguard.cs | 2 +- .../Tasks/ReadResolvedSdksCache.cs | 2 - .../Tasks/ResolveSdksTask.cs | 12 +- .../Utilities}/FileUtil.cs | 2 +- .../Utilities}/GdbPaths.cs | 6 +- .../Utilities/ManifestDocument.cs | 2 +- .../Utilities/MonoAndroidHelper.cs | 46 ++- .../Utilities}/SatelliteAssembly.cs | 4 +- .../Xamarin.Android.Build.Tasks.csproj | 10 +- .../AndroidAppManifest.cs | 324 ------------------ .../AndroidLogger.cs | 129 ------- .../AndroidSdk.cs | 138 -------- .../AndroidTargetArch.cs | 19 - .../AndroidVersion.cs | 41 --- .../AndroidVersions.cs | 190 ---------- src/Xamarin.Android.Build.Utilities/OS.cs | 227 ------------ .../ProcessUtils.cs | 124 ------- .../Properties/AssemblyInfo.cs | 15 - .../Sdks/AndroidSdkBase.cs | 183 ---------- .../Sdks/AndroidSdkUnix.cs | 233 ------------- .../Sdks/AndroidSdkWindows.cs | 217 ------------ .../Xamarin.Android.Build.Utilities.csproj | 57 --- 51 files changed, 156 insertions(+), 2019 deletions(-) create mode 160000 external/xamarin-android-tools rename src/{Xamarin.Android.Build.Utilities => Xamarin.Android.Build.Tasks/Utilities}/FileUtil.cs (96%) rename src/{Xamarin.Android.Build.Utilities => Xamarin.Android.Build.Tasks/Utilities}/GdbPaths.cs (96%) rename src/{Xamarin.Android.Build.Utilities => Xamarin.Android.Build.Tasks/Utilities}/SatelliteAssembly.cs (91%) delete mode 100644 src/Xamarin.Android.Build.Utilities/AndroidAppManifest.cs delete mode 100644 src/Xamarin.Android.Build.Utilities/AndroidLogger.cs delete mode 100644 src/Xamarin.Android.Build.Utilities/AndroidSdk.cs delete mode 100644 src/Xamarin.Android.Build.Utilities/AndroidTargetArch.cs delete mode 100644 src/Xamarin.Android.Build.Utilities/AndroidVersion.cs delete mode 100644 src/Xamarin.Android.Build.Utilities/AndroidVersions.cs delete mode 100644 src/Xamarin.Android.Build.Utilities/OS.cs delete mode 100644 src/Xamarin.Android.Build.Utilities/ProcessUtils.cs delete mode 100644 src/Xamarin.Android.Build.Utilities/Properties/AssemblyInfo.cs delete mode 100644 src/Xamarin.Android.Build.Utilities/Sdks/AndroidSdkBase.cs delete mode 100644 src/Xamarin.Android.Build.Utilities/Sdks/AndroidSdkUnix.cs delete mode 100644 src/Xamarin.Android.Build.Utilities/Sdks/AndroidSdkWindows.cs delete mode 100644 src/Xamarin.Android.Build.Utilities/Xamarin.Android.Build.Utilities.csproj diff --git a/.gitmodules b/.gitmodules index 16e9d376ab1..1751d129dcc 100644 --- a/.gitmodules +++ b/.gitmodules @@ -37,7 +37,11 @@ path = external/proguard url = https://github.com/xamarin/proguard.git branch = master -[submodule "xamarin-android-api-compatibility"] +[submodule "external/xamarin-android-api-compatibility"] path = external/xamarin-android-api-compatibility url = https://github.com/xamarin/xamarin-android-api-compatibility.git branch = master +[submodule "external/xamarin-android-tools"] + path = external/xamarin-android-tools + url = https://github.com/xamarin/xamarin-android-tools + branch = master diff --git a/Makefile b/Makefile index 744f1b4b5ce..36a5e449ffb 100644 --- a/Makefile +++ b/Makefile @@ -97,6 +97,7 @@ prepare-external: prepare-deps nuget restore $(SOLUTION) nuget restore Xamarin.Android-Tests.sln $(foreach conf, $(CONFIGURATIONS), \ + (cd external/xamarin-android-tools && make prepare CONFIGURATION=$(conf)) && \ (cd $(call GetPath,JavaInterop) && make prepare CONFIGURATION=$(conf)) && \ (cd $(call GetPath,JavaInterop) && make bin/Build$(conf)/JdkInfo.props CONFIGURATION=$(conf)) && ) \ true diff --git a/Xamarin.Android.sln b/Xamarin.Android.sln index 75f2e92b5bb..b27695b59d6 100644 --- a/Xamarin.Android.sln +++ b/Xamarin.Android.sln @@ -33,8 +33,6 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Xamarin.Android.Tools.Aidl" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Xamarin.Android.Build.Tasks", "src\Xamarin.Android.Build.Tasks\Xamarin.Android.Build.Tasks.csproj", "{3F1F2F50-AF1A-4A5A-BEDB-193372F068D7}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Xamarin.Android.Build.Utilities", "src\Xamarin.Android.Build.Utilities\Xamarin.Android.Build.Utilities.csproj", "{91713046-C358-4647-B162-ED4E1442F3D8}" -EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Xamarin.Android.Tools.Bytecode", "external\Java.Interop\src\Xamarin.Android.Tools.Bytecode\Xamarin.Android.Tools.Bytecode.csproj", "{B17475BC-45A2-47A3-B8FC-62F3A0959EE0}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tools", "Tools", "{864062D3-A415-4A6F-9324-5820237BA058}" @@ -107,11 +105,15 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "create-vsix", "build-tools\ EndProject Project("{9344BDBB-3E7F-41FC-A0DD-8665D75EE146}") = "netstandard", "src\netstandard\netstandard.mdproj", "{93614CB8-4564-43B9-93B0-4AF4B3B16AAE}" EndProject -Project("{9344BDBB-3E7F-41FC-A0DD-8665D75EE146}") = "Mono.Android", "src\Mono.Android\Mono.Android.csproj", "{8B10353F-2D58-41D4-BB26-E75218A4A800}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "setup-windows", "tools\setup-windows\setup-windows.csproj", "{73DF9E10-E933-4222-B8E1-F4536FFF9FAD}" EndProject -Project("{9344BDBB-3E7F-41FC-A0DD-8665D75EE146}") = "Mono.Android.Export", "src\Mono.Android.Export\Mono.Android.Export.csproj", "{C31712E0-CFB1-47E5-855B-D0B59979F7B0}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Mono.Android", "src\Mono.Android\Mono.Android.csproj", "{66CF299A-CE95-4131-BCD8-DB66E30C4BF7}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "setup-windows", "tools\setup-windows\setup-windows.csproj", "{73DF9E10-E933-4222-B8E1-F4536FFF9FAD}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Mono.Android.Export", "src\Mono.Android.Export\Mono.Android.Export.csproj", "{B8105878-D423-4159-A3E7-028298281EC6}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Xamarin.Android.Tools.AndroidSdk", "external\xamarin-android-tools\src\Xamarin.Android.Tools.AndroidSdk\Xamarin.Android.Tools.AndroidSdk.csproj", "{E34BCFA0-CAA4-412C-AA1C-75DB8D67D157}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Xamarin.Android.Tools.AndroidSdk-Tests", "external\xamarin-android-tools\src\Xamarin.Android.Tools.AndroidSdk\Tests\Xamarin.Android.Tools.AndroidSdk-Tests.csproj", "{1E5501E8-49C1-4659-838D-CC9720C5208F}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -145,14 +147,6 @@ Global {8FF78EB6-6FC8-46A7-8A15-EBBA9045C5FA}.XAIntegrationDebug|Any CPU.Build.0 = Debug|Any CPU {8FF78EB6-6FC8-46A7-8A15-EBBA9045C5FA}.XAIntegrationRelease|Any CPU.ActiveCfg = Debug|Any CPU {8FF78EB6-6FC8-46A7-8A15-EBBA9045C5FA}.XAIntegrationRelease|Any CPU.Build.0 = Debug|Any CPU - {91713046-C358-4647-B162-ED4E1442F3D8}.Debug|AnyCPU.ActiveCfg = Debug|Any CPU - {91713046-C358-4647-B162-ED4E1442F3D8}.Debug|AnyCPU.Build.0 = Debug|Any CPU - {91713046-C358-4647-B162-ED4E1442F3D8}.Release|AnyCPU.ActiveCfg = Release|Any CPU - {91713046-C358-4647-B162-ED4E1442F3D8}.Release|AnyCPU.Build.0 = Release|Any CPU - {91713046-C358-4647-B162-ED4E1442F3D8}.XAIntegrationDebug|Any CPU.ActiveCfg = Debug|Any CPU - {91713046-C358-4647-B162-ED4E1442F3D8}.XAIntegrationDebug|Any CPU.Build.0 = Debug|Any CPU - {91713046-C358-4647-B162-ED4E1442F3D8}.XAIntegrationRelease|Any CPU.ActiveCfg = Debug|Any CPU - {91713046-C358-4647-B162-ED4E1442F3D8}.XAIntegrationRelease|Any CPU.Build.0 = Debug|Any CPU {94BD81F7-B06F-4295-9636-F8A3B6BDC762}.Debug|AnyCPU.ActiveCfg = Debug|Any CPU {94BD81F7-B06F-4295-9636-F8A3B6BDC762}.Release|AnyCPU.ActiveCfg = Release|Any CPU {94BD81F7-B06F-4295-9636-F8A3B6BDC762}.XAIntegrationDebug|Any CPU.ActiveCfg = XAIntegrationDebug|Any CPU @@ -495,22 +489,6 @@ Global {93614CB8-4564-43B9-93B0-4AF4B3B16AAE}.XAIntegrationDebug|AnyCPU.Build.0 = Debug|Any CPU {93614CB8-4564-43B9-93B0-4AF4B3B16AAE}.XAIntegrationRelease|AnyCPU.ActiveCfg = Debug|Any CPU {93614CB8-4564-43B9-93B0-4AF4B3B16AAE}.XAIntegrationRelease|AnyCPU.Build.0 = Debug|Any CPU - {8B10353F-2D58-41D4-BB26-E75218A4A800}.Debug|AnyCPU.ActiveCfg = Debug|Any CPU - {8B10353F-2D58-41D4-BB26-E75218A4A800}.Debug|AnyCPU.Build.0 = Debug|Any CPU - {8B10353F-2D58-41D4-BB26-E75218A4A800}.Release|AnyCPU.ActiveCfg = Release|Any CPU - {8B10353F-2D58-41D4-BB26-E75218A4A800}.Release|AnyCPU.Build.0 = Release|Any CPU - {8B10353F-2D58-41D4-BB26-E75218A4A800}.XAIntegrationDebug|Any CPU.ActiveCfg = Debug|Any CPU - {8B10353F-2D58-41D4-BB26-E75218A4A800}.XAIntegrationDebug|Any CPU.Build.0 = Debug|Any CPU - {8B10353F-2D58-41D4-BB26-E75218A4A800}.XAIntegrationRelease|Any CPU.ActiveCfg = Debug|Any CPU - {8B10353F-2D58-41D4-BB26-E75218A4A800}.XAIntegrationRelease|Any CPU.Build.0 = Debug|Any CPU - {C31712E0-CFB1-47E5-855B-D0B59979F7B0}.Debug|AnyCPU.ActiveCfg = Debug|Any CPU - {C31712E0-CFB1-47E5-855B-D0B59979F7B0}.Debug|AnyCPU.Build.0 = Debug|Any CPU - {C31712E0-CFB1-47E5-855B-D0B59979F7B0}.Release|AnyCPU.ActiveCfg = Release|Any CPU - {C31712E0-CFB1-47E5-855B-D0B59979F7B0}.Release|AnyCPU.Build.0 = Release|Any CPU - {C31712E0-CFB1-47E5-855B-D0B59979F7B0}.XAIntegrationDebug|Any CPU.ActiveCfg = Debug|Any CPU - {C31712E0-CFB1-47E5-855B-D0B59979F7B0}.XAIntegrationDebug|Any CPU.Build.0 = Debug|Any CPU - {C31712E0-CFB1-47E5-855B-D0B59979F7B0}.XAIntegrationRelease|Any CPU.ActiveCfg = Debug|Any CPU - {C31712E0-CFB1-47E5-855B-D0B59979F7B0}.XAIntegrationRelease|Any CPU.Build.0 = Debug|Any CPU {73DF9E10-E933-4222-B8E1-F4536FFF9FAD}.Debug|AnyCPU.ActiveCfg = Debug|Any CPU {73DF9E10-E933-4222-B8E1-F4536FFF9FAD}.Debug|AnyCPU.Build.0 = Debug|Any CPU {73DF9E10-E933-4222-B8E1-F4536FFF9FAD}.Release|AnyCPU.ActiveCfg = Release|Any CPU @@ -519,6 +497,42 @@ Global {73DF9E10-E933-4222-B8E1-F4536FFF9FAD}.XAIntegrationDebug|AnyCPU.Build.0 = Debug|Any CPU {73DF9E10-E933-4222-B8E1-F4536FFF9FAD}.XAIntegrationRelease|AnyCPU.ActiveCfg = Release|Any CPU {73DF9E10-E933-4222-B8E1-F4536FFF9FAD}.XAIntegrationRelease|AnyCPU.Build.0 = Release|Any CPU + {66CF299A-CE95-4131-BCD8-DB66E30C4BF7}.Debug|AnyCPU.ActiveCfg = Debug|Any CPU + {66CF299A-CE95-4131-BCD8-DB66E30C4BF7}.Debug|AnyCPU.Build.0 = Debug|Any CPU + {66CF299A-CE95-4131-BCD8-DB66E30C4BF7}.Release|AnyCPU.ActiveCfg = Release|Any CPU + {66CF299A-CE95-4131-BCD8-DB66E30C4BF7}.Release|AnyCPU.Build.0 = Release|Any CPU + {66CF299A-CE95-4131-BCD8-DB66E30C4BF7}.XAIntegrationDebug|Any CPU.ActiveCfg = Debug|Any CPU + {66CF299A-CE95-4131-BCD8-DB66E30C4BF7}.XAIntegrationDebug|Any CPU.Build.0 = Debug|Any CPU + {66CF299A-CE95-4131-BCD8-DB66E30C4BF7}.XAIntegrationRelease|Any CPU.ActiveCfg = Debug|Any CPU + {66CF299A-CE95-4131-BCD8-DB66E30C4BF7}.XAIntegrationRelease|Any CPU.Build.0 = Debug|Any CPU + {B8105878-D423-4159-A3E7-028298281EC6}.Debug|AnyCPU.ActiveCfg = Debug|Any CPU + {B8105878-D423-4159-A3E7-028298281EC6}.Debug|AnyCPU.Build.0 = Debug|Any CPU + {B8105878-D423-4159-A3E7-028298281EC6}.Release|AnyCPU.ActiveCfg = Release|Any CPU + {B8105878-D423-4159-A3E7-028298281EC6}.Release|AnyCPU.Build.0 = Release|Any CPU + {B8105878-D423-4159-A3E7-028298281EC6}.XAIntegrationDebug|Any CPU.ActiveCfg = Debug|Any CPU + {B8105878-D423-4159-A3E7-028298281EC6}.XAIntegrationDebug|Any CPU.Build.0 = Debug|Any CPU + {B8105878-D423-4159-A3E7-028298281EC6}.XAIntegrationRelease|Any CPU.ActiveCfg = Debug|Any CPU + {B8105878-D423-4159-A3E7-028298281EC6}.XAIntegrationRelease|Any CPU.Build.0 = Debug|Any CPU + {E34BCFA0-CAA4-412C-AA1C-75DB8D67D157}.Debug|AnyCPU.ActiveCfg = Debug|Any CPU + {E34BCFA0-CAA4-412C-AA1C-75DB8D67D157}.Debug|AnyCPU.Build.0 = Debug|Any CPU + {E34BCFA0-CAA4-412C-AA1C-75DB8D67D157}.Release|AnyCPU.ActiveCfg = Release|Any CPU + {E34BCFA0-CAA4-412C-AA1C-75DB8D67D157}.Release|AnyCPU.Build.0 = Release|Any CPU + {E34BCFA0-CAA4-412C-AA1C-75DB8D67D157}.XAIntegrationDebug|AnyCPU.ActiveCfg = Debug|Any CPU + {E34BCFA0-CAA4-412C-AA1C-75DB8D67D157}.XAIntegrationDebug|AnyCPU.Build.0 = Debug|Any CPU + {E34BCFA0-CAA4-412C-AA1C-75DB8D67D157}.XAIntegrationRelease|AnyCPU.ActiveCfg = Debug|Any CPU + {E34BCFA0-CAA4-412C-AA1C-75DB8D67D157}.XAIntegrationRelease|AnyCPU.Build.0 = Debug|Any CPU + {E34BCFA0-CAA4-412C-AA1C-75DB8D67D157}.XAIntegrationDebug|Any CPU.ActiveCfg = Debug|Any CPU + {E34BCFA0-CAA4-412C-AA1C-75DB8D67D157}.XAIntegrationDebug|Any CPU.Build.0 = Debug|Any CPU + {E34BCFA0-CAA4-412C-AA1C-75DB8D67D157}.XAIntegrationRelease|Any CPU.ActiveCfg = Debug|Any CPU + {E34BCFA0-CAA4-412C-AA1C-75DB8D67D157}.XAIntegrationRelease|Any CPU.Build.0 = Debug|Any CPU + {1E5501E8-49C1-4659-838D-CC9720C5208F}.Debug|AnyCPU.ActiveCfg = Debug|Any CPU + {1E5501E8-49C1-4659-838D-CC9720C5208F}.Debug|AnyCPU.Build.0 = Debug|Any CPU + {1E5501E8-49C1-4659-838D-CC9720C5208F}.Release|AnyCPU.ActiveCfg = Release|Any CPU + {1E5501E8-49C1-4659-838D-CC9720C5208F}.Release|AnyCPU.Build.0 = Release|Any CPU + {1E5501E8-49C1-4659-838D-CC9720C5208F}.XAIntegrationDebug|Any CPU.ActiveCfg = Debug|Any CPU + {1E5501E8-49C1-4659-838D-CC9720C5208F}.XAIntegrationDebug|Any CPU.Build.0 = Debug|Any CPU + {1E5501E8-49C1-4659-838D-CC9720C5208F}.XAIntegrationRelease|Any CPU.ActiveCfg = Release|Any CPU + {1E5501E8-49C1-4659-838D-CC9720C5208F}.XAIntegrationRelease|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(NestedProjects) = preSolution {8FF78EB6-6FC8-46A7-8A15-EBBA9045C5FA} = {E351F97D-EA4F-4E7F-AAA0-8EBB1F2A4A62} @@ -533,7 +547,6 @@ Global {E706B6F2-5562-4765-8F07-8CF84A797B30} = {04E3E11E-B47D-4599-8AFC-50515A95E715} {D27AD8F7-7710-40BE-B03B-55EFBEC13C44} = {04E3E11E-B47D-4599-8AFC-50515A95E715} {3F1F2F50-AF1A-4A5A-BEDB-193372F068D7} = {04E3E11E-B47D-4599-8AFC-50515A95E715} - {91713046-C358-4647-B162-ED4E1442F3D8} = {04E3E11E-B47D-4599-8AFC-50515A95E715} {B17475BC-45A2-47A3-B8FC-62F3A0959EE0} = {04E3E11E-B47D-4599-8AFC-50515A95E715} {52C7D9B6-E8C8-47D0-9471-652D278D7D77} = {864062D3-A415-4A6F-9324-5820237BA058} {D18FCF91-8876-48A0-A693-2DC1E7D3D80A} = {864062D3-A415-4A6F-9324-5820237BA058} @@ -570,9 +583,11 @@ Global {BD1D66BF-5AC7-4926-8EBE-B2198A112EB0} = {CAB438D8-B0F5-4AF0-BEBD-9E2ADBD7B483} {94756FEB-1F64-411D-A18E-81B5158F776A} = {E351F97D-EA4F-4E7F-AAA0-8EBB1F2A4A62} {93614CB8-4564-43B9-93B0-4AF4B3B16AAE} = {04E3E11E-B47D-4599-8AFC-50515A95E715} - {8B10353F-2D58-41D4-BB26-E75218A4A800} = {04E3E11E-B47D-4599-8AFC-50515A95E715} - {C31712E0-CFB1-47E5-855B-D0B59979F7B0} = {04E3E11E-B47D-4599-8AFC-50515A95E715} {73DF9E10-E933-4222-B8E1-F4536FFF9FAD} = {864062D3-A415-4A6F-9324-5820237BA058} + {66CF299A-CE95-4131-BCD8-DB66E30C4BF7} = {04E3E11E-B47D-4599-8AFC-50515A95E715} + {B8105878-D423-4159-A3E7-028298281EC6} = {04E3E11E-B47D-4599-8AFC-50515A95E715} + {E34BCFA0-CAA4-412C-AA1C-75DB8D67D157} = {04E3E11E-B47D-4599-8AFC-50515A95E715} + {1E5501E8-49C1-4659-838D-CC9720C5208F} = {CAB438D8-B0F5-4AF0-BEBD-9E2ADBD7B483} EndGlobalSection GlobalSection(MonoDevelopProperties) = preSolution Policies = $0 diff --git a/build-tools/xa-prep-tasks/Xamarin.Android.BuildTools.PrepTasks/JdkInfo.cs b/build-tools/xa-prep-tasks/Xamarin.Android.BuildTools.PrepTasks/JdkInfo.cs index 72375a6dd70..46f01bbedf3 100644 --- a/build-tools/xa-prep-tasks/Xamarin.Android.BuildTools.PrepTasks/JdkInfo.cs +++ b/build-tools/xa-prep-tasks/Xamarin.Android.BuildTools.PrepTasks/JdkInfo.cs @@ -1,9 +1,12 @@ using Microsoft.Build.Framework; using Microsoft.Build.Utilities; + +using System; using System.Collections.Generic; +using System.Diagnostics; using System.IO; using System.Text; -using Xamarin.Android.Build.Utilities; +using Xamarin.Android.Tools; namespace Xamarin.Android.BuildTools.PrepTasks { @@ -29,19 +32,15 @@ public override bool Execute () Log.LogMessage (MessageImportance.Low, $" {nameof (AndroidSdkPath)}: {AndroidSdkPath}"); Log.LogMessage (MessageImportance.Low, $" {nameof (JavaSdkPath)}: {JavaSdkPath}"); - AndroidLogger.Error += ErrorHandler; - AndroidLogger.Warning += WarningHandler; - AndroidLogger.Info += InfoHandler; + var androidSdk = new AndroidSdkInfo (CreateTaskLogger (this), AndroidSdkPath, AndroidNdkPath, JavaSdkPath); try { - AndroidSdk.Refresh (AndroidSdkPath, AndroidNdkPath, JavaSdkPath); - - var javaSdkPath = AndroidSdk.JavaSdkPath; + var javaSdkPath = androidSdk.JavaSdkPath; if (string.IsNullOrEmpty(javaSdkPath)) { Log.LogError ("JavaSdkPath is blank"); return false; } - Log.LogMessage (MessageImportance.Low, $" {nameof (AndroidSdk.JavaSdkPath)}: {javaSdkPath}"); + Log.LogMessage (MessageImportance.Low, $" {nameof (androidSdk.JavaSdkPath)}: {javaSdkPath}"); var jvmPath = Path.Combine (javaSdkPath, "jre", "bin", "server", "jvm.dll"); if (!File.Exists (jvmPath)) { @@ -82,25 +81,25 @@ public override bool Execute () return !Log.HasLoggedErrors; } finally { - AndroidLogger.Error -= ErrorHandler; - AndroidLogger.Warning -= WarningHandler; - AndroidLogger.Info -= InfoHandler; } } - private void ErrorHandler (string task, string message) - { - Log.LogError ($"{task}: {message}"); - } - - private void WarningHandler (string task, string message) + static Action CreateTaskLogger (Task task) { - Log.LogWarning ($"{task}: {message}"); - } - - private void InfoHandler (string task, string message) - { - Log.LogMessage (MessageImportance.Low, $"{task}: {message}"); + Action logger = (level, value) => { + switch (level) { + case TraceLevel.Error: + task.Log.LogError (value); + break; + case TraceLevel.Warning: + task.Log.LogWarning (value); + break; + default: + task.Log.LogMessage (MessageImportance.Low, "{0}", value); + break; + } + }; + return logger; } } } diff --git a/build-tools/xa-prep-tasks/xa-prep-tasks.csproj b/build-tools/xa-prep-tasks/xa-prep-tasks.csproj index 4b65e7064ea..3d1c11690a7 100644 --- a/build-tools/xa-prep-tasks/xa-prep-tasks.csproj +++ b/build-tools/xa-prep-tasks/xa-prep-tasks.csproj @@ -57,9 +57,9 @@ - - {91713046-c358-4647-b162-ed4e1442f3d8} - Xamarin.Android.Build.Utilities + + {E34BCFA0-CAA4-412C-AA1C-75DB8D67D157} + Xamarin.Android.Tools.AndroidSdk diff --git a/external/xamarin-android-tools b/external/xamarin-android-tools new file mode 160000 index 00000000000..aaaa9eb7bf4 --- /dev/null +++ b/external/xamarin-android-tools @@ -0,0 +1 @@ +Subproject commit aaaa9eb7bf46f0049b4f6c47268e5f6644d5d37a diff --git a/src/Xamarin.Android.Build.Tasks/Tasks/Aapt.cs b/src/Xamarin.Android.Build.Tasks/Tasks/Aapt.cs index 8d4045fad90..bb906a9c777 100644 --- a/src/Xamarin.Android.Build.Tasks/Tasks/Aapt.cs +++ b/src/Xamarin.Android.Build.Tasks/Tasks/Aapt.cs @@ -11,7 +11,7 @@ using Microsoft.Build.Framework; using System.Text.RegularExpressions; using System.Collections.Generic; -using Xamarin.Android.Build.Utilities; +using Xamarin.Android.Tools; using ThreadingTasks = System.Threading.Tasks; namespace Xamarin.Android.Tasks diff --git a/src/Xamarin.Android.Build.Tasks/Tasks/AdjustJavacVersionArguments.cs b/src/Xamarin.Android.Build.Tasks/Tasks/AdjustJavacVersionArguments.cs index 3b6e979047f..758bc338973 100644 --- a/src/Xamarin.Android.Build.Tasks/Tasks/AdjustJavacVersionArguments.cs +++ b/src/Xamarin.Android.Build.Tasks/Tasks/AdjustJavacVersionArguments.cs @@ -3,7 +3,7 @@ using Microsoft.Build.Framework; using System.IO; using System.Diagnostics; -using Xamarin.Android.Build.Utilities; +using Xamarin.Android.Tools; namespace Xamarin.Android.Tasks { diff --git a/src/Xamarin.Android.Build.Tasks/Tasks/Aot.cs b/src/Xamarin.Android.Build.Tasks/Tasks/Aot.cs index 752845b76e5..ab901ceff2f 100644 --- a/src/Xamarin.Android.Build.Tasks/Tasks/Aot.cs +++ b/src/Xamarin.Android.Build.Tasks/Tasks/Aot.cs @@ -12,7 +12,7 @@ using Microsoft.Build.Utilities; using Java.Interop.Tools.Diagnostics; -using Xamarin.Android.Build.Utilities; +using Xamarin.Android.Tools; namespace Xamarin.Android.Tasks { diff --git a/src/Xamarin.Android.Build.Tasks/Tasks/BuildApk.cs b/src/Xamarin.Android.Build.Tasks/Tasks/BuildApk.cs index e4258f178d5..242870be97c 100644 --- a/src/Xamarin.Android.Build.Tasks/Tasks/BuildApk.cs +++ b/src/Xamarin.Android.Build.Tasks/Tasks/BuildApk.cs @@ -15,7 +15,7 @@ using ArchiveFileList = System.Collections.Generic.List>; using Mono.Cecil; -using Xamarin.Android.Build.Utilities; +using Xamarin.Android.Tools; using Xamarin.Tools.Zip; namespace Xamarin.Android.Tasks diff --git a/src/Xamarin.Android.Build.Tasks/Tasks/CheckTargetFrameworks.cs b/src/Xamarin.Android.Build.Tasks/Tasks/CheckTargetFrameworks.cs index 8bf23fec2b0..51714c3b348 100644 --- a/src/Xamarin.Android.Build.Tasks/Tasks/CheckTargetFrameworks.cs +++ b/src/Xamarin.Android.Build.Tasks/Tasks/CheckTargetFrameworks.cs @@ -6,7 +6,7 @@ using System.Linq; using Java.Interop.Tools.Cecil; -using Xamarin.Android.Build.Utilities; +using Xamarin.Android.Tools; namespace Xamarin.Android.Tasks { diff --git a/src/Xamarin.Android.Build.Tasks/Tasks/CompileToDalvik.cs b/src/Xamarin.Android.Build.Tasks/Tasks/CompileToDalvik.cs index 67e71d4c4a4..2f11e67238d 100644 --- a/src/Xamarin.Android.Build.Tasks/Tasks/CompileToDalvik.cs +++ b/src/Xamarin.Android.Build.Tasks/Tasks/CompileToDalvik.cs @@ -7,7 +7,7 @@ using Microsoft.Build.Utilities; using Microsoft.Build.Framework; -using Xamarin.Android.Build.Utilities; +using Xamarin.Android.Tools; namespace Xamarin.Android.Tasks { diff --git a/src/Xamarin.Android.Build.Tasks/Tasks/CreateMultiDexMainDexClassList.cs b/src/Xamarin.Android.Build.Tasks/Tasks/CreateMultiDexMainDexClassList.cs index 26ffea29043..b593619ee9c 100644 --- a/src/Xamarin.Android.Build.Tasks/Tasks/CreateMultiDexMainDexClassList.cs +++ b/src/Xamarin.Android.Build.Tasks/Tasks/CreateMultiDexMainDexClassList.cs @@ -8,7 +8,7 @@ using Microsoft.Build.Utilities; using Microsoft.Build.Framework; using System.Collections.Specialized; -using Xamarin.Android.Build.Utilities; +using Xamarin.Android.Tools; namespace Xamarin.Android.Tasks { diff --git a/src/Xamarin.Android.Build.Tasks/Tasks/Crunch.cs b/src/Xamarin.Android.Build.Tasks/Tasks/Crunch.cs index 93afad98bb4..47a41126fac 100644 --- a/src/Xamarin.Android.Build.Tasks/Tasks/Crunch.cs +++ b/src/Xamarin.Android.Build.Tasks/Tasks/Crunch.cs @@ -7,7 +7,7 @@ using Microsoft.Build.Utilities; using Microsoft.Build.Framework; using System.Text.RegularExpressions; -using Xamarin.Android.Build.Utilities; +using Xamarin.Android.Tools; using Xamarin.Android.Tools.Aidl; using ThreadingTasks = System.Threading.Tasks; diff --git a/src/Xamarin.Android.Build.Tasks/Tasks/Dx.cs b/src/Xamarin.Android.Build.Tasks/Tasks/Dx.cs index e19162918c3..a6e03fcbcdd 100644 --- a/src/Xamarin.Android.Build.Tasks/Tasks/Dx.cs +++ b/src/Xamarin.Android.Build.Tasks/Tasks/Dx.cs @@ -7,7 +7,7 @@ using Microsoft.Build.Utilities; using System.Text; using System.Collections.Generic; -using Xamarin.Android.Build.Utilities; +using Xamarin.Android.Tools; using Xamarin.Android.Tools.Aidl; namespace Xamarin.Android.Tasks diff --git a/src/Xamarin.Android.Build.Tasks/Tasks/GeneratePackageManagerJava.cs b/src/Xamarin.Android.Build.Tasks/Tasks/GeneratePackageManagerJava.cs index e621df79902..99f9ffab016 100644 --- a/src/Xamarin.Android.Build.Tasks/Tasks/GeneratePackageManagerJava.cs +++ b/src/Xamarin.Android.Build.Tasks/Tasks/GeneratePackageManagerJava.cs @@ -8,7 +8,6 @@ using Microsoft.Build.Utilities; using Xamarin.Android.Tools; -using Xamarin.Android.Build.Utilities; namespace Xamarin.Android.Tasks { diff --git a/src/Xamarin.Android.Build.Tasks/Tasks/Generator.cs b/src/Xamarin.Android.Build.Tasks/Tasks/Generator.cs index f94e7287e36..f3eac16c83c 100644 --- a/src/Xamarin.Android.Build.Tasks/Tasks/Generator.cs +++ b/src/Xamarin.Android.Build.Tasks/Tasks/Generator.cs @@ -8,7 +8,7 @@ using System.Xml.Linq; using Microsoft.Build.Framework; using Microsoft.Build.Utilities; -using Xamarin.Android.Build.Utilities; +using Xamarin.Android.Tools; namespace Xamarin.Android.Tasks { diff --git a/src/Xamarin.Android.Build.Tasks/Tasks/GetAndroidPackageName.cs b/src/Xamarin.Android.Build.Tasks/Tasks/GetAndroidPackageName.cs index 27a1b2e17fa..8d82d32b708 100644 --- a/src/Xamarin.Android.Build.Tasks/Tasks/GetAndroidPackageName.cs +++ b/src/Xamarin.Android.Build.Tasks/Tasks/GetAndroidPackageName.cs @@ -29,7 +29,7 @@ using Microsoft.Build.Framework; using Microsoft.Build.Utilities; using Xamarin.Android.Tasks; -using Xamarin.Android.Build.Utilities; +using Xamarin.Android.Tools; namespace Xamarin.Android.Tasks { diff --git a/src/Xamarin.Android.Build.Tasks/Tasks/GetJavaPlatformJar.cs b/src/Xamarin.Android.Build.Tasks/Tasks/GetJavaPlatformJar.cs index 180bcb639b6..d68a9423edf 100644 --- a/src/Xamarin.Android.Build.Tasks/Tasks/GetJavaPlatformJar.cs +++ b/src/Xamarin.Android.Build.Tasks/Tasks/GetJavaPlatformJar.cs @@ -8,7 +8,6 @@ using Microsoft.Build.Utilities; using Xamarin.Android.Tools; -using Xamarin.Android.Build.Utilities; namespace Xamarin.Android.Tasks { @@ -70,7 +69,7 @@ public override bool Execute () } platform = GetTargetSdkVersion (platform, target_sdk); - JavaPlatformJarPath = Path.Combine (AndroidSdk.GetPlatformDirectoryFromApiLevel (platform, MonoAndroidHelper.SupportedVersions), "android.jar"); + JavaPlatformJarPath = Path.Combine (MonoAndroidHelper.AndroidSdk.TryGetPlatformDirectoryFromApiLevel (platform, MonoAndroidHelper.SupportedVersions), "android.jar"); if (!File.Exists (JavaPlatformJarPath)) { Log.LogError ("Could not find android.jar for API Level {0}. " + diff --git a/src/Xamarin.Android.Build.Tasks/Tasks/ImportJavaDoc.cs b/src/Xamarin.Android.Build.Tasks/Tasks/ImportJavaDoc.cs index d160a6672f6..0ba4e63863d 100644 --- a/src/Xamarin.Android.Build.Tasks/Tasks/ImportJavaDoc.cs +++ b/src/Xamarin.Android.Build.Tasks/Tasks/ImportJavaDoc.cs @@ -3,7 +3,7 @@ using System.IO; using Microsoft.Build.Framework; using Microsoft.Build.Utilities; -using Xamarin.Android.Build.Utilities; +using Xamarin.Android.Tools; using Xamarin.Android.Tools.Aidl; namespace Xamarin.Android.Tasks diff --git a/src/Xamarin.Android.Build.Tasks/Tasks/JarToXml.cs b/src/Xamarin.Android.Build.Tasks/Tasks/JarToXml.cs index b58547e5218..26a38498006 100644 --- a/src/Xamarin.Android.Build.Tasks/Tasks/JarToXml.cs +++ b/src/Xamarin.Android.Build.Tasks/Tasks/JarToXml.cs @@ -6,7 +6,7 @@ using System.Reflection; using Microsoft.Build.Framework; using Microsoft.Build.Utilities; -using Xamarin.Android.Build.Utilities; +using Xamarin.Android.Tools; namespace Xamarin.Android.Tasks { @@ -68,7 +68,7 @@ public override bool Execute () } // Ensure that the user has the platform they are targeting installed - var jarpath = Path.Combine (AndroidSdk.GetPlatformDirectoryFromApiLevel (AndroidApiLevel, MonoAndroidHelper.SupportedVersions), "android.jar"); + var jarpath = Path.Combine (MonoAndroidHelper.AndroidSdk.TryGetPlatformDirectoryFromApiLevel (AndroidApiLevel, MonoAndroidHelper.SupportedVersions), "android.jar"); if (!File.Exists (jarpath)) { Log.LogError ("Could not find android.jar for API Level {0}. This means the Android SDK platform for API Level {0} is not installed. Either install it in the Android SDK Manager, or change your Android Bindings project to target an API version that is installed. ({1} missing.)", AndroidApiLevel, jarpath); @@ -127,7 +127,7 @@ protected override string GenerateCommandLineCommands () } // Arguments sent to jar2xml - var jarpath = Path.Combine (AndroidSdk.GetPlatformDirectoryFromApiLevel (AndroidApiLevel, MonoAndroidHelper.SupportedVersions), "android.jar"); + var jarpath = Path.Combine (MonoAndroidHelper.AndroidSdk.TryGetPlatformDirectoryFromApiLevel (AndroidApiLevel, MonoAndroidHelper.SupportedVersions), "android.jar"); cmd.AppendSwitchIfNotNull ("--ref=", Path.GetFullPath (jarpath)); cmd.AppendSwitchIfNotNull ("--out=", Path.GetFullPath (OutputFile)); diff --git a/src/Xamarin.Android.Build.Tasks/Tasks/JavaCompileToolTask.cs b/src/Xamarin.Android.Build.Tasks/Tasks/JavaCompileToolTask.cs index 2d5c268e58e..23a7f3e08a0 100644 --- a/src/Xamarin.Android.Build.Tasks/Tasks/JavaCompileToolTask.cs +++ b/src/Xamarin.Android.Build.Tasks/Tasks/JavaCompileToolTask.cs @@ -7,7 +7,7 @@ using Microsoft.Build.Utilities; using System.Text; using System.Collections.Generic; -using Xamarin.Android.Build.Utilities; +using Xamarin.Android.Tools; namespace Xamarin.Android.Tasks { diff --git a/src/Xamarin.Android.Build.Tasks/Tasks/JavaToolTask.cs b/src/Xamarin.Android.Build.Tasks/Tasks/JavaToolTask.cs index d6c34399623..1e3b62d264f 100644 --- a/src/Xamarin.Android.Build.Tasks/Tasks/JavaToolTask.cs +++ b/src/Xamarin.Android.Build.Tasks/Tasks/JavaToolTask.cs @@ -6,7 +6,7 @@ using System.Text.RegularExpressions; using Microsoft.Build.Framework; using Microsoft.Build.Utilities; -using Xamarin.Android.Build.Utilities; +using Xamarin.Android.Tools; namespace Xamarin.Android.Tasks diff --git a/src/Xamarin.Android.Build.Tasks/Tasks/Lint.cs b/src/Xamarin.Android.Build.Tasks/Tasks/Lint.cs index 5a7789dd69d..7f533943ec2 100644 --- a/src/Xamarin.Android.Build.Tasks/Tasks/Lint.cs +++ b/src/Xamarin.Android.Build.Tasks/Tasks/Lint.cs @@ -5,7 +5,7 @@ using System.IO; using System.Xml.Linq; using System.Linq; -using Xamarin.Android.Build.Utilities; +using Xamarin.Android.Tools; namespace Xamarin.Android.Tasks { diff --git a/src/Xamarin.Android.Build.Tasks/Tasks/MDoc.cs b/src/Xamarin.Android.Build.Tasks/Tasks/MDoc.cs index 1981e1fe2a4..93bf4951404 100644 --- a/src/Xamarin.Android.Build.Tasks/Tasks/MDoc.cs +++ b/src/Xamarin.Android.Build.Tasks/Tasks/MDoc.cs @@ -3,7 +3,7 @@ using System.Linq; using Microsoft.Build.Framework; using Microsoft.Build.Utilities; -using Xamarin.Android.Build.Utilities; +using Xamarin.Android.Tools; using Xamarin.Android.Tools.Aidl; namespace Xamarin.Android.Tasks diff --git a/src/Xamarin.Android.Build.Tasks/Tasks/MakeBundleNativeCodeExternal.cs b/src/Xamarin.Android.Build.Tasks/Tasks/MakeBundleNativeCodeExternal.cs index 084101035e7..9399ca438b4 100644 --- a/src/Xamarin.Android.Build.Tasks/Tasks/MakeBundleNativeCodeExternal.cs +++ b/src/Xamarin.Android.Build.Tasks/Tasks/MakeBundleNativeCodeExternal.cs @@ -10,7 +10,7 @@ using Microsoft.Build.Utilities; using Java.Interop.Tools.Diagnostics; -using Xamarin.Android.Build.Utilities; +using Xamarin.Android.Tools; namespace Xamarin.Android.Tasks { diff --git a/src/Xamarin.Android.Build.Tasks/Tasks/NdkUtils.cs b/src/Xamarin.Android.Build.Tasks/Tasks/NdkUtils.cs index fa7e6f5ca74..ce89695662a 100644 --- a/src/Xamarin.Android.Build.Tasks/Tasks/NdkUtils.cs +++ b/src/Xamarin.Android.Build.Tasks/Tasks/NdkUtils.cs @@ -10,7 +10,7 @@ using Microsoft.Build.Utilities; using Java.Interop.Tools.Diagnostics; -using Xamarin.Android.Build.Utilities; +using Xamarin.Android.Tools; namespace Xamarin.Android.Tasks { @@ -73,7 +73,7 @@ public static string GetNdkTool (string androidNdkPath, AndroidTargetArch arch, string extension = OS.IsWindows ? ".exe" : string.Empty; List toolPaths = null; foreach (var platbase in toolchains) { - string path = Path.Combine (platbase, "prebuilt", AndroidSdk.AndroidNdkHostPlatform, "bin", GetNdkToolchainPrefix (arch) + tool + extension); + string path = Path.Combine (platbase, "prebuilt", MonoAndroidHelper.AndroidSdk.AndroidNdkHostPlatform, "bin", GetNdkToolchainPrefix (arch) + tool + extension); if (File.Exists (path)) return path; if (toolPaths == null) @@ -81,7 +81,7 @@ public static string GetNdkTool (string androidNdkPath, AndroidTargetArch arch, toolPaths.Add (path); } { - string path = Path.Combine (androidNdkPath, "prebuilt", AndroidSdk.AndroidNdkHostPlatform, "bin", tool); + string path = Path.Combine (androidNdkPath, "prebuilt", MonoAndroidHelper.AndroidSdk.AndroidNdkHostPlatform, "bin", tool); if (File.Exists (path)) return path; if (toolPaths == null) diff --git a/src/Xamarin.Android.Build.Tasks/Tasks/ParseAndroidWearProjectAndManifest.cs b/src/Xamarin.Android.Build.Tasks/Tasks/ParseAndroidWearProjectAndManifest.cs index 94bbdd8022a..0e3b9b7a6b2 100644 --- a/src/Xamarin.Android.Build.Tasks/Tasks/ParseAndroidWearProjectAndManifest.cs +++ b/src/Xamarin.Android.Build.Tasks/Tasks/ParseAndroidWearProjectAndManifest.cs @@ -5,7 +5,7 @@ using Microsoft.Build.Framework; using System.Xml.Linq; -using Xamarin.Android.Build.Utilities; +using Xamarin.Android.Tools; using Xamarin.Android.Tools.Aidl; namespace Xamarin.Android.Tasks diff --git a/src/Xamarin.Android.Build.Tasks/Tasks/PrepareWearApplicationFiles.cs b/src/Xamarin.Android.Build.Tasks/Tasks/PrepareWearApplicationFiles.cs index 961ddbef66f..5c2d8d9b366 100644 --- a/src/Xamarin.Android.Build.Tasks/Tasks/PrepareWearApplicationFiles.cs +++ b/src/Xamarin.Android.Build.Tasks/Tasks/PrepareWearApplicationFiles.cs @@ -3,7 +3,7 @@ using Microsoft.Build.Framework; using System.IO; using System.Xml.Linq; -using Xamarin.Android.Build.Utilities; +using Xamarin.Android.Tools; using Xamarin.Android.Tools.Aidl; namespace Xamarin.Android.Tasks diff --git a/src/Xamarin.Android.Build.Tasks/Tasks/Proguard.cs b/src/Xamarin.Android.Build.Tasks/Tasks/Proguard.cs index 54e5d74d509..add435746c2 100644 --- a/src/Xamarin.Android.Build.Tasks/Tasks/Proguard.cs +++ b/src/Xamarin.Android.Build.Tasks/Tasks/Proguard.cs @@ -11,7 +11,7 @@ using Microsoft.Build.Utilities; using Microsoft.Build.Framework; using System.Text.RegularExpressions; -using Xamarin.Android.Build.Utilities; +using Xamarin.Android.Tools; using System.IO.Compression; using Xamarin.Tools.Zip; diff --git a/src/Xamarin.Android.Build.Tasks/Tasks/ReadResolvedSdksCache.cs b/src/Xamarin.Android.Build.Tasks/Tasks/ReadResolvedSdksCache.cs index f6485e88144..337cab3cf98 100644 --- a/src/Xamarin.Android.Build.Tasks/Tasks/ReadResolvedSdksCache.cs +++ b/src/Xamarin.Android.Build.Tasks/Tasks/ReadResolvedSdksCache.cs @@ -87,11 +87,9 @@ public class ReadResolvedSdksCache : Task public override bool Execute () { - MonoAndroidHelper.InitializeAndroidLogger (ErrorHandler, WarningHandler, InfoHandler, DebugHandler); try { return RunTask (); } finally { - MonoAndroidHelper.ClearAndroidLogger (ErrorHandler, WarningHandler, InfoHandler, DebugHandler); } } diff --git a/src/Xamarin.Android.Build.Tasks/Tasks/ResolveSdksTask.cs b/src/Xamarin.Android.Build.Tasks/Tasks/ResolveSdksTask.cs index fb29d46ce12..e8227ef49f2 100644 --- a/src/Xamarin.Android.Build.Tasks/Tasks/ResolveSdksTask.cs +++ b/src/Xamarin.Android.Build.Tasks/Tasks/ResolveSdksTask.cs @@ -37,7 +37,7 @@ using Microsoft.Build.Framework; using Xamarin.Android.Tools; using System.Xml.Linq; -using Xamarin.Android.Build.Utilities; +using Xamarin.Android.Tools; using System.Text.RegularExpressions; namespace Xamarin.Android.Tasks @@ -119,12 +119,10 @@ public class ResolveSdks : Task public override bool Execute () { - MonoAndroidHelper.InitializeAndroidLogger (ErrorHandler, WarningHandler, InfoHandler, DebugHandler); try { return RunTask(); } finally { - MonoAndroidHelper.ClearAndroidLogger (ErrorHandler, WarningHandler, InfoHandler, DebugHandler); } } @@ -151,9 +149,9 @@ public bool RunTask () MonoAndroidHelper.RefreshSupportedVersions (ReferenceAssemblyPaths); MonoAndroidHelper.RefreshAndroidSdk (AndroidSdkPath, AndroidNdkPath, JavaSdkPath); - this.AndroidNdkPath = AndroidSdk.AndroidNdkPath; - this.AndroidSdkPath = AndroidSdk.AndroidSdkPath; - this.JavaSdkPath = AndroidSdk.JavaSdkPath; + this.AndroidNdkPath = MonoAndroidHelper.AndroidSdk.AndroidNdkPath; + this.AndroidSdkPath = MonoAndroidHelper.AndroidSdk.AndroidSdkPath; + this.JavaSdkPath = MonoAndroidHelper.AndroidSdk.JavaSdkPath; if (!ValidateJavaVersion (TargetFrameworkVersion, AndroidSdkBuildToolsVersion)) return false; @@ -180,7 +178,7 @@ public bool RunTask () } } - foreach (var dir in AndroidSdk.GetBuildToolsPaths (AndroidSdkBuildToolsVersion)) { + foreach (var dir in MonoAndroidHelper.AndroidSdk.GetBuildToolsPaths (AndroidSdkBuildToolsVersion)) { Log.LogDebugMessage ("Trying build-tools path: {0}", dir); if (dir == null || !Directory.Exists (dir)) continue; diff --git a/src/Xamarin.Android.Build.Utilities/FileUtil.cs b/src/Xamarin.Android.Build.Tasks/Utilities/FileUtil.cs similarity index 96% rename from src/Xamarin.Android.Build.Utilities/FileUtil.cs rename to src/Xamarin.Android.Build.Tasks/Utilities/FileUtil.cs index 7c81d7e4ad0..6fe8487e583 100644 --- a/src/Xamarin.Android.Build.Utilities/FileUtil.cs +++ b/src/Xamarin.Android.Build.Tasks/Utilities/FileUtil.cs @@ -2,7 +2,7 @@ using System.IO; using System.Runtime.InteropServices; -namespace Xamarin.Android.Build.Utilities +namespace Xamarin.Android.Tools { class FileUtil { diff --git a/src/Xamarin.Android.Build.Utilities/GdbPaths.cs b/src/Xamarin.Android.Build.Tasks/Utilities/GdbPaths.cs similarity index 96% rename from src/Xamarin.Android.Build.Utilities/GdbPaths.cs rename to src/Xamarin.Android.Build.Tasks/Utilities/GdbPaths.cs index e4079fc4765..257598511ea 100644 --- a/src/Xamarin.Android.Build.Utilities/GdbPaths.cs +++ b/src/Xamarin.Android.Build.Tasks/Utilities/GdbPaths.cs @@ -1,9 +1,9 @@ using System; using System.IO; -namespace Xamarin.Android.Build.Utilities +namespace Xamarin.Android.Tools { - public enum AndroidDebugServer + enum AndroidDebugServer { /// GNU's GDB debug server (provided by Android NDK) Gdb, @@ -13,7 +13,7 @@ public enum AndroidDebugServer Llgs } - public class GdbPaths + class GdbPaths { public static AndroidDebugServer? GetAndroidDebugServer (string name) { diff --git a/src/Xamarin.Android.Build.Tasks/Utilities/ManifestDocument.cs b/src/Xamarin.Android.Build.Tasks/Utilities/ManifestDocument.cs index 19499f32ab5..364db127edf 100644 --- a/src/Xamarin.Android.Build.Tasks/Utilities/ManifestDocument.cs +++ b/src/Xamarin.Android.Build.Tasks/Utilities/ManifestDocument.cs @@ -21,7 +21,7 @@ using System.Xml; using System.Text; -using Xamarin.Android.Build.Utilities; +using Xamarin.Android.Tools; namespace Xamarin.Android.Tasks { diff --git a/src/Xamarin.Android.Build.Tasks/Utilities/MonoAndroidHelper.cs b/src/Xamarin.Android.Build.Tasks/Utilities/MonoAndroidHelper.cs index 73776cd7f53..19f1dcafa42 100644 --- a/src/Xamarin.Android.Build.Tasks/Utilities/MonoAndroidHelper.cs +++ b/src/Xamarin.Android.Build.Tasks/Utilities/MonoAndroidHelper.cs @@ -6,7 +6,7 @@ using System.IO; using System.Security.Cryptography; using Mono.Security.Cryptography; -using Xamarin.Android.Build.Utilities; +using Xamarin.Android.Tools; using Xamarin.Tools.Zip; using Mono.Cecil; @@ -27,6 +27,7 @@ public class MonoAndroidHelper // Requires that ResolveSdks.Execute() run before anything else public static string[] TargetFrameworkDirectories; public static AndroidVersions SupportedVersions; + public static AndroidSdkInfo AndroidSdk; readonly static byte[] Utf8Preamble = System.Text.Encoding.UTF8.GetPreamble (); @@ -80,9 +81,34 @@ internal static string GetOSBinPath () } #if MSBUILD + static TaskLoggingHelper androidSdkLogger; + public static void RefreshAndroidSdk (string sdkPath, string ndkPath, string javaPath) { - AndroidSdk.Refresh (sdkPath, ndkPath, javaPath); + Action logger = (level, value) => { + var log = androidSdkLogger; + switch (level) { + case TraceLevel.Error: + if (log == null) + Console.Error.Write (value); + else + log.LogError ("{0}", value); + break; + case TraceLevel.Warning: + if (log == null) + Console.WriteLine (value); + else + log.LogWarning ("{0}", value); + break; + default: + if (log == null) + Console.WriteLine (value); + else + log.LogDebugMessage ("{0}", value); + break; + } + }; + AndroidSdk = new AndroidSdkInfo (logger, sdkPath, ndkPath, javaPath); } public static void RefreshSupportedVersions (string[] referenceAssemblyPaths) @@ -163,22 +189,14 @@ public static IEnumerable DistinctFilesByContent (IEnumerable + + <_MonoAndroidEnum Include="$(AndroidGeneratedClassDirectory)\Android.Content.PM.LaunchMode.cs" /> @@ -587,10 +589,6 @@ {D18FCF91-8876-48A0-A693-2DC1E7D3D80A} Java.Interop.Tools.JavaCallableWrappers - - {91713046-C358-4647-B162-ED4E1442F3D8} - Xamarin.Android.Build.Utilities - {B17475BC-45A2-47A3-B8FC-62F3A0959EE0} Xamarin.Android.Tools.Bytecode @@ -635,6 +633,10 @@ {C0487169-8F81-497F-919E-EB42B1D0243F} Xamarin.Android.Cecil.Mdb + + {E34BCFA0-CAA4-412C-AA1C-75DB8D67D157} + Xamarin.Android.Tools.AndroidSdk + diff --git a/src/Xamarin.Android.Build.Utilities/AndroidAppManifest.cs b/src/Xamarin.Android.Build.Utilities/AndroidAppManifest.cs deleted file mode 100644 index 86be7c12634..00000000000 --- a/src/Xamarin.Android.Build.Utilities/AndroidAppManifest.cs +++ /dev/null @@ -1,324 +0,0 @@ -using System; -using System.Linq; -using System.Xml; -using System.Collections.Generic; -using System.Xml.Linq; -using System.Text.RegularExpressions; -using System.Text; -using System.IO; - -namespace Xamarin.Android.Build.Utilities -{ - public class AndroidAppManifest - { - AndroidVersions versions; - XDocument doc; - XElement manifest, application, usesSdk; - - static readonly XNamespace aNS = "http://schemas.android.com/apk/res/android"; - static readonly XName aName = aNS + "name"; - - AndroidAppManifest (AndroidVersions versions, XDocument doc) - { - if (versions == null) - throw new ArgumentNullException (nameof (versions)); - if (doc == null) - throw new ArgumentNullException (nameof (doc)); - this.versions = versions; - this.doc = doc; - manifest = doc.Root; - if (manifest.Name != "manifest") - throw new Exception ("App manifest does not have 'manifest' root element"); - - application = manifest.Element ("application"); - if (application == null) - manifest.Add (application = new XElement ("application")); - - usesSdk = manifest.Element ("uses-sdk"); - if (usesSdk == null) - manifest.Add (usesSdk = new XElement ("uses-sdk")); - } - - public static string CanonicalizePackageName (string packageNameOrAssemblyName) - { - if (packageNameOrAssemblyName == null) - throw new ArgumentNullException ("packageNameOrAssemblyName"); - if (string.IsNullOrEmpty (packageNameOrAssemblyName = packageNameOrAssemblyName.Trim ())) - throw new ArgumentException ("Must specify a package name or assembly name", "packageNameOrAssemblyName"); - - string[] packageParts = packageNameOrAssemblyName.Split (new[]{'.'}, StringSplitOptions.RemoveEmptyEntries); - for (int i = 0; i < packageParts.Length; ++i) { - packageParts [i] = Regex.Replace (packageParts [i], "[^A-Za-z0-9_]", "_"); - if (char.IsDigit (packageParts [i], 0) || packageParts [i][0] == '_') - packageParts [i] = "x" + packageParts [i]; - } - return packageParts.Length == 1 - ? packageParts [0] + "." + packageParts [0] - : string.Join (".", packageParts); - } - - public static AndroidAppManifest Create (string packageName, string appLabel, AndroidVersions versions) - { - return new AndroidAppManifest (versions, XDocument.Parse ( - @" - - - - -")) { - PackageName = packageName, - ApplicationLabel = appLabel, - }; - } - - public static AndroidAppManifest Load (string filename, AndroidVersions versions) - { - return Load (XDocument.Load (filename), versions); - } - - public static AndroidAppManifest Load (XDocument doc, AndroidVersions versions) - { - return new AndroidAppManifest (versions, doc); - } - - public void Write (XmlWriter writer) - { - doc.Save (writer); - } - - public void WriteToFile (string fileName) - { - var xmlSettings = new XmlWriterSettings () { - Encoding = Encoding.UTF8, - CloseOutput = false, - Indent = true, - IndentChars = "\t", - NewLineChars = "\n", - }; - - var tempFile = FileUtil.GetTempFilenameForWrite (fileName); - bool success = false; - try { - using (var writer = XmlTextWriter.Create (tempFile, xmlSettings)) { - Write (writer); - } - FileUtil.SystemRename (tempFile, fileName); - success = true; - } finally { - if (!success) { - try { - File.Delete (tempFile); - } catch { - //the original exception is more important than this one - } - } - } - } - - static string NullIfEmpty (string value) - { - return string.IsNullOrEmpty (value) ? null : value; - } - - public string PackageName { - get { return (string) manifest.Attribute ("package"); } - set { manifest.SetAttributeValue ("package", NullIfEmpty (value)); } - } - - public string ApplicationLabel { - get { return (string) application.Attribute (aNS + "label"); } - set { application.SetAttributeValue (aNS + "label", NullIfEmpty (value)); } - } - - public string ApplicationIcon { - get { return (string) application.Attribute (aNS + "icon"); } - set { application.SetAttributeValue (aNS + "icon", NullIfEmpty (value)); } - } - - public string ApplicationTheme { - get { return (string) application.Attribute (aNS + "theme"); } - set { application.SetAttributeValue (aNS + "theme", NullIfEmpty (value)); } - } - - public string VersionName { - get { return (string) manifest.Attribute (aNS + "versionName"); } - set { manifest.SetAttributeValue (aNS + "versionName", NullIfEmpty (value)); } - } - - public string VersionCode { - get { return (string) manifest.Attribute (aNS + "versionCode"); } - set { manifest.SetAttributeValue (aNS + "versionCode", NullIfEmpty (value)); } - } - - public string InstallLocation { - get { return (string) manifest.Attribute (aNS + "installLocation"); } - set { manifest.SetAttributeValue (aNS + "installLocation", NullIfEmpty (value)); } - } - - public int? MinSdkVersion { - get { return ParseSdkVersion (usesSdk.Attribute (aNS + "minSdkVersion")); } - set { usesSdk.SetAttributeValue (aNS + "minSdkVersion", value == null ? null : value.ToString ()); } - } - - public int? TargetSdkVersion { - get { return ParseSdkVersion (usesSdk.Attribute (aNS + "targetSdkVersion")); } - set { usesSdk.SetAttributeValue (aNS + "targetSdkVersion", value == null ? null : value.ToString ()); } - } - - int? ParseSdkVersion (XAttribute attribute) - { - var version = (string)attribute; - if (string.IsNullOrEmpty (version)) - return null; - int vn; - if (!int.TryParse (version, out vn)) { - int? apiLevel = versions.GetApiLevelFromId (version); - if (apiLevel.HasValue) - return apiLevel.Value; - return versions.MaxStableVersion.ApiLevel; - } - return vn; - } - - public IEnumerable AndroidPermissions { - get { - foreach (var el in manifest.Elements ("uses-permission")) { - var name = (string) el.Attribute (aName); - if (name == null) - continue; - var lastDot = name.LastIndexOf ('.'); - if (lastDot >= 0) - yield return name.Substring (lastDot + 1); - } - } - } - - public IEnumerable AndroidPermissionsQualified { - get { - foreach (var el in manifest.Elements ("uses-permission")) { - var name = (string) el.Attribute (aName); - if (name != null) - yield return name; - } - } - } - - public bool? Debuggable { - get { return (bool?) application.Attribute (aNS + "debuggable"); } - set { application.SetAttributeValue (aNS + "debuggable", value); } - } - - public void SetAndroidPermissions (IEnumerable permissions) - { - var newPerms = new HashSet (permissions.Select (FullyQualifyPermission)); - var current = new HashSet (AndroidPermissionsQualified); - AddAndroidPermissions (newPerms.Except (current)); - RemoveAndroidPermissions (current.Except (newPerms)); - } - - void AddAndroidPermissions (IEnumerable permissions) - { - var newElements = permissions.Select (p => new XElement ("uses-permission", new XAttribute (aName, p))); - - var lastPerm = manifest.Elements ("uses-permission").LastOrDefault (); - if (lastPerm != null) { - foreach (var el in newElements) { - lastPerm.AddAfterSelf (el); - lastPerm = el; - } - } else { - var parentNode = (XNode) manifest.Element ("application") ?? manifest.LastNode; - foreach (var el in newElements) - parentNode.AddBeforeSelf (el); - } - } - - string FullyQualifyPermission (string permission) - { - //if already qualified, don't mess with it - if (permission.IndexOf ('.') > -1) - return permission; - - switch (permission) { - case "READ_HISTORY_BOOKMARKS": - case "WRITE_HISTORY_BOOKMARKS": - return string.Format ("com.android.browser.permission.{0}", permission); - default: - return string.Format ("android.permission.{0}", permission); - } - } - - void RemoveAndroidPermissions (IEnumerable permissions) - { - var perms = new HashSet (permissions); - var list = manifest.Elements ("uses-permission") - .Where (el => perms.Contains ((string)el.Attribute (aName))).ToList (); - foreach (var el in list) - el.Remove (); - } - - [Obsolete ("Use GetLaunchableFastdevActivityName or GetLaunchableUserActivityName")] - public string GetLaunchableActivityName () - { - return GetLaunchableFastDevActivityName (); - } - - /// Gets an activity that can be used to initialize the override directory for fastdev. - [Obsolete ("This should not be needed anymore; Activity execution is not part of installation.")] - public string GetLaunchableFastDevActivityName () - { - string first = null; - foreach (var a in GetLaunchableActivities ()) { - var name = (string) a.Attribute (aName); - //prefer the fastdev launcher, it's quicker - if (name == "mono.android.__FastDevLauncher") { - return name; - } - //else just use the first other launchable activity - if (first == null) { - first = name; - } - } - - return string.IsNullOrEmpty (first)? null : first; - } - - // We add a fake launchable activity for FastDev, but we don't want - // to launch that one when the user does Run or Debug - public string GetLaunchableUserActivityName () - { - return GetLaunchableActivities () - .Select (a => (string) a.Attribute (aName)) - .FirstOrDefault (name => !string.IsNullOrEmpty (name) && name != "mono.android.__FastDevLauncher"); - } - - IEnumerable GetLaunchableActivities () - { - foreach (var activity in application.Elements ("activity")) { - var filter = activity.Element ("intent-filter"); - if (filter != null) { - foreach (var category in filter.Elements ("category")) - if (category != null && (string)category.Attribute (aName) == "android.intent.category.LAUNCHER") - yield return activity; - } - } - } - - public IEnumerable GetAllActivityNames () - { - foreach (var activity in application.Elements ("activity")) { - var activityName = (string) activity.Attribute (aName); - if (activityName != "mono.android.__FastDevLauncher") - yield return activityName; - } - } - - public IEnumerable GetLaunchableActivityNames () - { - return GetLaunchableActivities () - .Select (a => (string) a.Attribute (aName)) - .Where (name => !string.IsNullOrEmpty (name) && name != "mono.android.__FastDevLauncher"); - } - } -} - diff --git a/src/Xamarin.Android.Build.Utilities/AndroidLogger.cs b/src/Xamarin.Android.Build.Utilities/AndroidLogger.cs deleted file mode 100644 index d06a0109ac4..00000000000 --- a/src/Xamarin.Android.Build.Utilities/AndroidLogger.cs +++ /dev/null @@ -1,129 +0,0 @@ -using System; - -namespace Xamarin.Android.Build.Utilities -{ - public delegate void MessageHandler (string task, string message); - public delegate void TaskLogHandler (AndroidTaskLog log); - - public static class AndroidLogger - { - public static event MessageHandler Info; - public static event MessageHandler Warning; - public static event MessageHandler Error; - public static event MessageHandler Debug; - public static event TaskLogHandler Task; - - public static void LogInfo (string format, params object[] args) - { - LogInfo (string.Empty, format, args); - } - - public static void LogInfo (string task, string format, params object[] args) - { - if (Info != null) { - if (args == null || args.Length == 0) - Info (task, format); - else - Info (task, String.Format (format, args)); - } else - throw new InvalidOperationException ("Internal Error: should initialize Info"); - } - - public static void LogWarning (string format, params object[] args) - { - LogWarning (string.Empty, format, args); - } - - public static void LogWarning (string task, string format, params object[] args) - { - if (Warning != null) { - if (args == null) - Warning (task, format); - else - Warning (task, String.Format (format, args)); - } else - throw new InvalidOperationException ("Internal Error: should initialize Warning"); - } - - public static void LogError (string format, params object[] args) - { - LogError (string.Empty, format, args); - } - - public static void LogError (string message, Exception ex) - { - message += (ex != null? System.Environment.NewLine + ex.ToString () : string.Empty); - LogError (message); - } - - public static void LogError (string task, string format, params object[] args) - { - if (Error != null) { - if (args == null || args.Length == 0) - Error (task, format); - else - Error (task, String.Format (format, args)); - } else - throw new InvalidOperationException ("Internal Error: should initialize Error"); - } - - public static void LogDebug (string format, params object[] args) - { - LogDebug (string.Empty, format, args); - } - - public static void LogDebug (string task, string format, params object[] args) - { - if (Debug != null) { - if (args == null || args.Length == 0) - Debug (task, format); - else - Debug (task, String.Format (format, args)); - } else - throw new InvalidOperationException ("Internal Error: should initialize Debug"); - } - - public static void LogTask (AndroidTaskLog log) - { - if (Task != null) - Task (log); - else - throw new InvalidOperationException ("Internal Error: should initialize Task"); - } - } - - public class AndroidTaskLog - { - public string Task { get; private set; } - public string Input { get; private set; } - public string Output { get; private set; } - public DateTime StartTime { get; private set; } - public DateTime EndTime { get; private set; } - - public AndroidTaskLog (string task, string input) - { - Task = task; - Input = input; - StartTime = DateTime.Now; - } - - public AndroidTaskLog Complete (string output) - { - Output = output; - EndTime = DateTime.Now; - - return this; - } - - public AndroidTaskLog Complete (object output) - { - if (output == null) - output = ""; - Output = output.ToString(); - EndTime = DateTime.Now; - - return this; - } - } -} - diff --git a/src/Xamarin.Android.Build.Utilities/AndroidSdk.cs b/src/Xamarin.Android.Build.Utilities/AndroidSdk.cs deleted file mode 100644 index 22f8edc266d..00000000000 --- a/src/Xamarin.Android.Build.Utilities/AndroidSdk.cs +++ /dev/null @@ -1,138 +0,0 @@ -using System; -using System.Linq; -using System.Collections.Generic; -using System.IO; - -namespace Xamarin.Android.Build.Utilities -{ - public class AndroidSdk - { - private static AndroidSdkBase sdk; - - public static void Refresh (string androidSdkPath = null, string androidNdkPath = null, string javaSdkPath = null) - { - if (OS.IsWindows) - sdk = new AndroidSdkWindows (); - else - sdk = new AndroidSdkUnix (); - - try { - sdk.Initialize (androidSdkPath ?? sdk.PreferedAndroidSdkPath, androidNdkPath ?? sdk.PreferedAndroidNdkPath, - javaSdkPath ?? sdk.PreferedJavaSdkPath); - if (IsInstalled) { - AndroidLogger.LogInfo (null, "Found Android SDK."); - } else { - AndroidLogger.LogInfo (null, "Did not find Android SDK"); - } - } catch (Exception ex) { - AndroidLogger.LogError ("Error finding Android/Java SDKs", ex); - } - } - - public static IEnumerable GetBuildToolsPaths (string preferredBuildToolsVersion) - { - if (!string.IsNullOrEmpty (preferredBuildToolsVersion)) { - var preferredDir = Path.Combine (AndroidSdkPath, "build-tools", preferredBuildToolsVersion); - if (Directory.Exists (preferredDir)) - return new[] { preferredDir }.Concat (GetBuildToolsPaths ().Where (p => p!= preferredDir)); - } - return GetBuildToolsPaths (); - } - - public static IEnumerable GetBuildToolsPaths () - { - ValidatePath (AndroidSdkPath); - - var buildTools = Path.Combine (AndroidSdkPath, "build-tools"); - if (Directory.Exists (buildTools)) { - var preview = Directory.EnumerateDirectories (buildTools) - .Where(x => TryParseVersion (Path.GetFileName (x)) == null) - .Select(x => x); - - foreach (var d in preview) - yield return d; - - var sorted = from p in Directory.EnumerateDirectories (buildTools) - let version = TryParseVersion (Path.GetFileName (p)) - where version != null - orderby version descending - select p; - - foreach (var d in sorted) - yield return d; - } - var ptPath = Path.Combine (AndroidSdkPath, "platform-tools"); - if (Directory.Exists (ptPath)) - yield return ptPath; - } - - static Version TryParseVersion (string v) - { - Version version; - if (Version.TryParse (v, out version)) - return version; - return null; - } - - static string ValidatePath (string path) - { - if (String.IsNullOrEmpty (path)) - throw new InvalidOperationException ("This property is not valid when the SDK is not installed"); - return path; - } - - public static string GetPlatformDirectory (int apiLevel) - { - return GetPlatformDirectoryFromId (apiLevel.ToString ()); - } - - public static string GetPlatformDirectoryFromId (string id) - { - return Path.Combine (AndroidSdkPath, "platforms", "android-" + id); - } - - public static string GetPlatformDirectoryFromApiLevel (string apiLevel, AndroidVersions versions) - { - var id = versions.GetIdFromApiLevel (apiLevel); - var dir = GetPlatformDirectoryFromId (id); - - if (Directory.Exists (dir)) - return dir; - - var level = versions.GetApiLevelFromId (id); - dir = level.HasValue ? GetPlatformDirectory (level.Value) : null; - if (dir != null && Directory.Exists (dir)) - return dir; - - return null; - } - - public static bool IsPlatformInstalled (int apiLevel) - { - return apiLevel != 0 && Directory.Exists (GetPlatformDirectory (apiLevel)); - } - - public static bool IsInstalled { - get { - return !string.IsNullOrEmpty (AndroidSdkPath) && !string.IsNullOrEmpty (JavaSdkPath); - } - } - - public static string AndroidNdkPath { - get { return sdk.AndroidNdkPath; } - } - - public static string AndroidSdkPath { - get { return sdk.AndroidSdkPath; } - } - - public static string JavaSdkPath { - get { return sdk.JavaSdkPath; } - } - - public static string AndroidNdkHostPlatform { - get { return sdk.NdkHostPlatform; } - } - } -} - diff --git a/src/Xamarin.Android.Build.Utilities/AndroidTargetArch.cs b/src/Xamarin.Android.Build.Utilities/AndroidTargetArch.cs deleted file mode 100644 index 7aebeee6fd8..00000000000 --- a/src/Xamarin.Android.Build.Utilities/AndroidTargetArch.cs +++ /dev/null @@ -1,19 +0,0 @@ -using System; -using System.Text.RegularExpressions; -using System.IO; - -namespace Xamarin.Android.Build.Utilities -{ - [Flags] - public enum AndroidTargetArch - { - None = 0, - Arm = 1, - X86 = 2, - Mips = 4, - Arm64 = 8, - X86_64 = 16, - Other = 0x10000 // hope it's not too optimistic - } -} - diff --git a/src/Xamarin.Android.Build.Utilities/AndroidVersion.cs b/src/Xamarin.Android.Build.Utilities/AndroidVersion.cs deleted file mode 100644 index 9efaaf8c0bc..00000000000 --- a/src/Xamarin.Android.Build.Utilities/AndroidVersion.cs +++ /dev/null @@ -1,41 +0,0 @@ -using System; - -namespace Xamarin.Android.Build.Utilities -{ - public class AndroidVersion - { - public AndroidVersion (int apilevel, string osVersion) - { - this.ApiLevel = apilevel; - this.OSVersion = osVersion; - } - - internal AndroidVersion (int apilevel, string osVersion, string codeName, Version version, string frameworkVersion = null, bool stable = true) - { - this.ApiLevel = apilevel; - this.Id = apilevel.ToString (); - // TODO: remove osVersion from parameter list and generate from version - this.OSVersion = osVersion; - this.CodeName = codeName; - this.Version = version; - this.FrameworkVersion = frameworkVersion; - this.Stable = stable; - } - - public int ApiLevel { get; private set; } - public string OSVersion { get; private set; } - public string CodeName { get; private set; } - public Version Version { get; private set; } - public string FrameworkVersion { get; private set; } - public string Id { get; internal set; } - public bool Stable { get; private set; } - - internal string[] AlternateIds { get; set; } - - public override string ToString () - { - return $"(AndroidVersion: ApiLevel={ApiLevel} OSVersion={OSVersion} CodeName='{CodeName}' Version={Version} FrameworkVersion={FrameworkVersion} Id={Id} Stable={Stable})"; - } - } -} - diff --git a/src/Xamarin.Android.Build.Utilities/AndroidVersions.cs b/src/Xamarin.Android.Build.Utilities/AndroidVersions.cs deleted file mode 100644 index 4d33a010028..00000000000 --- a/src/Xamarin.Android.Build.Utilities/AndroidVersions.cs +++ /dev/null @@ -1,190 +0,0 @@ -using System; -using System.Collections; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.IO; -using System.Linq; -using System.Xml.Linq; - -namespace Xamarin.Android.Build.Utilities -{ - public class AndroidVersions - { - List installedVersions = new List (); - - public IReadOnlyList FrameworkDirectories { get; } - public AndroidVersion MaxStableVersion { get; private set; } - - public AndroidVersions (IEnumerable frameworkDirectories) - { - if (frameworkDirectories == null) - throw new ArgumentNullException (nameof (frameworkDirectories)); - - var dirs = new List (); - - foreach (var d in frameworkDirectories) { - if (!Directory.Exists (d)) - throw new ArgumentException ($"`{d}` must be a directory!", nameof (frameworkDirectories)); - - var dp = d.TrimEnd (Path.DirectorySeparatorChar); - var dn = Path.GetFileName (dp); - // In "normal" use, `dp` will contain e.g. `...\MonoAndroid\v1.0`. - // We want the `MonoAndroid` dir, not the versioned dir. - var p = dn.StartsWith ("v", StringComparison.Ordinal) ? Path.GetDirectoryName (dp) : dp; - dirs.Add (Path.GetFullPath (p)); - } - - dirs = dirs.Distinct (StringComparer.OrdinalIgnoreCase) - .ToList (); - - FrameworkDirectories = new ReadOnlyCollection (dirs); - - ReadAndroidVersions (); - - AndroidLogger.LogInfo (null, "Xamarin.Android Supported $(TargetFrameworkVersion)s: {0}", string.Join (", ", installedVersions)); - } - - void ReadAndroidVersions () - { - foreach (var frameworkDirectory in FrameworkDirectories) { - foreach (var file in Directory.EnumerateFiles (frameworkDirectory, "AndroidApiInfo.xml", SearchOption.AllDirectories)) { - try { - var v = ToAndroidVersion (file); - installedVersions.Add (v); - if (MaxStableVersion == null || (v.Stable && MaxStableVersion.Version < v.Version)) { - MaxStableVersion = v; - } - } - catch (Exception e) { - AndroidLogger.LogError (message: $"Could not create AndroidVersion information for `{file}`.", ex: e); - } - } - } - } - - AndroidVersion ToAndroidVersion (string file) - { - var info = XDocument.Load (file); - var id = (string) info.Root.Element ("Id"); - var level = (int) info.Root.Element ("Level"); - var name = (string) info.Root.Element ("Name"); - var version = (string) info.Root.Element ("Version"); - var stable = (bool) info.Root.Element ("Stable"); - var pver = version.TrimStart ('v'); - var v = new AndroidVersion (level, pver, name, Version.Parse (pver), version, stable) { - Id = id, - }; - return v; - } - - public int? GetApiLevelFromFrameworkVersion (string frameworkVersion) - { - return installedVersions.FirstOrDefault (v => v.FrameworkVersion == frameworkVersion)?.ApiLevel ?? - KnownVersions.FirstOrDefault (v => v.FrameworkVersion == frameworkVersion)?.ApiLevel; - } - - public int? GetApiLevelFromId (string id) - { - return installedVersions.FirstOrDefault (v => MatchesId (v, id))?.ApiLevel ?? - KnownVersions.FirstOrDefault (v => MatchesId (v, id))?.ApiLevel; - } - - static bool MatchesId (AndroidVersion version, string id) - { - return version.Id == id || - (version.AlternateIds?.Contains (id) ?? false) || - (version.ApiLevel.ToString () == id); - } - - public string GetIdFromApiLevel (int apiLevel) - { - return installedVersions.FirstOrDefault (v => v.ApiLevel == apiLevel)?.Id ?? - KnownVersions.FirstOrDefault (v => v.ApiLevel == apiLevel)?.Id; - } - - // Sometimes, e.g. when new API levels are introduced, the "API level" is a letter, not a number, - // e.g. 'API-H' for API-11, 'API-O' for API-26, etc. - public string GetIdFromApiLevel (string apiLevel) - { - if (int.TryParse (apiLevel, out var platform)) - return GetIdFromApiLevel (platform); - return installedVersions.FirstOrDefault (v => MatchesId (v, apiLevel))?.Id ?? - KnownVersions.FirstOrDefault (v => MatchesId (v, apiLevel))?.Id; - } - - public string GetIdFromFrameworkVersion (string frameworkVersion) - { - return installedVersions.FirstOrDefault (v => v.FrameworkVersion == frameworkVersion)?.Id ?? - KnownVersions.FirstOrDefault (v => v.FrameworkVersion == frameworkVersion)?.Id; - } - - public string GetFrameworkVersionFromApiLevel (int apiLevel) - { - return installedVersions.FirstOrDefault (v => v.ApiLevel == apiLevel)?.FrameworkVersion ?? - KnownVersions.FirstOrDefault (v => v.ApiLevel == apiLevel)?.FrameworkVersion; - } - - public string GetFrameworkVersionFromId (string id) - { - return installedVersions.FirstOrDefault (v => MatchesId (v, id))?.FrameworkVersion ?? - KnownVersions.FirstOrDefault (v => MatchesId (v, id))?.FrameworkVersion; - } - - static readonly AndroidVersion [] KnownVersions = new [] { - new AndroidVersion (4, "1.6", "Donut", new Version (1, 6)), - new AndroidVersion (5, "2.0", "Eclair", new Version (2, 0)), - new AndroidVersion (6, "2.0.1", "Eclair", new Version (2, 0, 1)), - new AndroidVersion (7, "2.1", "Eclair", new Version (2, 1)), - new AndroidVersion (8, "2.2", "Froyo", new Version (2, 2)), - new AndroidVersion (10, "2.3", "Gingerbread", new Version (2, 3)), - new AndroidVersion (11, "3.0", "Honeycomb", new Version (3, 0)) { - AlternateIds = new[]{ "H" }, - }, - new AndroidVersion (12, "3.1", "Honeycomb", new Version (3, 1)), - new AndroidVersion (13, "3.2", "Honeycomb", new Version (3, 2)), - new AndroidVersion (14, "4.0", "Ice Cream Sandwich", new Version (4, 0)), - new AndroidVersion (15, "4.0.3", "Ice Cream Sandwich", new Version (4, 0, 3)), - new AndroidVersion (16, "4.1", "Jelly Bean", new Version (4, 1)), - new AndroidVersion (17, "4.2", "Jelly Bean", new Version (4, 2)), - new AndroidVersion (18, "4.3", "Jelly Bean", new Version (4, 3)), - new AndroidVersion (19, "4.4", "Kit Kat", new Version (4, 4)), - new AndroidVersion (20, "4.4.87", "Kit Kat + Wear support", new Version (4, 4, 87)), - new AndroidVersion (21, "5.0", "Lollipop", new Version (5, 0)) { - AlternateIds = new[]{ "L" }, - }, - new AndroidVersion (22, "5.1", "Lollipop", new Version (5, 1)), - new AndroidVersion (23, "6.0", "Marshmallow", new Version (6, 0)) { - AlternateIds = new[]{ "M" }, - }, - new AndroidVersion (24, "7.0", "Nougat", new Version (7, 0)) { - AlternateIds = new[]{ "N" }, - }, - new AndroidVersion (25, "7.1", "Nougat", new Version (7, 1)), - new AndroidVersion (26, "8.0", "Oreo", new Version (8, 0)) { - AlternateIds = new[]{ "O" }, - }, - }; - } - - class EqualityComparer : IEqualityComparer - { - Func equals; - Func getHashCode; - - public EqualityComparer (Func equals, Func getHashCode = null) - { - this.equals = equals; - this.getHashCode = getHashCode ?? (v => v.GetHashCode ()); - } - - public bool Equals (T x, T y) - { - return equals (x, y); - } - - public int GetHashCode (T obj) - { - return getHashCode (obj); - } - } -} diff --git a/src/Xamarin.Android.Build.Utilities/OS.cs b/src/Xamarin.Android.Build.Utilities/OS.cs deleted file mode 100644 index 0ff07cd2185..00000000000 --- a/src/Xamarin.Android.Build.Utilities/OS.cs +++ /dev/null @@ -1,227 +0,0 @@ -using System; -using System.Runtime.InteropServices; -using System.IO; -using System.Text; - -namespace Xamarin.Android.Build.Utilities -{ - public class OS - { - public readonly static bool IsWindows; - public readonly static bool IsMac; - - internal readonly static string ProgramFilesX86; - - static OS () - { - IsWindows = Path.DirectorySeparatorChar == '\\'; - IsMac = !IsWindows && IsRunningOnMac (); - - if (IsWindows) { - ProgramFilesX86 = GetProgramFilesX86 (); - } - } - - //From Managed.Windows.Forms/XplatUI - static bool IsRunningOnMac () - { - IntPtr buf = IntPtr.Zero; - try { - buf = Marshal.AllocHGlobal (8192); - // This is a hacktastic way of getting sysname from uname () - if (uname (buf) == 0) { - string os = System.Runtime.InteropServices.Marshal.PtrToStringAnsi (buf); - if (os == "Darwin") - return true; - } - } catch { - } finally { - if (buf != IntPtr.Zero) - System.Runtime.InteropServices.Marshal.FreeHGlobal (buf); - } - return false; - } - - [DllImport ("libc")] - static extern int uname (IntPtr buf); - - static string GetProgramFilesX86 () - { - //SpecialFolder.ProgramFilesX86 is broken on 32-bit WinXP - if (IntPtr.Size == 8) { - return Environment.GetFolderPath (Environment.SpecialFolder.ProgramFilesX86); - } else { - return Environment.GetFolderPath (Environment.SpecialFolder.ProgramFiles); - } - } - - internal static string GetXamarinAndroidCacheDir () - { - if (IsMac) { - var home = Environment.GetFolderPath (Environment.SpecialFolder.Personal); - return Path.Combine (home, "Library", "Caches", "Xamarin.Android"); - } else if (IsWindows) { - var localAppData = Environment.GetFolderPath (Environment.SpecialFolder.LocalApplicationData); - return Path.Combine (localAppData, "Xamarin.Android", "Cache"); - } else { - var home = Environment.GetFolderPath (Environment.SpecialFolder.Personal); - var xdgCacheHome = Environment.GetEnvironmentVariable ("XDG_CACHE_HOME"); - if (string.IsNullOrEmpty (xdgCacheHome)) { - xdgCacheHome = Path.Combine (home, ".cache"); - } - return Path.Combine (xdgCacheHome, "Xamarin.Android"); - } - } - } - - public static class KernelEx { - [DllImport ("kernel32.dll", CharSet = CharSet.Auto)] - static extern int GetLongPathName ( - [MarshalAs (UnmanagedType.LPTStr)] string path, - [MarshalAs (UnmanagedType.LPTStr)] StringBuilder longPath, - int longPathLength - ); - - public static string GetLongPathName (string path) - { - StringBuilder sb = new StringBuilder (255); - GetLongPathName (path, sb, sb.Capacity); - return sb.ToString (); - } - - [DllImport ("kernel32.dll", CharSet = CharSet.Auto)] - static extern int GetShortPathName ( - [MarshalAs (UnmanagedType.LPTStr)] string path, - [MarshalAs (UnmanagedType.LPTStr)] StringBuilder shortPath, - int shortPathLength - ); - - public static string GetShortPathName (string path) - { - StringBuilder sb = new StringBuilder (255); - GetShortPathName (path, sb, sb.Capacity); - return sb.ToString (); - } - } - - internal static class RegistryEx - { - const string ADVAPI = "advapi32.dll"; - - public static UIntPtr CurrentUser = (UIntPtr)0x80000001; - public static UIntPtr LocalMachine = (UIntPtr)0x80000002; - - [DllImport (ADVAPI, CharSet = CharSet.Unicode, SetLastError = true)] - static extern int RegOpenKeyEx (UIntPtr hKey, string subKey, uint reserved, uint sam, out UIntPtr phkResult); - - [DllImport (ADVAPI, CharSet = CharSet.Unicode, SetLastError = true)] - static extern int RegQueryValueExW (UIntPtr hKey, string lpValueName, int lpReserved, out uint lpType, - StringBuilder lpData, ref uint lpcbData); - - [DllImport (ADVAPI, CharSet = CharSet.Unicode, SetLastError = true)] - static extern int RegSetValueExW (UIntPtr hKey, string lpValueName, int lpReserved, - uint dwType, string data, uint cbData); - - [DllImport (ADVAPI, CharSet = CharSet.Unicode, SetLastError = true)] - static extern int RegSetValueExW (UIntPtr hKey, string lpValueName, int lpReserved, - uint dwType, IntPtr data, uint cbData); - - [DllImport (ADVAPI, CharSet = CharSet.Unicode, SetLastError = true)] - static extern int RegCreateKeyEx (UIntPtr hKey, string subKey, uint reserved, string @class, uint options, - uint samDesired, IntPtr lpSecurityAttributes, out UIntPtr phkResult, out Disposition lpdwDisposition); - - [DllImport ("advapi32.dll", SetLastError = true)] - static extern int RegCloseKey (UIntPtr hKey); - - public static string GetValueString (UIntPtr key, string subkey, string valueName, Wow64 wow64) - { - UIntPtr regKeyHandle; - uint sam = (uint)Rights.QueryValue + (uint)wow64; - if (RegOpenKeyEx (key, subkey, 0, sam, out regKeyHandle) != 0) - return null; - - try { - uint type; - var sb = new StringBuilder (2048); - uint cbData = (uint) sb.Capacity; - if (RegQueryValueExW (regKeyHandle, valueName, 0, out type, sb, ref cbData) == 0) { - return sb.ToString (); - } - return null; - } finally { - RegCloseKey (regKeyHandle); - } - } - - public static void SetValueString (UIntPtr key, string subkey, string valueName, string value, Wow64 wow64) - { - UIntPtr regKeyHandle; - uint sam = (uint)(Rights.CreateSubKey | Rights.SetValue) + (uint)wow64; - uint options = (uint) Options.NonVolatile; - Disposition disposition; - if (RegCreateKeyEx (key, subkey, 0, null, options, sam, IntPtr.Zero, out regKeyHandle, out disposition) != 0) { - throw new Exception ("Could not open or craete key"); - } - - try { - uint type = (uint)ValueType.String; - uint lenBytesPlusNull = ((uint)value.Length + 1) * 2; - var result = RegSetValueExW (regKeyHandle, valueName, 0, type, value, lenBytesPlusNull); - if (result != 0) - throw new Exception (string.Format ("Error {0} setting registry key '{1}{2}@{3}'='{4}'", - result, key, subkey, valueName, value)); - } finally { - RegCloseKey (regKeyHandle); - } - } - - [Flags] - enum Rights : uint - { - None = 0, - QueryValue = 0x0001, - SetValue = 0x0002, - CreateSubKey = 0x0004, - EnumerateSubKey = 0x0008, - } - - enum Options - { - BackupRestore = 0x00000004, - CreateLink = 0x00000002, - NonVolatile = 0x00000000, - Volatile = 0x00000001, - } - - public enum Wow64 : uint - { - Key64 = 0x0100, - Key32 = 0x0200, - } - - enum ValueType : uint - { - None = 0, //REG_NONE - String = 1, //REG_SZ - UnexpandedString = 2, //REG_EXPAND_SZ - Binary = 3, //REG_BINARY - DWord = 4, //REG_DWORD - DWordLittleEndian = 4, //REG_DWORD_LITTLE_ENDIAN - DWordBigEndian = 5, //REG_DWORD_BIG_ENDIAN - Link = 6, //REG_LINK - MultiString = 7, //REG_MULTI_SZ - ResourceList = 8, //REG_RESOURCE_LIST - FullResourceDescriptor = 9, //REG_FULL_RESOURCE_DESCRIPTOR - ResourceRequirementsList = 10, //REG_RESOURCE_REQUIREMENTS_LIST - QWord = 11, //REG_QWORD - QWordLittleEndian = 11, //REG_QWORD_LITTLE_ENDIAN - } - - enum Disposition : uint - { - CreatedNewKey = 0x00000001, - OpenedExistingKey = 0x00000002, - } - } -} - diff --git a/src/Xamarin.Android.Build.Utilities/ProcessUtils.cs b/src/Xamarin.Android.Build.Utilities/ProcessUtils.cs deleted file mode 100644 index cded992fb84..00000000000 --- a/src/Xamarin.Android.Build.Utilities/ProcessUtils.cs +++ /dev/null @@ -1,124 +0,0 @@ -using System; -using System.Diagnostics; -using System.Threading.Tasks; -using System.IO; -using System.Threading; - -namespace Xamarin.Android.Build.Utilities -{ - public static class ProcessUtils - { - public static async Task StartProcess (ProcessStartInfo psi, TextWriter stdout, TextWriter stderr, CancellationToken cancellationToken, Action onStarted = null) - { - cancellationToken.ThrowIfCancellationRequested (); - psi.UseShellExecute = false; - psi.RedirectStandardOutput |= stdout != null; - psi.RedirectStandardError |= stderr != null; - - var process = new Process { - StartInfo = psi, - EnableRaisingEvents = true, - }; - - Task output = Task.FromResult (true); - Task error = Task.FromResult (true); - Task exit = WaitForExitAsync (process); - using (process) { - process.Start (); - if (onStarted != null) - onStarted (process); - - // If the token is cancelled while we're running, kill the process. - // Otherwise once we finish the Task.WhenAll we can remove this registration - // as there is no longer any need to Kill the process. - // - // We wrap `stdout` and `stderr` in syncronized wrappers for safety in case they - // end up writing to the same buffer, or they are the same object. - using (cancellationToken.Register (() => KillProcess (process))) { - if (psi.RedirectStandardOutput) - output = ReadStreamAsync (process.StandardOutput, TextWriter.Synchronized (stdout)); - - if (psi.RedirectStandardError) - error = ReadStreamAsync (process.StandardError, TextWriter.Synchronized (stderr)); - - await Task.WhenAll (new [] { output, error, exit }).ConfigureAwait (false); - } - // If we invoke 'KillProcess' our output, error and exit tasks will all complete normally. - // To protected against passing the user incomplete data we have to call - // `cancellationToken.ThrowIfCancellationRequested ()` here. - cancellationToken.ThrowIfCancellationRequested (); - return process.ExitCode; - } - } - - static void KillProcess (Process p) - { - try { - p.Kill (); - } catch (InvalidOperationException) { - // If the process has already exited this could happen - } - } - - static Task WaitForExitAsync (Process process) - { - var exitDone = new TaskCompletionSource (); - process.Exited += (o, e) => exitDone.TrySetResult (true); - return exitDone.Task; - } - - static async Task ReadStreamAsync (StreamReader stream, TextWriter destination) - { - int read; - var buffer = new char [4096]; - while ((read = await stream.ReadAsync (buffer, 0, buffer.Length).ConfigureAwait (false)) > 0) - destination.Write (buffer, 0, read); - } - - /// - /// Executes an Android Sdk tool and returns a result. The result is based on a function of the command output. - /// - public static Task ExecuteToolAsync (string exe, Func result, CancellationToken token, Action onStarted = null) - { - var tcs = new TaskCompletionSource (); - - var log = new StringWriter (); - var error = new StringWriter (); - - var psi = new ProcessStartInfo (exe); - psi.CreateNoWindow = true; - psi.RedirectStandardInput = onStarted != null; - - var processTask = ProcessUtils.StartProcess (psi, log, error, token, onStarted); - var exeName = Path.GetFileName (exe); - - processTask.ContinueWith (t => { - var output = log.ToString (); - var errorOutput = error.ToString (); - log.Dispose (); - error.Dispose (); - - if (t.IsCanceled) { - tcs.TrySetCanceled (); - return; - } - - if (t.IsFaulted) { - tcs.TrySetException (t.Exception.Flatten ().InnerException); - return; - } - - if (t.Result == 0) { - tcs.TrySetResult (result != null ? result (output) : default (TResult)); - } else { - var errorMessage = !string.IsNullOrEmpty (errorOutput) ? errorOutput : output; - - tcs.TrySetException (new InvalidOperationException (string.IsNullOrEmpty (errorMessage) ? exeName + " returned non-zero exit code" : string.Format ("{0} : {1}", t.Result, errorMessage))); - } - }, TaskContinuationOptions.ExecuteSynchronously); - - return tcs.Task; - } - } -} - diff --git a/src/Xamarin.Android.Build.Utilities/Properties/AssemblyInfo.cs b/src/Xamarin.Android.Build.Utilities/Properties/AssemblyInfo.cs deleted file mode 100644 index 73f1e5319d2..00000000000 --- a/src/Xamarin.Android.Build.Utilities/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; - -[assembly: AssemblyTitle ("Xamarin.Android.Build.Utilities")] -[assembly: AssemblyDescription ("")] -[assembly: AssemblyConfiguration ("")] -[assembly: AssemblyCompany ("Xamarin")] -[assembly: AssemblyProduct ("Xamarin.Android.Build.Utilities")] -[assembly: AssemblyCopyright ("Copyright © Xamarin 2011-2016")] -[assembly: AssemblyTrademark ("")] -[assembly: AssemblyCulture ("")] - -[assembly: AssemblyVersion ("1.0.0.0")] -[assembly: AssemblyFileVersion ("1.0.0.0")] - diff --git a/src/Xamarin.Android.Build.Utilities/Sdks/AndroidSdkBase.cs b/src/Xamarin.Android.Build.Utilities/Sdks/AndroidSdkBase.cs deleted file mode 100644 index 60eb067eabe..00000000000 --- a/src/Xamarin.Android.Build.Utilities/Sdks/AndroidSdkBase.cs +++ /dev/null @@ -1,183 +0,0 @@ -using System; -using System.Linq; -using System.IO; -using System.Collections.Generic; - -namespace Xamarin.Android.Build.Utilities -{ - abstract class AndroidSdkBase - { - string[] allAndroidSdks = null; - string[] allAndroidNdks = null; - - public string[] AllAndroidSdks { - get { - if (allAndroidSdks == null) - allAndroidSdks = GetAllAvailableAndroidSdks ().Distinct ().ToArray (); - return allAndroidSdks; - } - } - public string[] AllAndroidNdks { - get { - if (allAndroidNdks == null) - allAndroidNdks = GetAllAvailableAndroidNdks ().Distinct ().ToArray (); - return allAndroidNdks; - } - } - - public string AndroidSdkPath { get; private set; } - public string AndroidNdkPath { get; private set; } - public string JavaSdkPath { get; private set; } - public string JavaBinPath { get; private set; } - public string AndroidToolsPath { get; private set; } - public string AndroidPlatformToolsPath { get; private set; } - public string AndroidToolsPathShort { get; private set; } - public string AndroidPlatformToolsPathShort { get; private set; } - - public virtual string Adb { get; protected set; } = "adb"; - public virtual string Android { get; protected set; } = "android"; - public virtual string Emulator { get; protected set; } = "emulator"; - public virtual string Monitor { get; protected set; } = "monitor"; - public virtual string ZipAlign { get; protected set; } = "zipalign"; - public virtual string JarSigner { get; protected set; } = "jarsigner"; - public virtual string KeyTool { get; protected set; } = "keytool"; - - public virtual string NdkStack { get; protected set; } = "ndk-stack"; - public abstract string NdkHostPlatform32Bit { get; } - public abstract string NdkHostPlatform64Bit { get; } - public virtual string Javac { get; protected set; } = "javac"; - - public abstract string PreferedAndroidSdkPath { get; } - public abstract string PreferedAndroidNdkPath { get; } - public abstract string PreferedJavaSdkPath { get; } - - public virtual void Initialize (string androidSdkPath = null, string androidNdkPath = null, string javaSdkPath = null) - { - AndroidSdkPath = ValidateAndroidSdkLocation (androidSdkPath) ? androidSdkPath : AllAndroidSdks.FirstOrDefault (); - AndroidNdkPath = ValidateAndroidNdkLocation (androidNdkPath) ? androidNdkPath : AllAndroidNdks.FirstOrDefault (); - JavaSdkPath = ValidateJavaSdkLocation (javaSdkPath) ? javaSdkPath : GetJavaSdkPath (); - - if (!string.IsNullOrEmpty (JavaSdkPath)) { - JavaBinPath = Path.Combine (JavaSdkPath, "bin"); - } else { - JavaBinPath = null; - } - - if (!string.IsNullOrEmpty (AndroidSdkPath)) { - AndroidToolsPath = Path.Combine (AndroidSdkPath, "tools"); - AndroidToolsPathShort = GetShortFormPath (AndroidToolsPath); - AndroidPlatformToolsPath = Path.Combine (AndroidSdkPath, "platform-tools"); - AndroidPlatformToolsPathShort = GetShortFormPath (AndroidPlatformToolsPath); - } else { - AndroidToolsPath = null; - AndroidToolsPathShort = null; - AndroidPlatformToolsPath = null; - AndroidPlatformToolsPathShort = null; - } - - if (!string.IsNullOrEmpty (AndroidNdkPath)) { - // It would be nice if .NET had real globbing support in System.IO... - string toolchainsDir = Path.Combine (AndroidNdkPath, "toolchains"); - IsNdk64Bit = Directory.EnumerateDirectories (toolchainsDir, "arm-linux-androideabi-*") - .Any (dir => Directory.Exists (Path.Combine (dir, "prebuilt", NdkHostPlatform64Bit))); - } - // we need to look for extensions other than the default .exe|.bat - // google have a habbit of changing them. - Adb = GetExecutablePath (AndroidPlatformToolsPath, Adb); - Android = GetExecutablePath (AndroidToolsPath, Android); - Emulator = GetExecutablePath (AndroidToolsPath, Emulator); - Monitor = GetExecutablePath (AndroidToolsPath, Monitor); - NdkStack = GetExecutablePath (AndroidNdkPath, NdkStack); - } - - protected abstract IEnumerable GetAllAvailableAndroidSdks (); - protected abstract IEnumerable GetAllAvailableAndroidNdks (); - protected abstract string GetJavaSdkPath (); - protected abstract string GetShortFormPath (string path); - - public abstract void SetPreferredAndroidSdkPath (string path); - public abstract void SetPreferredJavaSdkPath (string path); - public abstract void SetPreferredAndroidNdkPath (string path); - - public bool IsNdk64Bit { get; private set; } - - public string NdkHostPlatform { - get { return IsNdk64Bit ? NdkHostPlatform64Bit : NdkHostPlatform32Bit; } - } - - /// - /// Checks that a value is the location of an Android SDK. - /// - public bool ValidateAndroidSdkLocation (string loc) - { - return !string.IsNullOrEmpty (loc) && FindExecutableInDirectory (Adb, Path.Combine (loc, "platform-tools")).Any (); - } - - /// - /// Checks that a value is the location of a Java SDK. - /// - public virtual bool ValidateJavaSdkLocation (string loc) - { - return !string.IsNullOrEmpty (loc) && FindExecutableInDirectory (JarSigner, Path.Combine (loc, "bin")).Any (); - } - - /// - /// Checks that a value is the location of an Android SDK. - /// - public bool ValidateAndroidNdkLocation (string loc) - { - return !string.IsNullOrEmpty (loc) && FindExecutableInDirectory(NdkStack, loc).Any(); - } - - protected IEnumerable FindExecutableInPath (string executable) - { - var path = Environment.GetEnvironmentVariable ("PATH"); - var pathDirs = path.Split (new char[] { Path.PathSeparator }, StringSplitOptions.RemoveEmptyEntries); - - foreach (var dir in pathDirs) { - foreach (var directory in FindExecutableInDirectory(executable, dir)) { - yield return directory; - } - } - } - - protected IEnumerable FindExecutableInDirectory(string executable, string dir) - { - foreach (var exe in Executables (executable)) - if (File.Exists (Path.Combine (dir, exe))) - yield return dir; - } - - IEnumerable Executables (string executable) - { - yield return executable; - var pathExt = Environment.GetEnvironmentVariable ("PATHEXT"); - var pathExts = pathExt?.Split (new char [] { Path.PathSeparator }, StringSplitOptions.RemoveEmptyEntries); - - if (pathExts == null) - yield break; - - foreach (var ext in pathExts) - yield return Path.ChangeExtension (executable, ext); - } - - protected string NullIfEmpty (string s) - { - if (s == null || s.Length != 0) - return s; - - return null; - } - - string GetExecutablePath (string dir, string exe) - { - if (string.IsNullOrEmpty (dir)) - return exe; - foreach (var e in Executables (exe)) - if (File.Exists (Path.Combine (dir, e))) - return e; - return exe; - } - } -} - diff --git a/src/Xamarin.Android.Build.Utilities/Sdks/AndroidSdkUnix.cs b/src/Xamarin.Android.Build.Utilities/Sdks/AndroidSdkUnix.cs deleted file mode 100644 index 0545c90cdc0..00000000000 --- a/src/Xamarin.Android.Build.Utilities/Sdks/AndroidSdkUnix.cs +++ /dev/null @@ -1,233 +0,0 @@ -using System; -using System.Xml; -using System.Xml.Linq; -using System.Collections.Generic; -using System.IO; - -namespace Xamarin.Android.Build.Utilities -{ - class AndroidSdkUnix : AndroidSdkBase - { - public override string NdkHostPlatform32Bit { - get { return OS.IsMac ? "darwin-x86" : "linux-x86"; } - } - public override string NdkHostPlatform64Bit { - get { return OS.IsMac ? "darwin-x86_64" : "linux-x86_64"; } - } - - public override string PreferedAndroidSdkPath { - get { - var config_file = GetUnixConfigFile (); - var androidEl = config_file.Root.Element ("android-sdk"); - - if (androidEl != null) { - var path = (string)androidEl.Attribute ("path"); - - if (ValidateAndroidSdkLocation (path)) - return path; - } - return null; - } - } - - public override string PreferedAndroidNdkPath { - get { - var config_file = GetUnixConfigFile (); - var androidEl = config_file.Root.Element ("android-ndk"); - - if (androidEl != null) { - var path = (string)androidEl.Attribute ("path"); - - if (ValidateAndroidNdkLocation (path)) - return path; - } - return null; - } - } - - public override string PreferedJavaSdkPath { - get { - var config_file = GetUnixConfigFile (); - var javaEl = config_file.Root.Element ("java-sdk"); - - if (javaEl != null) { - var path = (string)javaEl.Attribute ("path"); - - if (ValidateJavaSdkLocation (path)) - return path; - } - return null; - } - } - - protected override IEnumerable GetAllAvailableAndroidSdks () - { - var preferedSdkPath = PreferedAndroidSdkPath; - if (!string.IsNullOrEmpty (preferedSdkPath)) - yield return preferedSdkPath; - - // Look in PATH - foreach (var path in FindExecutableInPath (Adb)) { - // Strip off "platform-tools" - var dir = Path.GetDirectoryName (path); - - if (ValidateAndroidSdkLocation (dir)) - yield return dir; - } - } - - protected override string GetJavaSdkPath () - { - var preferedJavaSdkPath = PreferedJavaSdkPath; - if (!string.IsNullOrEmpty (preferedJavaSdkPath)) - return preferedJavaSdkPath; - - // Look in PATH - foreach (var path in FindExecutableInPath (JarSigner)) { - // Strip off "bin" - var dir = Path.GetDirectoryName (path); - - if (ValidateJavaSdkLocation (dir)) - return dir; - } - - return null; - } - - public override bool ValidateJavaSdkLocation (string loc) - { - var result = base.ValidateJavaSdkLocation (loc); - - if (result) { - // handle apple's java stub - const string javaHomeExe = "/usr/libexec/java_home"; - - if (File.Exists (javaHomeExe)) { - // returns true if there is a java installed - var javaHomeTask = ProcessUtils.ExecuteToolAsync (javaHomeExe, - (output) => { - if (output.Contains ("(null)")) { - return false; - } - - return true; - }, System.Threading.CancellationToken.None - ); - - if (!javaHomeTask.Result) { - return false; - } - } - } - - return result; - } - - protected override IEnumerable GetAllAvailableAndroidNdks () - { - var preferedNdkPath = PreferedAndroidNdkPath; - if (!string.IsNullOrEmpty (preferedNdkPath)) - yield return preferedNdkPath; - - // Look in PATH - foreach (var path in FindExecutableInPath (NdkStack)) { - if (ValidateAndroidNdkLocation (path)) - yield return path; - } - } - - protected override string GetShortFormPath (string path) - { - // This is a Windows-ism, don't do anything for Unix - return path; - } - - public override void SetPreferredAndroidSdkPath (string path) - { - path = NullIfEmpty (path); - - var doc = GetUnixConfigFile (); - var androidEl = doc.Root.Element ("android-sdk"); - - if (androidEl == null) { - androidEl = new XElement ("android-sdk"); - doc.Root.Add (androidEl); - } - - androidEl.SetAttributeValue ("path", path); - doc.Save (UnixConfigPath); - } - - public override void SetPreferredJavaSdkPath (string path) - { - path = NullIfEmpty (path); - - var doc = GetUnixConfigFile (); - var javaEl = doc.Root.Element ("java-sdk"); - - if (javaEl == null) { - javaEl = new XElement ("java-sdk"); - doc.Root.Add (javaEl); - } - - javaEl.SetAttributeValue ("path", path); - doc.Save (UnixConfigPath); - } - - public override void SetPreferredAndroidNdkPath (string path) - { - path = NullIfEmpty (path); - - var doc = GetUnixConfigFile (); - var androidEl = doc.Root.Element ("android-ndk"); - - if (androidEl == null) { - androidEl = new XElement ("android-ndk"); - doc.Root.Add (androidEl); - } - - androidEl.SetAttributeValue ("path", path); - doc.Save (UnixConfigPath); - } - - private static string UnixConfigPath { - get { - var p = Environment.GetFolderPath (Environment.SpecialFolder.ApplicationData); - return Path.Combine (Path.Combine (p, "xbuild"), "monodroid-config.xml"); - } - } - - private static XDocument GetUnixConfigFile () - { - var file = UnixConfigPath; - XDocument doc = null; - if (!File.Exists (file)) { - string dir = Path.GetDirectoryName (file); - if (!Directory.Exists (dir)) - Directory.CreateDirectory (dir); - } else { - try { - doc = XDocument.Load (file); - } catch (Exception ex) { - AndroidLogger.LogError ("Could not load monodroid configuration file", ex); - - // move out of the way and create a new one - doc = new XDocument (new XElement ("monodroid")); - var newFileName = file + ".old"; - if (File.Exists (newFileName)) { - File.Delete (newFileName); - } - - File.Move (file, newFileName); - } - } - - if (doc == null || doc.Root == null) { - doc = new XDocument (new XElement ("monodroid")); - } - return doc; - } - - } -} - diff --git a/src/Xamarin.Android.Build.Utilities/Sdks/AndroidSdkWindows.cs b/src/Xamarin.Android.Build.Utilities/Sdks/AndroidSdkWindows.cs deleted file mode 100644 index 84a5e1dd376..00000000000 --- a/src/Xamarin.Android.Build.Utilities/Sdks/AndroidSdkWindows.cs +++ /dev/null @@ -1,217 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; - -namespace Xamarin.Android.Build.Utilities -{ - class AndroidSdkWindows : AndroidSdkBase - { - const string MDREG_KEY = @"SOFTWARE\Novell\Mono for Android"; - const string MDREG_ANDROID_SDK = "AndroidSdkDirectory"; - const string MDREG_ANDROID_NDK = "AndroidNdkDirectory"; - const string MDREG_JAVA_SDK = "JavaSdkDirectory"; - const string ANDROID_INSTALLER_PATH = @"SOFTWARE\Android SDK Tools"; - const string ANDROID_INSTALLER_KEY = "Path"; - const string XAMARIN_ANDROID_INSTALLER_PATH = @"SOFTWARE\Xamarin\MonoAndroid"; - const string XAMARIN_ANDROID_INSTALLER_KEY = "PrivateAndroidSdkPath"; - - public override string ZipAlign { get; protected set; } = "zipalign.exe"; - public override string JarSigner { get; protected set; } = "jarsigner.exe"; - public override string KeyTool { get; protected set; } = "keytool.exe"; - - public override string NdkHostPlatform32Bit { get { return "windows"; } } - public override string NdkHostPlatform64Bit { get { return "windows-x86_64"; } } - public override string Javac { get; protected set; } = "javac.exe"; - - string GetMDRegistryKey () - { - var regKey = Environment.GetEnvironmentVariable ("XAMARIN_ANDROID_REGKEY"); - return string.IsNullOrWhiteSpace (regKey) ? MDREG_KEY : regKey; - } - - public override string PreferedAndroidSdkPath { - get { - var wow = RegistryEx.Wow64.Key32; - var regKey = GetMDRegistryKey (); - if (CheckRegistryKeyForExecutable (RegistryEx.CurrentUser, regKey, MDREG_ANDROID_SDK, wow, "platform-tools", Adb)) - return RegistryEx.GetValueString (RegistryEx.CurrentUser, regKey, MDREG_ANDROID_SDK, wow); - return null; - } - } - public override string PreferedAndroidNdkPath { - get { - var wow = RegistryEx.Wow64.Key32; - var regKey = GetMDRegistryKey (); - if (CheckRegistryKeyForExecutable (RegistryEx.CurrentUser, regKey, MDREG_ANDROID_NDK, wow, ".", NdkStack)) - return RegistryEx.GetValueString (RegistryEx.CurrentUser, regKey, MDREG_ANDROID_NDK, wow); - return null; - } - } - public override string PreferedJavaSdkPath { - get { - var wow = RegistryEx.Wow64.Key32; - var regKey = GetMDRegistryKey (); - if (CheckRegistryKeyForExecutable (RegistryEx.CurrentUser, regKey, MDREG_JAVA_SDK, wow, "bin", JarSigner)) - return RegistryEx.GetValueString (RegistryEx.CurrentUser, regKey, MDREG_JAVA_SDK, wow); - return null; - } - } - - protected override IEnumerable GetAllAvailableAndroidSdks () - { - var roots = new[] { RegistryEx.CurrentUser, RegistryEx.LocalMachine }; - var wow = RegistryEx.Wow64.Key32; - var regKey = GetMDRegistryKey (); - - AndroidLogger.LogInfo ("sdk", "Looking for Android SDK.."); - - // Check for the key the user gave us in the VS/addin options - foreach (var root in roots) - if (CheckRegistryKeyForExecutable (root, regKey, MDREG_ANDROID_SDK, wow, "platform-tools", Adb)) - yield return RegistryEx.GetValueString (root, regKey, MDREG_ANDROID_SDK, wow); - - // Check for the key written by the Xamarin installer - if (CheckRegistryKeyForExecutable (RegistryEx.CurrentUser, XAMARIN_ANDROID_INSTALLER_PATH, XAMARIN_ANDROID_INSTALLER_KEY, wow, "platform-tools", Adb)) - yield return RegistryEx.GetValueString (RegistryEx.CurrentUser, XAMARIN_ANDROID_INSTALLER_PATH, XAMARIN_ANDROID_INSTALLER_KEY, wow); - - // Check for the key written by the Android SDK installer - foreach (var root in roots) - if (CheckRegistryKeyForExecutable (root, ANDROID_INSTALLER_PATH, ANDROID_INSTALLER_KEY, wow, "platform-tools", Adb)) - yield return RegistryEx.GetValueString (root, ANDROID_INSTALLER_PATH, ANDROID_INSTALLER_KEY, wow); - - // Check some hardcoded paths for good measure - var xamarin_private = Path.Combine (Environment.GetFolderPath (Environment.SpecialFolder.LocalApplicationData), "Xamarin", "MonoAndroid", "android-sdk-windows"); - var android_default = Path.Combine (OS.ProgramFilesX86, "Android", "android-sdk-windows"); - var cdrive_default = @"C:\android-sdk-windows"; - - if (ValidateAndroidSdkLocation (xamarin_private)) - yield return xamarin_private; - - if (ValidateAndroidSdkLocation (android_default)) - yield return android_default; - - if (ValidateAndroidSdkLocation (cdrive_default)) - yield return cdrive_default; - } - - protected override string GetJavaSdkPath () - { - // check the user specified path - var roots = new[] { RegistryEx.CurrentUser, RegistryEx.LocalMachine }; - const RegistryEx.Wow64 wow = RegistryEx.Wow64.Key32; - var regKey = GetMDRegistryKey (); - - foreach (var root in roots) { - if (CheckRegistryKeyForExecutable (root, regKey, MDREG_JAVA_SDK, wow, "bin", JarSigner)) - return RegistryEx.GetValueString (root, regKey, MDREG_JAVA_SDK, wow); - } - - string subkey = @"SOFTWARE\JavaSoft\Java Development Kit"; - - AndroidLogger.LogInfo ("sdk", "Looking for Java 6 SDK.."); - - foreach (var wow64 in new[] { RegistryEx.Wow64.Key32, RegistryEx.Wow64.Key64 }) { - string key_name = string.Format (@"{0}\{1}\{2}", "HKLM", subkey, "CurrentVersion"); - var currentVersion = RegistryEx.GetValueString (RegistryEx.LocalMachine, subkey, "CurrentVersion", wow64); - - if (!string.IsNullOrEmpty (currentVersion)) { - AndroidLogger.LogInfo ("sdk", " Key {0} found.", key_name); - - // No matter what the CurrentVersion is, look for 1.6 or 1.7 or 1.8 - if (CheckRegistryKeyForExecutable (RegistryEx.LocalMachine, subkey + "\\" + "1.8", "JavaHome", wow64, "bin", JarSigner)) - return RegistryEx.GetValueString (RegistryEx.LocalMachine, subkey + "\\" + "1.8", "JavaHome", wow64); - - if (CheckRegistryKeyForExecutable (RegistryEx.LocalMachine, subkey + "\\" + "1.7", "JavaHome", wow64, "bin", JarSigner)) - return RegistryEx.GetValueString (RegistryEx.LocalMachine, subkey + "\\" + "1.7", "JavaHome", wow64); - - if (CheckRegistryKeyForExecutable (RegistryEx.LocalMachine, subkey + "\\" + "1.6", "JavaHome", wow64, "bin", JarSigner)) - return RegistryEx.GetValueString (RegistryEx.LocalMachine, subkey + "\\" + "1.6", "JavaHome", wow64); - } - - AndroidLogger.LogInfo ("sdk", " Key {0} not found.", key_name); - } - - // We ran out of things to check.. - return null; - } - - protected override IEnumerable GetAllAvailableAndroidNdks () - { - var roots = new[] { RegistryEx.CurrentUser, RegistryEx.LocalMachine }; - var wow = RegistryEx.Wow64.Key32; - var regKey = GetMDRegistryKey (); - - AndroidLogger.LogInfo ("sdk", "Looking for Android NDK.."); - - // Check for the key the user gave us in the VS/addin options - foreach (var root in roots) - if (CheckRegistryKeyForExecutable (root, regKey, MDREG_ANDROID_NDK, wow, ".", NdkStack)) - yield return RegistryEx.GetValueString (root, regKey, MDREG_ANDROID_NDK, wow); - - /* - // Check for the key written by the Xamarin installer - if (CheckRegistryKeyForExecutable (RegistryEx.CurrentUser, XAMARIN_ANDROID_INSTALLER_PATH, XAMARIN_ANDROID_INSTALLER_KEY, wow, "platform-tools", Adb)) - yield return RegistryEx.GetValueString (RegistryEx.CurrentUser, XAMARIN_ANDROID_INSTALLER_PATH, XAMARIN_ANDROID_INSTALLER_KEY, wow); - */ - - // Check some hardcoded paths for good measure - var xamarin_private = Path.Combine (Environment.GetFolderPath (Environment.SpecialFolder.LocalApplicationData), "Xamarin", "MonoAndroid"); - var android_default = Path.Combine (OS.ProgramFilesX86, "Android"); - var cdrive_default = @"C:\"; - - foreach (var basePath in new string [] {xamarin_private, android_default, cdrive_default}) - if (Directory.Exists (basePath)) - foreach (var dir in Directory.GetDirectories (basePath, "android-ndk-r*")) - if (ValidateAndroidNdkLocation (dir)) - yield return dir; - } - - protected override string GetShortFormPath (string path) - { - return KernelEx.GetShortPathName (path); - } - - public override void SetPreferredAndroidSdkPath (string path) - { - var regKey = GetMDRegistryKey (); - RegistryEx.SetValueString (RegistryEx.CurrentUser, regKey, MDREG_ANDROID_SDK, path ?? "", RegistryEx.Wow64.Key32); - } - - public override void SetPreferredJavaSdkPath (string path) - { - var regKey = GetMDRegistryKey (); - RegistryEx.SetValueString (RegistryEx.CurrentUser, regKey, MDREG_JAVA_SDK, path ?? "", RegistryEx.Wow64.Key32); - } - - public override void SetPreferredAndroidNdkPath (string path) - { - var regKey = GetMDRegistryKey (); - RegistryEx.SetValueString (RegistryEx.CurrentUser, regKey, MDREG_ANDROID_NDK, path ?? "", RegistryEx.Wow64.Key32); - } - - #region Helper Methods - private bool CheckRegistryKeyForExecutable (UIntPtr key, string subkey, string valueName, RegistryEx.Wow64 wow64, string subdir, string exe) - { - string key_name = string.Format (@"{0}\{1}\{2}", key == RegistryEx.CurrentUser ? "HKCU" : "HKLM", subkey, valueName); - - var path = NullIfEmpty (RegistryEx.GetValueString (key, subkey, valueName, wow64)); - - if (path == null) { - AndroidLogger.LogInfo ("sdk", " Key {0} not found.", key_name); - return false; - } - - if (!FindExecutableInDirectory (exe, Path.Combine (path, subdir)).Any ()) { - AndroidLogger.LogInfo ("sdk", " Key {0} found:\n Path does not contain {1} in \\{2} ({3}).", key_name, exe, subdir, path); - return false; - } - - AndroidLogger.LogInfo ("sdk", " Key {0} found:\n Path contains {1} in \\{2} ({3}).", key_name, exe, subdir, path); - - return true; - } - #endregion - } -} - diff --git a/src/Xamarin.Android.Build.Utilities/Xamarin.Android.Build.Utilities.csproj b/src/Xamarin.Android.Build.Utilities/Xamarin.Android.Build.Utilities.csproj deleted file mode 100644 index 795e72732f7..00000000000 --- a/src/Xamarin.Android.Build.Utilities/Xamarin.Android.Build.Utilities.csproj +++ /dev/null @@ -1,57 +0,0 @@ - - - - Debug - AnyCPU - {91713046-C358-4647-B162-ED4E1442F3D8} - Library - Xamarin.Android.Build.Utilities - Xamarin.Android.Build.Utilities - v4.5 - - - - true - full - false - $(XAInstallPrefix)xbuild\Xamarin\Android\ - DEBUG; - prompt - 4 - false - - - full - true - $(XAInstallPrefix)xbuild\Xamarin\Android\ - prompt - 4 - false - - - - - - - - - - - - - - - - - - - - - - - - - - - -