AAPT2: accept argument file list for -R

Bug:29462255
Change-Id: Ia83919a3e7de7fe2056a3f7613621972cccd49cb
diff --git a/tools/aapt2/link/Link.cpp b/tools/aapt2/link/Link.cpp
index a4fa7e0..4767bc9 100644
--- a/tools/aapt2/link/Link.cpp
+++ b/tools/aapt2/link/Link.cpp
@@ -1389,6 +1389,7 @@
 int link(const std::vector<StringPiece>& args) {
     LinkContext context;
     LinkOptions options;
+    std::vector<std::string> overlayArgList;
     Maybe<std::string> privateSymbolsPackage;
     Maybe<std::string> minSdkVersion, targetSdkVersion;
     Maybe<std::string> renameManifestPackage, renameInstrumentationTargetPackage;
@@ -1408,7 +1409,7 @@
             .optionalFlagList("-I", "Adds an Android APK to link against", &options.includePaths)
             .optionalFlagList("-R", "Compilation unit to link, using `overlay` semantics.\n"
                               "The last conflicting resource given takes precedence.",
-                              &options.overlayFiles)
+                              &overlayArgList)
             .optionalFlag("--java", "Directory in which to generate R.java",
                           &options.generateJavaClassPath)
             .optionalFlag("--proguard", "Output file for generated Proguard rules",
@@ -1493,6 +1494,20 @@
         }
     }
 
+    // Expand all argument-files passed to -R.
+    for (const std::string& arg : overlayArgList) {
+        if (util::stringStartsWith<char>(arg, "@")) {
+            const std::string path = arg.substr(1, arg.size() - 1);
+            std::string error;
+            if (!file::appendArgsFromFile(path, &options.overlayFiles, &error)) {
+                context.getDiagnostics()->error(DiagMessage(path) << error);
+                return 1;
+            }
+        } else {
+            options.overlayFiles.push_back(arg);
+        }
+    }
+
     if (verbose) {
         context.setVerbose(verbose);
     }