Support flattened APEXes in Runtime APEX unit testing.

Test: art/build/apex/runtests.sh (on a lunch target using flattened APEXes)
Bug: 135535106
Change-Id: Iff52c64ac6a4e80136d733940a5b3d887f612323
diff --git a/build/apex/art_apex_test.py b/build/apex/art_apex_test.py
index 94e86cb..cf78807 100755
--- a/build/apex/art_apex_test.py
+++ b/build/apex/art_apex_test.py
@@ -112,6 +112,34 @@
     return apex_map
 
 
+class TargetFlattenedApexProvider:
+  def __init__(self, apex):
+    self._folder_cache = {}
+    self._apex = apex
+
+  def get(self, path):
+    apex_dir, name = os.path.split(path)
+    if not apex_dir:
+      apex_dir = '.'
+    apex_map = self.read_dir(apex_dir)
+    return apex_map[name] if name in apex_map else None
+
+  def read_dir(self, apex_dir):
+    if apex_dir in self._folder_cache:
+      return self._folder_cache[apex_dir]
+    apex_map = {}
+    dirname = os.path.join(self._apex, apex_dir)
+    if os.path.exists(dirname):
+      for basename in os.listdir(dirname):
+        filepath = os.path.join(dirname, basename)
+        is_dir = os.path.isdir(filepath)
+        is_exec = os.access(filepath, os.X_OK)
+        is_symlink = os.path.islink(filepath)
+        apex_map[basename] = FSObject(basename, is_dir, is_exec, is_symlink)
+    self._folder_cache[apex_dir] = apex_map
+    return apex_map
+
+
 class HostApexProvider:
   def __init__(self, apex, tmpdir):
     self._tmpdir = tmpdir
@@ -674,6 +702,9 @@
 
 # Note: do not sys.exit early, for __del__ cleanup.
 def art_apex_test_main(test_args):
+  if test_args.host and test_args.flattened:
+    logging.error("Both of --host and --flattened set")
+    return 1
   if test_args.tree and test_args.debug:
     logging.error("Both of --tree and --debug set")
     return 1
@@ -696,7 +727,10 @@
     if test_args.host:
       apex_provider = HostApexProvider(test_args.apex, test_args.tmpdir)
     else:
-      apex_provider = TargetApexProvider(test_args.apex, test_args.tmpdir, test_args.debugfs)
+      if test_args.flattened:
+        apex_provider = TargetFlattenedApexProvider(test_args.apex)
+      else:
+        apex_provider = TargetApexProvider(test_args.apex, test_args.tmpdir, test_args.debugfs)
   except (zipfile.BadZipFile, zipfile.LargeZipFile) as e:
     logging.error('Failed to create provider: %s', e)
     return 1
@@ -818,6 +852,8 @@
 
   parser.add_argument('--host', help='Check as host apex', action='store_true')
 
+  parser.add_argument('--flattened', help='Check as flattened (target) apex', action='store_true')
+
   parser.add_argument('--debug', help='Check as debug apex', action='store_true')
 
   parser.add_argument('--list', help='List all files', action='store_true')