Properly throw exceptions in ResourceProcessorBusyBox, and log exceptions in CompileLibraryResourcesAction.

Fixes https://github.com/bazelbuild/bazel/issues/7442

RELNOTES: Fixed issue where exceptions and stacktraces were silently swallowed in the Android resource processing pipeline.
PiperOrigin-RevId: 234224275
diff --git a/src/tools/android/java/com/google/devtools/build/android/CompileLibraryResourcesAction.java b/src/tools/android/java/com/google/devtools/build/android/CompileLibraryResourcesAction.java
index 9b95e54..0a96595 100644
--- a/src/tools/android/java/com/google/devtools/build/android/CompileLibraryResourcesAction.java
+++ b/src/tools/android/java/com/google/devtools/build/android/CompileLibraryResourcesAction.java
@@ -26,9 +26,11 @@
 import com.google.devtools.common.options.OptionsBase;
 import com.google.devtools.common.options.OptionsParser;
 import com.google.devtools.common.options.ShellQuotedParamsFilePreProcessor;
+import java.io.IOException;
 import java.nio.file.FileSystems;
 import java.nio.file.Files;
 import java.nio.file.Path;
+import java.util.concurrent.ExecutionException;
 import java.util.logging.Logger;
 
 /** Compiles resources using aapt2 and archives them to zip. */
@@ -136,6 +138,9 @@
               options.dataBindingInfoOut, options.packagePath, databindingResourcesRoot)
           .compile(compiler, compiledResources)
           .copyResourcesZipTo(options.output);
+    } catch (IOException | ExecutionException | InterruptedException e) {
+      logger.log(java.util.logging.Level.SEVERE, "Unexpected", e);
+      throw e;
     }
   }
 }
diff --git a/src/tools/android/java/com/google/devtools/build/android/ResourceProcessorBusyBox.java b/src/tools/android/java/com/google/devtools/build/android/ResourceProcessorBusyBox.java
index 7188ca3..297d376 100644
--- a/src/tools/android/java/com/google/devtools/build/android/ResourceProcessorBusyBox.java
+++ b/src/tools/android/java/com/google/devtools/build/android/ResourceProcessorBusyBox.java
@@ -193,7 +193,7 @@
     public Tool tool;
   }
 
-  public static void main(String[] args) {
+  public static void main(String[] args) throws Exception {
     // It's cheaper and cleaner to detect for a single flag to start worker mode without having to
     // initialize Options/OptionsParser here. This keeps the processRequest interface minimal and
     // minimizes moving option state between these methods.
@@ -204,7 +204,7 @@
     }
   }
 
-  private static int runPersistentWorker() {
+  private static int runPersistentWorker() throws Exception {
     while (true) {
       try {
         WorkRequest request = WorkRequest.parseDelimitedFrom(System.in);
@@ -228,7 +228,7 @@
     return 0;
   }
 
-  private static int processRequest(List<String> args) {
+  private static int processRequest(List<String> args) throws Exception {
     OptionsParser optionsParser = OptionsParser.newOptionsParser(Options.class);
     optionsParser.setAllowResidue(true);
     optionsParser.enableParamsFileSupport(
@@ -245,10 +245,10 @@
         | Aapt2Exception
         | InvalidJavaIdentifier e) {
       logSuppressed(e);
-      return 1;
+      throw e;
     } catch (Exception e) {
       logger.log(Level.SEVERE, "Error during processing", e);
-      return 1;
+      throw e;
     }
     return 0;
   }