AAPT2: Compile --zip flag

Added a --zip flag similar to --dir that allows resources to be passed
into "aapt2 compile" using a zip file.

Also refactored Compile.cpp to be easier to mock and test in the future.

Bug: 74574557
Test: aapt2_tests
Change-Id: Idb90cb97e23a219525bdead38220cbf7bc6f3cab
diff --git a/tools/aapt2/io/ZipArchive.cpp b/tools/aapt2/io/ZipArchive.cpp
index 269b6c5..8e6d713 100644
--- a/tools/aapt2/io/ZipArchive.cpp
+++ b/tools/aapt2/io/ZipArchive.cpp
@@ -20,6 +20,7 @@
 #include "ziparchive/zip_archive.h"
 
 #include "Source.h"
+#include "util/Files.h"
 #include "util/Util.h"
 
 using ::android::StringPiece;
@@ -121,9 +122,14 @@
     std::string zip_entry_path =
         std::string(reinterpret_cast<const char*>(zip_entry_name.name),
                     zip_entry_name.name_length);
-    std::string nested_path = path.to_string() + "@" + zip_entry_path;
-    std::unique_ptr<IFile> file =
-        util::make_unique<ZipFile>(collection->handle_, zip_data, Source(nested_path));
+
+    // Do not add folders to the file collection
+    if (util::EndsWith(zip_entry_path, "/")) {
+      continue;
+    }
+
+    std::unique_ptr<IFile> file = util::make_unique<ZipFile>(collection->handle_, zip_data,
+        Source(zip_entry_path, path.to_string()));
     collection->files_by_name_[zip_entry_path] = file.get();
     collection->files_.push_back(std::move(file));
   }
@@ -132,6 +138,7 @@
     if (out_error) *out_error = ErrorCodeString(result);
     return {};
   }
+
   return collection;
 }