From 2c6f5cd16fb5087731107c1defa13ebb56cf63df Mon Sep 17 00:00:00 2001 From: Dean Ellis Date: Fri, 6 Dec 2019 16:11:30 +0000 Subject: [PATCH] [Xamarin.Android.Build.Tasks] Use Google Manifest Merger. (#3918) Use the Google Manifest Merger tooling to merge library `AndroidManifest.xml` files into the App's `AndroidManifest.xml`. This should allow developers to override and remove some unwanted permissions which are currently automatically imported from some of the support libraries. Documentation on how to use the new manifest merger tooling is at: https://developer.android.com/studio/build/manifest-merge Because of the limitations in Command line argument lengths under Windows we have to build our own entry point for the manifest merger tool. Our entry point takes a single "response" file as an input, with each argument needs to be on a separate line for example: --main AndroidManifest.xml --libs obj\Debug\lp\0\ji\AndroidManifest.xml:obj\Debug\lp\2\ji\AndroidManifest.xml --out android\AndroidManifest.xml We have to put each argument on its own line because of the way the built in Manifest Merger Argument parser works. --- Configuration.props | 1 + Xamarin.Android.sln | 7 ++ .../installers/create-installers.targets | 1 + .../Android/Xamarin.Android.Designer.targets | 10 +- .../Tasks/GenerateJavaStubs.cs | 3 +- .../Tasks/ManifestMerger.cs | 103 ++++++++++++++++++ .../BindingBuildTest.cs | 6 + .../Xamarin.Android.Build.Tests/BuildTest.cs | 17 ++- .../ManifestTest.cs | 6 +- .../Resources/Base/AndroidManifest.xml | 13 ++- .../Utilities/ManifestDocument.cs | 35 +----- .../Xamarin.Android.Analysis.targets | 2 +- .../Xamarin.Android.Build.Tasks.csproj | 6 + .../Xamarin.Android.Common.targets | 84 +++++++++----- src/manifestmerger/build.gradle | 36 ++++++ src/manifestmerger/manifestmerger.csproj | 14 +++ src/manifestmerger/manifestmerger.targets | 45 ++++++++ src/manifestmerger/settings.gradle | 1 + .../src/com/xamarin/manifestmerger/Main.java | 38 +++++++ .../MSBuildDeviceIntegration.csv | 2 +- 20 files changed, 350 insertions(+), 80 deletions(-) create mode 100644 src/Xamarin.Android.Build.Tasks/Tasks/ManifestMerger.cs create mode 100644 src/manifestmerger/build.gradle create mode 100644 src/manifestmerger/manifestmerger.csproj create mode 100644 src/manifestmerger/manifestmerger.targets create mode 100644 src/manifestmerger/settings.gradle create mode 100644 src/manifestmerger/src/com/xamarin/manifestmerger/Main.java diff --git a/Configuration.props b/Configuration.props index 5759bf23013..7eaf8110cb1 100644 --- a/Configuration.props +++ b/Configuration.props @@ -103,6 +103,7 @@ 29.0.1 False 0.10.2 + 26.5.0 $([System.IO.Path]::PathSeparator) <_TestsAotName Condition=" '$(AotAssemblies)' == 'true' ">-Aot <_TestsProfiledAotName Condition=" '$(AndroidEnableProfiledAot)' == 'true' ">-Profiled diff --git a/Xamarin.Android.sln b/Xamarin.Android.sln index 2a668a686ad..445a9aea412 100644 --- a/Xamarin.Android.sln +++ b/Xamarin.Android.sln @@ -101,6 +101,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Xamarin.Android.Tools.Andro EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "r8", "src\r8\r8.csproj", "{1BAFA0CC-0377-46CE-AB7B-7BB2E7B62F63}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "manifestmerger", "src\manifestmerger\manifestmerger.csproj", "{AF8AC493-40AC-4195-82F6-B08EE4B4E49E}" +EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "aapt2", "src\aapt2\aapt2.csproj", "{0C31DE30-F9DF-4312-BFFE-DCAD558CCF08}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "bundletool", "src\bundletool\bundletool.csproj", "{A0AEF446-3368-4591-9DE6-BC3B2B33337D}" @@ -310,6 +312,10 @@ Global {1BAFA0CC-0377-46CE-AB7B-7BB2E7B62F63}.Debug|AnyCPU.Build.0 = Debug|Any CPU {1BAFA0CC-0377-46CE-AB7B-7BB2E7B62F63}.Release|AnyCPU.ActiveCfg = Release|Any CPU {1BAFA0CC-0377-46CE-AB7B-7BB2E7B62F63}.Release|AnyCPU.Build.0 = Release|Any CPU + {AF8AC493-40AC-4195-82F6-B08EE4B4E49E}.Debug|AnyCPU.ActiveCfg = Debug|Any CPU + {AF8AC493-40AC-4195-82F6-B08EE4B4E49E}.Debug|AnyCPU.Build.0 = Debug|Any CPU + {AF8AC493-40AC-4195-82F6-B08EE4B4E49E}.Release|AnyCPU.ActiveCfg = Release|Any CPU + {AF8AC493-40AC-4195-82F6-B08EE4B4E49E}.Release|AnyCPU.Build.0 = Release|Any CPU {0C31DE30-F9DF-4312-BFFE-DCAD558CCF08}.Debug|AnyCPU.ActiveCfg = Debug|Any CPU {0C31DE30-F9DF-4312-BFFE-DCAD558CCF08}.Debug|AnyCPU.Build.0 = Debug|Any CPU {0C31DE30-F9DF-4312-BFFE-DCAD558CCF08}.Release|AnyCPU.ActiveCfg = Release|Any CPU @@ -411,6 +417,7 @@ Global {E34BCFA0-CAA4-412C-AA1C-75DB8D67D157} = {04E3E11E-B47D-4599-8AFC-50515A95E715} {1E5501E8-49C1-4659-838D-CC9720C5208F} = {CAB438D8-B0F5-4AF0-BEBD-9E2ADBD7B483} {1BAFA0CC-0377-46CE-AB7B-7BB2E7B62F63} = {04E3E11E-B47D-4599-8AFC-50515A95E715} + {AF8AC493-40AC-4195-82F6-B08EE4B4E49E} = {04E3E11E-B47D-4599-8AFC-50515A95E715} {0C31DE30-F9DF-4312-BFFE-DCAD558CCF08} = {04E3E11E-B47D-4599-8AFC-50515A95E715} {A0AEF446-3368-4591-9DE6-BC3B2B33337D} = {04E3E11E-B47D-4599-8AFC-50515A95E715} {D93CAC27-3893-42A3-99F1-2BCA72E186F4} = {E351F97D-EA4F-4E7F-AAA0-8EBB1F2A4A62} diff --git a/build-tools/installers/create-installers.targets b/build-tools/installers/create-installers.targets index 97b09b87f24..9cdfc0c9ae6 100644 --- a/build-tools/installers/create-installers.targets +++ b/build-tools/installers/create-installers.targets @@ -186,6 +186,7 @@ <_MSBuildFiles Include="$(MSBuildSrcDir)\java_runtime_fastdev.jar" /> <_MSBuildFiles Include="$(MSBuildSrcDir)\java_runtime.dex" /> <_MSBuildFiles Include="$(MSBuildSrcDir)\java_runtime_fastdev.dex" /> + <_MSBuildFiles Include="$(MSBuildSrcDir)\manifestmerger.jar" /> <_MSBuildFiles Include="$(MSBuildSrcDir)\SgmlReaderDll.dll" /> <_MSBuildFiles Include="$(MSBuildSrcDir)\Xamarin.Android.Aapt.targets" /> <_MSBuildFiles Include="$(MSBuildSrcDir)\Xamarin.Android.Aapt2.targets" /> diff --git a/src/Xamarin.Android.Build.Tasks/MSBuild/Xamarin/Android/Xamarin.Android.Designer.targets b/src/Xamarin.Android.Build.Tasks/MSBuild/Xamarin/Android/Xamarin.Android.Designer.targets index ea3f5a01aa9..794a4a975d0 100644 --- a/src/Xamarin.Android.Build.Tasks/MSBuild/Xamarin/Android/Xamarin.Android.Designer.targets +++ b/src/Xamarin.Android.Build.Tasks/MSBuild/Xamarin/Android/Xamarin.Android.Designer.targets @@ -70,7 +70,6 @@ Copyright (C) 2016 Xamarin. All rights reserved. ResolvedAssemblies="@(_ResolvedAssemblies)" ResolvedUserAssemblies="@(_ResolvedUserMonoAndroidAssembliesForDesigner)" ManifestTemplate="$(_AndroidManifestAbs)" - MergedManifestDocuments="@(ExtractedManifestDocuments)" Debug="$(AndroidIncludeDebugSymbols)" NeedsInternet="$(AndroidNeedsInternetPermission)" AndroidSdkPlatform="$(_AndroidApiLevel)" @@ -87,6 +86,15 @@ Copyright (C) 2016 Xamarin. All rights reserved. AcwMapFile="$(_AcwMapFile)" SupportedAbis="$(_BuildTargetAbis)"> + "AMM"; + + public override string DefaultErrorCode => $"{TaskPrefix}0000"; + + [Required] + public string ManifestMergerJarPath { get; set; } + + [Required] + public string AndroidManifest { get; set; } + + [Required] + public string OutputManifestFile { get; set; } + + public string [] LibraryManifestFiles { get; set; } + + public string [] ManifestPlaceholders { get; set; } + + string tempFile; + string responseFile; + + public override bool Execute () + { + tempFile = OutputManifestFile + ".tmp"; + responseFile = Path.Combine (Path.GetDirectoryName (OutputManifestFile), "manifestmerger.rsp"); + try { + bool result = base.Execute (); + if (!result) + return result; + var m = new ManifestDocument (tempFile, Log); + using (var ms = new MemoryStream ()) { + m.Save (ms); + MonoAndroidHelper.CopyIfStreamChanged (ms, OutputManifestFile); + return result; + } + } finally { + if (File.Exists (tempFile)) + File.Delete (tempFile); + if (File.Exists (responseFile)) + File.Delete (responseFile); + } + } + + protected override string GenerateCommandLineCommands () + { + string cmd = GetCommandLineBuilder ().ToString (); + Log.LogDebugMessage (cmd); + return cmd; + } + + protected virtual CommandLineBuilder GetCommandLineBuilder () + { + var cmd = new CommandLineBuilder (); + + if (!string.IsNullOrEmpty (JavaOptions)) { + cmd.AppendSwitch (JavaOptions); + } + cmd.AppendSwitchIfNotNull ("-Xmx", JavaMaximumHeapSize); + cmd.AppendSwitchIfNotNull ("-cp ", $"{ManifestMergerJarPath}"); + cmd.AppendSwitch ("com.xamarin.manifestmerger.Main"); + StringBuilder sb = new StringBuilder (); + sb.AppendLine ("--main"); + sb.AppendLine (AndroidManifest); + if (LibraryManifestFiles != null) { + sb.AppendLine ("--libs"); + sb.AppendLine ($"{string.Join ($"{Path.PathSeparator}", LibraryManifestFiles)}"); + } + if (ManifestPlaceholders != null) { + foreach (var entry in ManifestPlaceholders.Select (e => e.Split (new char [] { '=' }, 2, StringSplitOptions.None))) { + if (entry.Length == 2) { + sb.AppendLine ("--placeholder"); + sb.AppendLine ($"{entry [0]}={entry [1]}"); + } else + Log.LogWarning ("Invalid application placeholders (AndroidApplicationPlaceholders) value. Use 'key1=value1;key2=value2, ...' format. The specified value was: " + ManifestPlaceholders); + } + } + sb.AppendLine ("--out"); + sb.AppendLine (tempFile); + File.WriteAllText (responseFile, sb.ToString ()); + cmd.AppendFileNameIfNotNull (responseFile); + return cmd; + } + + protected override void LogEventsFromTextOutput (string singleLine, MessageImportance messageImportance) + { + if (ExitCode != 0) + Log.LogCodedError (DefaultErrorCode, singleLine); + base.LogEventsFromTextOutput (singleLine, messageImportance); + } + } +} diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/BindingBuildTest.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/BindingBuildTest.cs index 8e8bb2000a0..5b20fa2de07 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/BindingBuildTest.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/BindingBuildTest.cs @@ -316,6 +316,12 @@ public void BindingCheckHiddenFiles ([Values (true, false)] bool useShortFileNam var proj = new XamarinAndroidApplicationProject (); proj.OtherBuildItems.Add (new BuildItem ("ProjectReference", "..\\Binding\\UnnamedProject.csproj")); proj.SetProperty (proj.ActiveConfigurationProperties, "UseShortFileNames", useShortFileNames); + proj.AndroidManifest = $@" + + + + +"; using (var b = CreateApkBuilder (Path.Combine (path, "App"))) { Assert.IsTrue (b.Build (proj), "Build should have succeeded."); var assemblyMap = b.Output.GetIntermediaryPath (Path.Combine ("lp", "map.cache")); diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/BuildTest.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/BuildTest.cs index 17a89b0dead..84014314623 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/BuildTest.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/BuildTest.cs @@ -7,7 +7,9 @@ using System.Text; using System.Text.RegularExpressions; using System.Threading.Tasks; +using System.Xml; using System.Xml.Linq; +using System.Xml.XPath; using Microsoft.Build.Framework; using Mono.Cecil; using NUnit.Framework; @@ -1718,7 +1720,7 @@ public void CheckLintErrorsAndWarnings () { FixLintOnWindows (); - string disabledIssues = "StaticFieldLeak,ObsoleteSdkInt,AllowBackup"; + string disabledIssues = "StaticFieldLeak,ObsoleteSdkInt,AllowBackup,ExportedReceiver"; var proj = new XamarinAndroidApplicationProject () { PackageReferences = { @@ -2319,11 +2321,14 @@ public void ApplicationIdPlaceholder () { var proj = new XamarinAndroidApplicationProject (); proj.AndroidManifest = proj.AndroidManifest.Replace ("", ""); - var builder = CreateApkBuilder ("temp/ApplicationIdPlaceholder"); - builder.Build (proj); - var appsrc = File.ReadAllText (Path.Combine (Root, builder.ProjectDirectory, "obj", "Debug", "android", "AndroidManifest.xml")); - Assert.IsTrue (appsrc.Contains (" - - - - + + + + \ No newline at end of file diff --git a/src/Xamarin.Android.Build.Tasks/Utilities/ManifestDocument.cs b/src/Xamarin.Android.Build.Tasks/Utilities/ManifestDocument.cs index 738abd0e987..108072f4f9a 100644 --- a/src/Xamarin.Android.Build.Tasks/Utilities/ManifestDocument.cs +++ b/src/Xamarin.Android.Build.Tasks/Utilities/ManifestDocument.cs @@ -224,7 +224,7 @@ void ReorderActivityAliases (XElement app) } } - public IList Merge (List subclasses, string applicationClass, bool embed, string bundledWearApplicationName, IEnumerable mergedManifestDocuments) + public IList Merge (List subclasses, string applicationClass, bool embed, string bundledWearApplicationName) { string applicationName = ApplicationName; @@ -409,16 +409,6 @@ public IList Merge (List subclasses, string applicationC ReorderActivityAliases (app); ReorderElements (app); - if (mergedManifestDocuments != null) { - foreach (var mergedManifest in mergedManifestDocuments) { - try { - MergeLibraryManifest (mergedManifest); - } catch (Exception ex) { - log.LogCodedWarning ("XA4302", "Unhandled exception merging `AndroidManifest.xml`: {0}", ex); - } - } - } - return providerNames; SequencePoint FindSource (IEnumerable methods) @@ -443,29 +433,6 @@ SequencePoint FindSource (IEnumerable methods) } } - // FIXME: our manifest merger is hacky. - // To support complete manifest merger, we will have to implement fairly complicated one, described at - // http://tools.android.com/tech-docs/new-build-system/user-guide/manifest-merger - void MergeLibraryManifest (string mergedManifest) - { - var nsResolver = new XmlNamespaceManager (new NameTable ()); - nsResolver.AddNamespace ("android", androidNs.NamespaceName); - var xdoc = XDocument.Load (mergedManifest); - var package = xdoc.Root.Attribute ("package")?.Value ?? string.Empty; - foreach (var top in xdoc.XPathSelectElements ("/manifest/*")) { - var name = top.Attribute (AndroidXmlNamespace.GetName ("name")); - var existing = (name != null) ? - doc.XPathSelectElement (string.Format ("/manifest/{0}[@android:name='{1}']", top.Name.LocalName, name.Value), nsResolver) : - doc.XPathSelectElement (string.Format ("/manifest/{0}", top.Name.LocalName)); - if (existing != null) - // if there is existing node with the same android:name, then append contents to existing node. - existing.Add (FixupNameElements (package, top.Nodes ())); - else - // otherwise, just add to the doc. - doc.Root.Add (FixupNameElements (package, new XNode [] { top })); - } - } - public IEnumerable ResolveDuplicates (IEnumerable elements) { foreach (var e in elements) diff --git a/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Analysis.targets b/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Analysis.targets index 8d723d93d70..9d829fa687d 100644 --- a/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Analysis.targets +++ b/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Analysis.targets @@ -41,7 +41,7 @@ Copyright (C) 2015 Xamarin. All rights reserved. ******************************************* --> - + + <_MonoAndroidEnum Include="$(AndroidGeneratedClassDirectory)\Android.Content.PM.LaunchMode.cs" /> @@ -752,6 +753,11 @@ fetch-windows-assemblers False + + {af8ac493-40ac-4195-82f6-b08ee4b4e49e} + manifestmerger + False + diff --git a/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.targets b/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.targets index c210b3a609e..96993f27e82 100644 --- a/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.targets +++ b/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.targets @@ -88,6 +88,7 @@ Copyright (C) 2011-2012 Xamarin. All rights reserved. + @@ -974,6 +975,12 @@ because xbuild doesn't support framework reference assemblies. /> + + + + + DependsOnTargets="$(_GenerateJavaStubsDependsOnTargets);$(BeforeGenerateAndroidManifest)" + Inputs="$(MSBuildAllProjects);@(_ResolvedUserMonoAndroidAssemblies);$(_AndroidManifestAbs);$(_AndroidBuildPropertiesCache)" + Outputs="$(_AndroidStampDirectory)_GenerateJavaStubs.stamp"> + ResolvedAssemblies="@(_ResolvedAssemblies)" + ResolvedUserAssemblies="@(_ResolvedUserMonoAndroidAssemblies)" + ErrorOnCustomJavaObject="$(AndroidErrorOnCustomJavaObject)" + ManifestTemplate="$(_AndroidManifestAbs)" + Debug="$(AndroidIncludeDebugSymbols)" + MultiDex="$(AndroidEnableMultiDex)" + NeedsInternet="$(AndroidNeedsInternetPermission)" + InstantRunEnabled="$(_InstantRunEnabled)" + AndroidSdkPlatform="$(_AndroidApiLevel)" + AndroidSdkDir="$(_AndroidSdkDirectory)" + PackageName="$(_AndroidPackage)" + ManifestPlaceholders="$(AndroidManifestPlaceholders)" + OutputDirectory="$(IntermediateOutputPath)android" + MergedAndroidManifestOutput="$(IntermediateOutputPath)AndroidManifest.xml" + UseSharedRuntime="$(AndroidUseSharedRuntime)" + EmbedAssemblies="$(EmbedAssembliesIntoApk)" + BundledWearApplicationName="$(BundledWearApplicationPackageName)" + PackageNamingPolicy="$(AndroidPackageNamingPolicy)" + ApplicationJavaClass="$(AndroidApplicationJavaClass)" + FrameworkDirectories="$(_XATargetFrameworkDirectories);$(_XATargetFrameworkDirectories)Facades" + AcwMapFile="$(_AcwMapFile)" + SupportedAbis="@(_BuildTargetAbis)"> + + + + + + + + + DependsOnTargets="_GenerateJavaStubs;_ManifestMerger"> <_GeneratePackageManagerJavaDependsOn> _GenerateJavaStubs; + _ManifestMerger; _ConvertCustomView; _FixupCustomViewsForAapt2; _GenerateEnvironmentFiles; @@ -2210,6 +2236,7 @@ because xbuild doesn't support framework reference assemblies. <_CreateBaseApkDependsOnTargets> _GenerateJavaStubs; + _ManifestMerger; _ConvertCustomView; _FixupCustomViewsForAapt2; _GenerateEnvironmentFiles; @@ -2259,7 +2286,7 @@ because xbuild doesn't support framework reference assemblies. - + <_JavaStubFiles Include="$(_AndroidIntermediateJavaSourceDirectory)**\*.java" /> @@ -2596,6 +2623,7 @@ because xbuild doesn't support framework reference assemblies. _ConvertPdbFiles; _LinkAssemblies; _GenerateJavaStubs; + _ManifestMerger; _ConvertCustomView; _FixupCustomViewsForAapt2; $(AfterGenerateAndroidManifest); diff --git a/src/manifestmerger/build.gradle b/src/manifestmerger/build.gradle new file mode 100644 index 00000000000..24428211812 --- /dev/null +++ b/src/manifestmerger/build.gradle @@ -0,0 +1,36 @@ +plugins { + id 'java-library' +} + +repositories { + maven { url 'https://maven.google.com' } + mavenCentral() + maven { url 'https://kotlin.bintray.com/kotlinx' } + jcenter() +} + +dependencies { + // https://mvnrepository.com/artifact/com.android.tools.build/manifest-merger + compile group: 'com.android.tools.build', name: 'manifest-merger', version: '26.5.0' +} + +sourceSets { + main { + java { + srcDirs = ["src"] + } + } +} + +jar { + duplicatesStrategy = 'exclude' + manifest { + attributes 'Main-Class': 'com.xamarin.manifestmerger.Main' + } + from { + configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } + } { + exclude 'META-INF/*.RSA', 'META-INF/*.SF', 'META-INF/*.DSA' + } + archiveName 'manifestmerger.jar' +} \ No newline at end of file diff --git a/src/manifestmerger/manifestmerger.csproj b/src/manifestmerger/manifestmerger.csproj new file mode 100644 index 00000000000..c03ae8fa07d --- /dev/null +++ b/src/manifestmerger/manifestmerger.csproj @@ -0,0 +1,14 @@ + + + Debug + AnyCPU + af8ac493-40ac-4195-82f6-b08ee4b4e49e + Exe + bin\$(Configuration) + + + + + + + \ No newline at end of file diff --git a/src/manifestmerger/manifestmerger.targets b/src/manifestmerger/manifestmerger.targets new file mode 100644 index 00000000000..7735b311dbd --- /dev/null +++ b/src/manifestmerger/manifestmerger.targets @@ -0,0 +1,45 @@ + + + + ResolveReferences; + _BuildManifestMerger; + + + _CleanManifestMerger; + + <_Destination>$(XAInstallPrefix)xbuild\Xamarin\Android\manifestmerger.jar + + + + + + + + + + + + + + + + + + diff --git a/src/manifestmerger/settings.gradle b/src/manifestmerger/settings.gradle new file mode 100644 index 00000000000..6a4458f7677 --- /dev/null +++ b/src/manifestmerger/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'manifestmerger' \ No newline at end of file diff --git a/src/manifestmerger/src/com/xamarin/manifestmerger/Main.java b/src/manifestmerger/src/com/xamarin/manifestmerger/Main.java new file mode 100644 index 00000000000..5440ebc2fa0 --- /dev/null +++ b/src/manifestmerger/src/com/xamarin/manifestmerger/Main.java @@ -0,0 +1,38 @@ +package com.xamarin.manifestmerger; + +import java.io.File; +import java.io.FileReader; +import java.io.IOException; +import java.io.BufferedReader; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import com.android.manifmerger.Merger; + +public class Main { + public static void main(String[] args) { + // parse the args and pick out the following + // @responseFile + // each line should be an argument eg. + // --main + // AndroidManifest.xml + // --libs + // foo.xml:bar.xml + // --out + // AndroidManifest.xml.tmp + try { + FileReader fr = new FileReader (args [0]); + BufferedReader br = new BufferedReader (fr); + String line; + List arguments = new ArrayList (); + while((line = br.readLine ())!=null) { + arguments.add (line); + } + fr.close (); + String arg []=arguments.toArray (new String[arguments.size ()]); + Merger.main (arg); + } catch (IOException ignore) { + System.err.println("Response file not provided."); + } + } +} \ No newline at end of file diff --git a/tests/msbuild-times-reference/MSBuildDeviceIntegration.csv b/tests/msbuild-times-reference/MSBuildDeviceIntegration.csv index b04598a0a05..efc81987f76 100644 --- a/tests/msbuild-times-reference/MSBuildDeviceIntegration.csv +++ b/tests/msbuild-times-reference/MSBuildDeviceIntegration.csv @@ -7,7 +7,7 @@ Build_CSharp_Change,4100 Build_AndroidResource_Change,4350 Build_Designer_Change,3750 Build_JLO_Change,9000 -Build_CSProj_Change,9500 +Build_CSProj_Change,9800 Build_XAML_Change,9600 Build_XAML_Change_RefAssembly,6350 Install_CSharp_Change,6000