Read hiddenapi-flags.csv file in chunks to avoid memory issues.

This test is failing for 3GB devices due to loading the whole file into
memory. This change reverts some runtime optimizations (parsing the file
in parallel ag/899574). From a local experiment the runtime regression
is 40%-66% and the runtime is now ~1m for each test case.
Based on  https://partner-android-review.googlesource.com/c/platform/cts/+/1419756.

Bug:138451655
Test: atest -p cts/tests/signature
Change-Id: I158e29ab077b4f2b2a50f11ecbe7dbf54d7bda43
Merged-In: I158e29ab077b4f2b2a50f11ecbe7dbf54d7bda43
diff --git a/tests/signature/api-check/src/java/android/signature/cts/api/HiddenApiTest.java b/tests/signature/api-check/src/java/android/signature/cts/api/HiddenApiTest.java
index 8efa483..b185c50 100644
--- a/tests/signature/api-check/src/java/android/signature/cts/api/HiddenApiTest.java
+++ b/tests/signature/api-check/src/java/android/signature/cts/api/HiddenApiTest.java
@@ -26,7 +26,12 @@
 import android.signature.cts.DexMethod;
 import android.signature.cts.FailureType;
 
+import java.io.BufferedReader;
 import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.io.IOException;
+import java.text.ParseException;
 import java.util.function.Predicate;
 import java.util.stream.Stream;
 
@@ -136,33 +141,21 @@
                     }
                 }
             };
-            parseDexApiFilesAsStream(hiddenapiFiles)
-                    .filter(memberFilter)
-                    .forEach(dexMember -> {
-                        if (shouldTestMember(dexMember)) {
-                            DexMemberChecker.checkSingleMember(dexMember, reflection, jni,
-                                    observer);
-                        }
-                    });
-        });
-    }
-
-    private Stream<DexMember> parseDexApiFilesAsStream(String[] apiFiles) {
-        DexApiDocumentParser dexApiDocumentParser = new DexApiDocumentParser();
-        // To allow parallelization with a DexMember output type, we need two
-        // pipes.
-        Stream<Stream<DexMember>> inputsAsStreams = Stream.of(apiFiles).parallel()
-                .map(name -> new File(API_FILE_DIRECTORY + "/" + name))
-                .flatMap(file -> readFileOptimized(file))
-                .map(obj -> dexApiDocumentParser.parseAsStream(obj));
-        // The flatMap inherently serializes the pipe. The number of inputs is
-        // still small here, so reduce by concatenating (note the caveats of
-        // concats).
-        return inputsAsStreams.reduce(null, (prev, stream) -> {
-            if (prev == null) {
-                return stream;
+            for (String apiFile : hiddenapiFiles) {
+                BufferedReader reader = new BufferedReader(
+                        new FileReader(API_FILE_DIRECTORY + "/" + apiFile));
+                int lineIndex = 1;
+                String line = reader.readLine();
+                while (line != null) {
+                    DexMember dexMember = DexApiDocumentParser.parseLine(line, lineIndex);
+                    if (memberFilter.test(dexMember) && shouldTestMember(dexMember)) {
+                        DexMemberChecker.checkSingleMember(dexMember, reflection, jni,
+                                observer);
+                    }
+                    line = reader.readLine();
+                    lineIndex++;
+                }
             }
-            return Stream.concat(prev, stream);
         });
     }
 
diff --git a/tests/signature/lib/common/src/android/signature/cts/DexApiDocumentParser.java b/tests/signature/lib/common/src/android/signature/cts/DexApiDocumentParser.java
index 7b71d65..8bb3062 100644
--- a/tests/signature/lib/common/src/android/signature/cts/DexApiDocumentParser.java
+++ b/tests/signature/lib/common/src/android/signature/cts/DexApiDocumentParser.java
@@ -88,7 +88,7 @@
                 lineLengthEstimate, DEX_MEMBER_CONVERTER), true);
     }
 
-    private static DexMember parseLine(String line, int lineNum) throws ParseException {
+    public static DexMember parseLine(String line, int lineNum) throws ParseException {
         // Split the CSV line.
         String[] splitLine = line.split(",");
         String signature = splitLine[0];