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 - - - - - - - - - - - - - - - - - - - - - - - - - - - -