Add --source-path flag to AAPT2 compile

This added flag uses a given value to replace the default absolute resource
file path in the compiled resource file. This allows for relative file
paths to be used instead of absolute file paths.

Test: Compile_test.cpp
Bug: 159611599
Change-Id: I5f1c99cf40e5d31fc54cda819c91640285986d2a
diff --git a/tools/aapt2/cmd/Compile.cpp b/tools/aapt2/cmd/Compile.cpp
index 3268653..ff54fcc 100644
--- a/tools/aapt2/cmd/Compile.cpp
+++ b/tools/aapt2/cmd/Compile.cpp
@@ -75,8 +75,10 @@
 };
 
 // Resource file paths are expected to look like: [--/res/]type[-config]/name
-static Maybe<ResourcePathData> ExtractResourcePathData(const std::string& path, const char dir_sep,
-                                                       std::string* out_error) {
+static Maybe<ResourcePathData> ExtractResourcePathData(const std::string& path,
+                                                       const char dir_sep,
+                                                       std::string* out_error,
+                                                       const CompileOptions& options) {
   std::vector<std::string> parts = util::Split(path, dir_sep);
   if (parts.size() < 2) {
     if (out_error) *out_error = "bad resource path";
@@ -121,7 +123,11 @@
     }
   }
 
-  return ResourcePathData{Source(path),          dir_str.to_string(),    name.to_string(),
+  const Source res_path = options.source_path
+      ? StringPiece(options.source_path.value())
+      : StringPiece(path);
+
+  return ResourcePathData{res_path, dir_str.to_string(), name.to_string(),
                           extension.to_string(), config_str.to_string(), config};
 }
 
@@ -667,7 +673,8 @@
     // Extract resource type information from the full path
     std::string err_str;
     ResourcePathData path_data;
-    if (auto maybe_path_data = ExtractResourcePathData(path, inputs->GetDirSeparator(), &err_str)) {
+    if (auto maybe_path_data = ExtractResourcePathData(
+        path, inputs->GetDirSeparator(), &err_str, options)) {
       path_data = maybe_path_data.value();
     } else {
       context->GetDiagnostics()->Error(DiagMessage(file->GetSource()) << err_str);
@@ -747,6 +754,11 @@
     context.GetDiagnostics()->Error(DiagMessage()
                                       << "only one of --dir and --zip can be specified");
     return 1;
+  } else if ((options_.res_dir || options_.res_zip) &&
+              options_.source_path && args.size() > 1) {
+      context.GetDiagnostics()->Error(DiagMessage(kPath)
+      << "Cannot use an overriding source path with multiple files.");
+      return 1;
   } else if (options_.res_dir) {
     if (!args.empty()) {
       context.GetDiagnostics()->Error(DiagMessage() << "files given but --dir specified");