Changed Android manifest merger build action to also resolve relative class names in manifest files for Android libraries.

RELNOTES: none
PiperOrigin-RevId: 167147373
diff --git a/src/test/java/com/google/devtools/build/android/ManifestMergerActionTest.java b/src/test/java/com/google/devtools/build/android/ManifestMergerActionTest.java
index 37314d5..9b989ad 100644
--- a/src/test/java/com/google/devtools/build/android/ManifestMergerActionTest.java
+++ b/src/test/java/com/google/devtools/build/android/ManifestMergerActionTest.java
@@ -167,7 +167,7 @@
     final Path libBarManifest = AndroidDataBuilder.of(working.resolve("libBar"))
         .createManifest("AndroidManifest.xml", "com.google.bar",
             "<application android:name=\"${applicationId}\">",
-            "<activity android:name=\"com.google.bar.activityFoo\" />",
+            "<activity android:name=\".activityFoo\" />",
             "</application>")
         .buildUnvalidated()
         .getManifest();
@@ -192,14 +192,13 @@
     assertThat(Joiner.on(" ")
         .join(Files.readAllLines(libBarOutput, UTF_8))
         .replaceAll("\\s+", " ").trim()).contains(
-            "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
-            + "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\""
-            + " package=\"com.google.libbar\">"
-            + "<application android:name=\"${applicationId}\">"
-            + " <activity android:name=\"com.google.bar.activityFoo\">"
-            + "</activity>"
+            "<?xml version=\"1.0\" encoding=\"utf-8\"?>"
+            + " <manifest xmlns:android=\"http://schemas.android.com/apk/res/android\""
+            + " package=\"com.google.libbar\" >"
+            + " <application android:name=\"${applicationId}\" >"
+            + " <activity android:name=\"com.google.bar.activityFoo\" />"
             + " </application>"
-            + "</manifest>");
+            + " </manifest>");
 
     // binary manifest merging
     args = generateArgs(
diff --git a/src/tools/android/java/com/google/devtools/build/android/AndroidManifestProcessor.java b/src/tools/android/java/com/google/devtools/build/android/AndroidManifestProcessor.java
index cd9e6f8..490d245 100644
--- a/src/tools/android/java/com/google/devtools/build/android/AndroidManifestProcessor.java
+++ b/src/tools/android/java/com/google/devtools/build/android/AndroidManifestProcessor.java
@@ -129,10 +129,10 @@
       Map<Path, String> mergeeManifests,
       MergeType mergeType,
       Map<String, String> values,
+      String customPackage,
       Path output,
-      Path logFile)
-      throws ManifestProcessingException {
-    if (mergeeManifests.isEmpty() && values.isEmpty()) {
+      Path logFile) throws ManifestProcessingException {
+    if (mergeeManifests.isEmpty() && values.isEmpty() && Strings.isNullOrEmpty(customPackage)) {
       return manifest;
     }
 
@@ -172,6 +172,11 @@
     placeholders.remove(PlaceholderHandler.PACKAGE_NAME);
     manifestMerger.setPlaceHolderValues(placeholders);
 
+    // Ignore custom package at the binary level.
+    if (!Strings.isNullOrEmpty(customPackage) && mergeType == MergeType.LIBRARY) {
+      manifestMerger.setOverride(SystemProperty.PACKAGE, customPackage);
+    }
+
     try {
       MergingReport mergingReport = manifestMerger.merge();
 
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 43ef880..9a75d65 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
@@ -192,33 +192,27 @@
     try {
       Path mergedManifest;
       AndroidManifestProcessor manifestProcessor = AndroidManifestProcessor.with(stdLogger);
-      if (options.mergeType == MergeType.APPLICATION) {
-        // Remove uses-permission tags from mergees before the merge.
-        Path tmp = Files.createTempDirectory("manifest_merge_tmp");
-        tmp.toFile().deleteOnExit();
-        ImmutableMap.Builder<Path, String> mergeeManifests = ImmutableMap.builder();
-        for (Entry<Path, String> mergeeManifest : options.mergeeManifests.entrySet()) {
-          mergeeManifests.put(
-              removePermissions(mergeeManifest.getKey(), tmp),
-              mergeeManifest.getValue());
-        }
 
-        // Ignore custom package at the binary level.
-        mergedManifest =
-            manifestProcessor.mergeManifest(
-                options.manifest,
-                mergeeManifests.build(),
-                options.mergeType,
-                options.manifestValues,
-                options.manifestOutput,
-                options.log);
-      } else {
-        // Only need to stamp custom package into the library level.
-        mergedManifest =
-            manifestProcessor.writeManifestPackage(
-                options.manifest, options.customPackage, options.manifestOutput);
+      // Remove uses-permission tags from mergees before the merge.
+      Path tmp = Files.createTempDirectory("manifest_merge_tmp");
+      tmp.toFile().deleteOnExit();
+      ImmutableMap.Builder<Path, String> mergeeManifests = ImmutableMap.builder();
+      for (Entry<Path, String> mergeeManifest : options.mergeeManifests.entrySet()) {
+        mergeeManifests.put(
+            removePermissions(mergeeManifest.getKey(), tmp),
+            mergeeManifest.getValue());
       }
 
+      mergedManifest =
+          manifestProcessor.mergeManifest(
+              options.manifest,
+              mergeeManifests.build(),
+              options.mergeType,
+              options.manifestValues,
+              options.customPackage,
+              options.manifestOutput,
+              options.log);
+
       if (!mergedManifest.equals(options.manifestOutput)) {
         Files.copy(options.manifest, options.manifestOutput, StandardCopyOption.REPLACE_EXISTING);
       }