diff options
author | Andrew Pellegrini <apell@google.com> | 2016-06-22 20:46:21 +0000 |
---|---|---|
committer | Lukacs Berki <lberki@google.com> | 2016-06-23 11:10:23 +0000 |
commit | e1a4a812971f604d51bdf098b6117d9ba03da1c8 (patch) | |
tree | d53b64a6f80fb82cfa43d65c9b3f2f73b9084cdf /src/tools/android/java/com/google/devtools/build/android/ManifestMergerAction.java | |
parent | 6105e2415faa0f36ec6ae3399d90e1a173ef7f58 (diff) |
Adds the Android manifest merger as an option for android_binary rules. The merger that is used (legacy or android) is controlled by the manifest_merger attribute on android_binary and the default is controlled by the --android_manifest_merger flag.
RELNOTES: The Android manifest merger is now available as an option for android_binary rules. The merger will honor tools annotations in AndroidManifest.xml and will perform placeholder substitutions using the values specified in android_binary.manifest_values. The merger may be selected by setting the manifest_merger attribute on android_binary.
--
MOS_MIGRATED_REVID=125603954
Diffstat (limited to 'src/tools/android/java/com/google/devtools/build/android/ManifestMergerAction.java')
-rw-r--r-- | src/tools/android/java/com/google/devtools/build/android/ManifestMergerAction.java | 49 |
1 files changed, 48 insertions, 1 deletions
diff --git a/src/tools/android/java/com/google/devtools/build/android/ManifestMergerAction.java b/src/tools/android/java/com/google/devtools/build/android/ManifestMergerAction.java index 4a8f0a5500..ce1884d6a4 100644 --- a/src/tools/android/java/com/google/devtools/build/android/ManifestMergerAction.java +++ b/src/tools/android/java/com/google/devtools/build/android/ManifestMergerAction.java @@ -15,6 +15,7 @@ package com.google.devtools.build.android; import static java.util.logging.Level.SEVERE; +import com.google.common.collect.ImmutableList; import com.google.devtools.build.android.Converters.ExistingPathConverter; import com.google.devtools.build.android.Converters.ExistingPathListConverter; import com.google.devtools.build.android.Converters.MergeTypeConverter; @@ -27,6 +28,11 @@ import com.google.devtools.common.options.OptionsParser; import com.android.manifmerger.ManifestMerger2.MergeType; import com.android.utils.StdLogger; +import org.w3c.dom.Document; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.xml.sax.SAXException; + import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; @@ -36,6 +42,16 @@ import java.util.List; import java.util.Map; import java.util.logging.Logger; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.transform.TransformerConfigurationException; +import javax.xml.transform.TransformerException; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.TransformerFactoryConfigurationError; +import javax.xml.transform.dom.DOMSource; +import javax.xml.transform.stream.StreamResult; + /** * An action to perform manifest merging using the Gradle manifest merger. * @@ -102,11 +118,34 @@ public class ManifestMergerAction { public Path manifestOutput; } + private static final String[] PERMISSION_TAGS = + new String[] {"uses-permission", "uses-permission-sdk-23"}; private static final StdLogger stdLogger = new StdLogger(StdLogger.Level.WARNING); private static final Logger logger = Logger.getLogger(ManifestMergerAction.class.getName()); private static Options options; + private static Path removePermissions(Path manifest, Path outputDir) + throws IOException, ParserConfigurationException, TransformerConfigurationException, + TransformerException, TransformerFactoryConfigurationError, SAXException { + DocumentBuilder docBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); + Document doc = docBuilder.parse(manifest.toFile()); + for (String tag : PERMISSION_TAGS) { + NodeList permissions = doc.getElementsByTagName(tag); + if (permissions != null) { + for (int i = permissions.getLength() - 1; i >= 0; i--) { + Node permission = permissions.item(i); + permission.getParentNode().removeChild(permission); + } + } + } + Path output = outputDir.resolve(manifest.getFileName()); + TransformerFactory.newInstance().newTransformer().transform( + new DOMSource(doc), + new StreamResult(output.toFile())); + return output; + } + public static void main(String[] args) throws Exception { OptionsParser optionsParser = OptionsParser.newOptionsParser(Options.class); optionsParser.parseAndExitUponError(args); @@ -117,10 +156,18 @@ public class ManifestMergerAction { try { Path mergedManifest; if (options.mergeType == MergeType.APPLICATION) { + // Remove uses-permission tags from mergees before the merge. + Path tmp = Files.createTempDirectory("manifest_merge_tmp"); + tmp.toFile().deleteOnExit(); + ImmutableList.Builder<Path> mergeeManifests = ImmutableList.builder(); + for (Path mergeeManifest : options.mergeeManifests) { + mergeeManifests.add(removePermissions(mergeeManifest, tmp)); + } + // Ignore custom package at the binary level. mergedManifest = resourceProcessor.mergeManifest( options.manifest, - options.mergeeManifests, + mergeeManifests.build(), options.mergeType, options.manifestValues, options.manifestOutput); |