From 77fb54a87272553ce31f811175498d867ef02afa Mon Sep 17 00:00:00 2001 From: Atsushi Eno Date: Tue, 20 Dec 2016 13:07:30 +0900 Subject: [PATCH] [msbuild] support AndroidManifest.xml placeholders. We only support ${applicationId} so far, but it seems to be used a lot as https://developer.android.com/studio/build/manifest-build-variables.html Since we are not using Gradle, we'd need something similar to it, which is therefore MSBuild property. --- .../Tasks/GenerateJavaStubs.cs | 3 +++ .../Utilities/ManifestDocument.cs | 10 +++++++++- .../Xamarin.Android.Common.targets | 4 +++- 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/Xamarin.Android.Build.Tasks/Tasks/GenerateJavaStubs.cs b/src/Xamarin.Android.Build.Tasks/Tasks/GenerateJavaStubs.cs index ae72352162a..7b8d58b9ad1 100644 --- a/src/Xamarin.Android.Build.Tasks/Tasks/GenerateJavaStubs.cs +++ b/src/Xamarin.Android.Build.Tasks/Tasks/GenerateJavaStubs.cs @@ -38,6 +38,7 @@ public class GenerateJavaStubs : Task public bool Debug { get; set; } public string ApplicationName { get; set; } public string PackageName { get; set; } + public string [] ManifestPlaceholders { get; set; } public string AndroidSdkDir { get; set; } @@ -77,6 +78,7 @@ public override bool Execute () Log.LogDebugTaskItems (" MergedManifestDocuments:", MergedManifestDocuments); Log.LogDebugMessage (" PackageNamingPolicy: {0}", PackageNamingPolicy); Log.LogDebugMessage (" ApplicationJavaClass: {0}", ApplicationJavaClass); + Log.LogDebugTaskItems (" ManifestPlaceholders: ", ManifestPlaceholders); try { // We're going to do 3 steps here instead of separate tasks so @@ -199,6 +201,7 @@ void Run (DirectoryAssemblyResolver res) manifest.PackageName = PackageName; manifest.ApplicationName = ApplicationName ?? PackageName; + manifest.Placeholders = ManifestPlaceholders; manifest.Assemblies.AddRange (assemblies); manifest.Resolver = res; manifest.SdkDir = AndroidSdkDir; diff --git a/src/Xamarin.Android.Build.Tasks/Utilities/ManifestDocument.cs b/src/Xamarin.Android.Build.Tasks/Utilities/ManifestDocument.cs index 9de4fa90f73..7bac3b1e53e 100644 --- a/src/Xamarin.Android.Build.Tasks/Utilities/ManifestDocument.cs +++ b/src/Xamarin.Android.Build.Tasks/Utilities/ManifestDocument.cs @@ -47,6 +47,7 @@ internal class ManifestDocument public string PackageName { get; set; } public List Addons { get; private set; } public string ApplicationName { get; set; } + public string [] Placeholders { get; set; } public List Assemblies { get; set; } public DirectoryAssemblyResolver Resolver { get; set; } public string SdkDir { get; set; } @@ -780,7 +781,7 @@ public void Save (string filename) using (var file = new StreamWriter (filename, false, new UTF8Encoding (false))) Save (file); } - + public void Save (System.IO.TextWriter stream) { var ms = new MemoryStream (); @@ -790,6 +791,13 @@ public void Save (System.IO.TextWriter stream) var s = new StreamReader (ms).ReadToEnd (); if (ApplicationName != null) s = s.Replace ("${applicationId}", ApplicationName); + if (Placeholders != null) + foreach (var entry in Placeholders.Select (e => e.Split (new char [] {'='}, 2, StringSplitOptions.None))) { + if (entry.Length == 2) + s = s.Replace ("${" + entry [0] + "}", entry [1]); + else + log.LogWarning ("Invalid application placeholders (AndroidApplicationPlaceholders) value. Use 'key1=value1;key2=value2, ...' format. The specified value was: " + Placeholders); + } stream.Write (s); } diff --git a/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.targets b/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.targets index 34136ce2c80..acebd2578c4 100755 --- a/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.targets +++ b/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.targets @@ -178,7 +178,6 @@ Copyright (C) 2011-2012 Xamarin. All rights reserved. True True - Normal True @@ -249,6 +248,8 @@ Copyright (C) 2011-2012 Xamarin. All rights reserved. <_AndroidMainDexListFile>$(IntermediateOutputPath)multidex.keep + + <_PackagedResources>$(IntermediateOutputPath)android\bin\packaged_resources <_Android32bitArchitectures>armeabi-v7a;armeabi;x86;mips @@ -1675,6 +1676,7 @@ because xbuild doesn't support framework reference assemblies. AndroidSdkPlatform="$(_AndroidApiLevel)" AndroidSdkDir="$(_AndroidSdkDirectory)" PackageName="$(_AndroidPackage)" + ManifestPlaceholders="$(AndroidManifestPlaceholders)" OutputDirectory="$(IntermediateOutputPath)android" MergedAndroidManifestOutput="$(IntermediateOutputPath)android\AndroidManifest.xml" UseSharedRuntime="$(AndroidUseSharedRuntime)"