Fix warning "Ignored return value"

Bug: 263456849
Test: atest compatibility-common-util-tests
Change-Id: Ibf40753622af771abac40e918aacbd011cd74edc
diff --git a/libraries/compatibility-common-util/Android.bp b/libraries/compatibility-common-util/Android.bp
index 892f5af..6095f31 100644
--- a/libraries/compatibility-common-util/Android.bp
+++ b/libraries/compatibility-common-util/Android.bp
@@ -24,6 +24,7 @@
     srcs: ["src/**/*.java"],
 
     static_libs: [
+        "error_prone_annotations",
         "guava",
         "junit",
     ],
@@ -39,6 +40,7 @@
     srcs: ["src/**/*.java"],
     host_supported: true,
     libs: [
+        "error_prone_annotations",
         "junit",
         "guava",
         "json-prebuilt",
diff --git a/libraries/compatibility-common-util/src/com/android/compatibility/common/util/BackupUtils.java b/libraries/compatibility-common-util/src/com/android/compatibility/common/util/BackupUtils.java
index c636427..9648e47 100644
--- a/libraries/compatibility-common-util/src/com/android/compatibility/common/util/BackupUtils.java
+++ b/libraries/compatibility-common-util/src/com/android/compatibility/common/util/BackupUtils.java
@@ -20,6 +20,8 @@
 import static org.junit.Assert.fail;
 
 import com.google.common.annotations.VisibleForTesting;
+import com.google.common.io.Closeables;
+import com.google.errorprone.annotations.CanIgnoreReturnValue;
 
 import java.io.BufferedReader;
 import java.io.IOException;
@@ -55,8 +57,9 @@
 
     /**
      * Kicks off adb shell {@param command} and return an {@link InputStream} with the command
-     * output stream.
+     * output stream. The return value can be ignored and there might no need to close it.
      */
+    @CanIgnoreReturnValue
     protected abstract InputStream executeShellCommand(String command) throws IOException;
 
     public void executeShellCommandSync(String command) throws IOException {
@@ -64,7 +67,10 @@
     }
 
     public String getShellCommandOutput(String command) throws IOException {
-        return StreamUtil.readInputStream(executeShellCommand(command));
+        InputStream inputStream = executeShellCommand(command);
+        String result = StreamUtil.readInputStream(inputStream);
+        Closeables.closeQuietly(inputStream);
+        return result;
     }
 
     /** Executes shell command "bmgr backupnow <package>" and assert success. */
@@ -268,6 +274,7 @@
         while ((str = br.readLine()) != null) {
             out.append(str).append("\n");
         }
+        Closeables.closeQuietly(in);
         return out.toString();
     }
 
@@ -282,7 +289,7 @@
             throw new RuntimeException("non-parsable output setting bmgr enabled: " + output);
         }
 
-        executeShellCommand("bmgr enable " + enable);
+        Closeables.closeQuietly(executeShellCommand("bmgr enable " + enable));
         return previouslyEnabled;
     }
 
@@ -291,7 +298,7 @@
      */
     public boolean enableBackupForUser(boolean enable, int userId) throws IOException {
         boolean previouslyEnabled = isBackupEnabledForUser(userId);
-        executeShellCommand(String.format("bmgr --user %d enable %b", userId, enable));
+        executeShellCommandSync(String.format("bmgr --user %d enable %b", userId, enable));
         return previouslyEnabled;
     }
 
diff --git a/libraries/compatibility-common-util/src/com/android/compatibility/common/util/BusinessLogicExecutor.java b/libraries/compatibility-common-util/src/com/android/compatibility/common/util/BusinessLogicExecutor.java
index 8905fce..d72785e 100644
--- a/libraries/compatibility-common-util/src/com/android/compatibility/common/util/BusinessLogicExecutor.java
+++ b/libraries/compatibility-common-util/src/com/android/compatibility/common/util/BusinessLogicExecutor.java
@@ -16,6 +16,10 @@
 
 package com.android.compatibility.common.util;
 
+import com.google.errorprone.annotations.CanIgnoreReturnValue;
+
+import org.junit.AssumptionViolatedException;
+
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.util.ArrayList;
@@ -24,8 +28,6 @@
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
-import org.junit.AssumptionViolatedException;
-
 /**
  * Resolves methods provided by the BusinessLogicService and invokes them
  */
@@ -120,15 +122,17 @@
 
     /**
      * Execute a business logic method.
+     *
      * @param method the name of the method to invoke. Must include fully qualified name of the
-     * enclosing class, followed by '.', followed by the name of the method
+     *     enclosing class, followed by '.', followed by the name of the method
      * @param args the string arguments to supply to the method
      * @return the return value of the method invoked (type Boolean if method is a condition)
      * @throws RuntimeException when failing to resolve or invoke the method
      */
-    protected Object invokeMethod(String method, String... args) throws ClassNotFoundException,
-            IllegalAccessException, InstantiationException, InvocationTargetException,
-            NoSuchMethodException {
+    @CanIgnoreReturnValue
+    protected Object invokeMethod(String method, String... args)
+            throws ClassNotFoundException, IllegalAccessException, InstantiationException,
+                    InvocationTargetException, NoSuchMethodException {
         // Method names served by the BusinessLogic service should assume format
         // classname.methodName, but also handle format classname#methodName since test names use
         // this format
diff --git a/libraries/compatibility-common-util/src/com/android/compatibility/common/util/CrashUtils.java b/libraries/compatibility-common-util/src/com/android/compatibility/common/util/CrashUtils.java
index 5e0d127..49fdf6a 100644
--- a/libraries/compatibility-common-util/src/com/android/compatibility/common/util/CrashUtils.java
+++ b/libraries/compatibility-common-util/src/com/android/compatibility/common/util/CrashUtils.java
@@ -16,7 +16,14 @@
 
 package com.android.compatibility.common.util;
 
+import com.google.errorprone.annotations.CanIgnoreReturnValue;
+
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+
 import java.io.File;
+import java.math.BigInteger;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
@@ -27,10 +34,6 @@
 import java.util.stream.Collectors;
 import java.util.stream.IntStream;
 import java.util.stream.Stream;
-import java.math.BigInteger;
-import org.json.JSONArray;
-import org.json.JSONException;
-import org.json.JSONObject;
 
 /** Contains helper functions and shared constants for crash parsing. */
 public class CrashUtils {
@@ -368,72 +371,99 @@
             backtraceExcludes = new ArrayList();
         }
 
+        /** Sets the min address. */
+        @CanIgnoreReturnValue
         public Config setMinAddress(BigInteger minCrashAddress) {
             this.minCrashAddress = minCrashAddress;
             return this;
         }
 
+        /** Check the min address. */
+        @CanIgnoreReturnValue
         public Config checkMinAddress(boolean checkMinAddress) {
             this.checkMinAddress = checkMinAddress;
             return this;
         }
 
+        /** Set the signals. */
+        @CanIgnoreReturnValue
         public Config setSignals(String... signals) {
             this.signals = new ArrayList(Arrays.asList(signals));
             return this;
         }
 
+        /** Appends signals. */
+        @CanIgnoreReturnValue
         public Config appendSignals(String... signals) {
             Collections.addAll(this.signals, signals);
             return this;
         }
 
+        /** Set the abort message includes. */
+        @CanIgnoreReturnValue
         public Config setAbortMessageIncludes(String... abortMessages) {
             this.abortMessageIncludes = new ArrayList<>(toPatterns(abortMessages));
             return this;
         }
 
+        /** Set the abort message includes. */
+        @CanIgnoreReturnValue
         public Config setAbortMessageIncludes(Pattern... abortMessages) {
             this.abortMessageIncludes = new ArrayList<>(Arrays.asList(abortMessages));
             return this;
         }
 
+        /** Appends the abort message includes. */
+        @CanIgnoreReturnValue
         public Config appendAbortMessageIncludes(String... abortMessages) {
             this.abortMessageIncludes.addAll(toPatterns(abortMessages));
             return this;
         }
 
+        /** Appends the abort message includes. */
+        @CanIgnoreReturnValue
         public Config appendAbortMessageIncludes(Pattern... abortMessages) {
             Collections.addAll(this.abortMessageIncludes, abortMessages);
             return this;
         }
 
+        /** Sets the abort message excludes. */
+        @CanIgnoreReturnValue
         public Config setAbortMessageExcludes(String... abortMessages) {
             this.abortMessageExcludes = new ArrayList<>(toPatterns(abortMessages));
             return this;
         }
 
+        /** Sets the abort message excludes. */
+        @CanIgnoreReturnValue
         public Config setAbortMessageExcludes(Pattern... abortMessages) {
             this.abortMessageExcludes = new ArrayList<>(Arrays.asList(abortMessages));
             return this;
         }
 
+        /** Appends the process patterns. */
+        @CanIgnoreReturnValue
         public Config appendAbortMessageExcludes(String... abortMessages) {
             this.abortMessageExcludes.addAll(toPatterns(abortMessages));
             return this;
         }
 
+        /** Appends the abort message excludes. */
+        @CanIgnoreReturnValue
         public Config appendAbortMessageExcludes(Pattern... abortMessages) {
             Collections.addAll(this.abortMessageExcludes, abortMessages);
             return this;
         }
 
-
+        /** Sets the process patterns. */
+        @CanIgnoreReturnValue
         public Config setProcessPatterns(String... processPatternStrings) {
             this.processPatterns = new ArrayList<>(toPatterns(processPatternStrings));
             return this;
         }
 
+        /** Sets the process patterns. */
+        @CanIgnoreReturnValue
         public Config setProcessPatterns(Pattern... processPatterns) {
             this.processPatterns = new ArrayList(Arrays.asList(processPatterns));
             return this;
@@ -443,16 +473,22 @@
             return Collections.unmodifiableList(processPatterns);
         }
 
+        /** Appends the process patterns. */
+        @CanIgnoreReturnValue
         public Config appendProcessPatterns(String... processPatternStrings) {
             this.processPatterns.addAll(toPatterns(processPatternStrings));
             return this;
         }
 
+        /** Appends the process patterns. */
+        @CanIgnoreReturnValue
         public Config appendProcessPatterns(Pattern... processPatterns) {
             Collections.addAll(this.processPatterns, processPatterns);
             return this;
         }
 
+        /** Sets which backtraces should be included. */
+        @CanIgnoreReturnValue
         public Config setBacktraceIncludes(BacktraceFilterPattern... patterns) {
             this.backtraceIncludes = new ArrayList<>(Arrays.asList(patterns));
             return this;
@@ -462,11 +498,15 @@
             return Collections.unmodifiableList(this.backtraceIncludes);
         }
 
+        /** Append which backtraces should be included. */
+        @CanIgnoreReturnValue
         public Config appendBacktraceIncludes(BacktraceFilterPattern... patterns) {
             Collections.addAll(this.backtraceIncludes, patterns);
             return this;
         }
 
+        /** Sets which backtraces should be excluded. */
+        @CanIgnoreReturnValue
         public Config setBacktraceExcludes(BacktraceFilterPattern... patterns) {
             this.backtraceExcludes = new ArrayList<>(Arrays.asList(patterns));
             return this;
@@ -476,6 +516,8 @@
             return Collections.unmodifiableList(this.backtraceExcludes);
         }
 
+        /** Appends which backtraces should be excluded. */
+        @CanIgnoreReturnValue
         public Config appendBacktraceExcludes(BacktraceFilterPattern... patterns) {
             Collections.addAll(this.backtraceExcludes, patterns);
             return this;
diff --git a/libraries/compatibility-common-util/src/com/android/compatibility/common/util/LogcatInspector.java b/libraries/compatibility-common-util/src/com/android/compatibility/common/util/LogcatInspector.java
index 4614f18..bd7b00c 100644
--- a/libraries/compatibility-common-util/src/com/android/compatibility/common/util/LogcatInspector.java
+++ b/libraries/compatibility-common-util/src/com/android/compatibility/common/util/LogcatInspector.java
@@ -32,7 +32,7 @@
      */
     public String mark(String tag) throws IOException {
         String uniqueString = ":::" + UUID.randomUUID().toString();
-        executeShellCommand("log -t " + tag + " " + uniqueString);
+        Closeables.closeQuietly(executeShellCommand("log -t " + tag + " " + uniqueString));
         // This is to guarantee that we only return after the string has been logged, otherwise
         // in practice the case where calling Log.?(<message1>) right after clearAndMark() resulted
         // in <message1> appearing before the unique identifier. It's not guaranteed per the docs
diff --git a/libraries/compatibility-common-util/src/com/android/compatibility/common/util/MultipartForm.java b/libraries/compatibility-common-util/src/com/android/compatibility/common/util/MultipartForm.java
index c311492..11e2c58 100644
--- a/libraries/compatibility-common-util/src/com/android/compatibility/common/util/MultipartForm.java
+++ b/libraries/compatibility-common-util/src/com/android/compatibility/common/util/MultipartForm.java
@@ -16,6 +16,8 @@
 
 package com.android.compatibility.common.util;
 
+import com.google.errorprone.annotations.CanIgnoreReturnValue;
+
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
@@ -52,6 +54,7 @@
      * @param value the attribute's value.
      * @return the {@link MultipartForm} for easy chaining.
      */
+    @CanIgnoreReturnValue
     public MultipartForm addFormValue(String name, String value) {
         mFormValues.put(name, value);
         return this;
@@ -65,6 +68,7 @@
      * @param data The file's data
      * @return the {@link MultipartForm} for easy chaining.
      */
+    @CanIgnoreReturnValue
     public MultipartForm addFormFile(String name, String fileName, byte[] data) {
         mName = name;
         mFileName = fileName;
diff --git a/libraries/compatibility-common-util/src/com/android/compatibility/common/util/ReadElf.java b/libraries/compatibility-common-util/src/com/android/compatibility/common/util/ReadElf.java
index 2bd401d..138100f 100644
--- a/libraries/compatibility-common-util/src/com/android/compatibility/common/util/ReadElf.java
+++ b/libraries/compatibility-common-util/src/com/android/compatibility/common/util/ReadElf.java
@@ -16,6 +16,8 @@
 
 package com.android.compatibility.common.util;
 
+import com.google.errorprone.annotations.CanIgnoreReturnValue;
+
 import java.io.File;
 import java.io.IOException;
 import java.io.RandomAccessFile;
@@ -1208,6 +1210,8 @@
         return mFile.read() & 0xff;
     }
 
+    /** Gets the symbol by name. */
+    @CanIgnoreReturnValue
     public Symbol getSymbol(String name) {
         if (mSymbols == null) {
             try {
@@ -1227,6 +1231,8 @@
         return mSymbols.get(name);
     }
 
+    /** Gets a dynamic symbol by name. */
+    @CanIgnoreReturnValue
     public Symbol getDynamicSymbol(String name) throws IOException {
         if (mDynamicSymbols == null) {
             try {
diff --git a/libraries/compatibility-common-util/src/com/android/compatibility/common/util/ResultHandler.java b/libraries/compatibility-common-util/src/com/android/compatibility/common/util/ResultHandler.java
index 2ed9a32..580cdf9 100644
--- a/libraries/compatibility-common-util/src/com/android/compatibility/common/util/ResultHandler.java
+++ b/libraries/compatibility-common-util/src/com/android/compatibility/common/util/ResultHandler.java
@@ -51,6 +51,7 @@
 import javax.xml.transform.TransformerFactory;
 import javax.xml.transform.stream.StreamResult;
 import javax.xml.transform.stream.StreamSource;
+
 /**
  * Handles conversion of results to/from files.
  *
@@ -597,7 +598,7 @@
         switch (retryStatus) {
             case NotRetry: case RetryWithChecksum:
                 // Do not disrupt the process if there is a problem generating checksum.
-                ChecksumReporter.tryCreateChecksum(resultDir, invocationResult);
+                boolean unused = ChecksumReporter.tryCreateChecksum(resultDir, invocationResult);
                 break;
             case RetryWithoutChecksum:
                 // If the previous run has an invalid checksum file,