diff --git a/tools/aapt2/link/Link.cpp b/tools/aapt2/link/Link.cpp index 8c8bffafdc45d..49971201fb3c1 100644 --- a/tools/aapt2/link/Link.cpp +++ b/tools/aapt2/link/Link.cpp @@ -1459,6 +1459,21 @@ int link(const std::vector& args) { return 1; } + // Expand all argument-files passed into the command line. These start with '@'. + std::vector argList; + for (const std::string& arg : flags.getArgs()) { + if (util::stringStartsWith(arg, "@")) { + const std::string path = arg.substr(1, arg.size() - 1); + std::string error; + if (!file::appendArgsFromFile(path, &argList, &error)) { + context.getDiagnostics()->error(DiagMessage(path) << error); + return 1; + } + } else { + argList.push_back(arg); + } + } + if (verbose) { context.setVerbose(verbose); } @@ -1568,7 +1583,7 @@ int link(const std::vector& args) { } LinkCommand cmd(&context, options); - return cmd.run(flags.getArgs()); + return cmd.run(argList); } } // namespace aapt diff --git a/tools/aapt2/util/Files.cpp b/tools/aapt2/util/Files.cpp index bb093abbce634..f5e49f11c082b 100644 --- a/tools/aapt2/util/Files.cpp +++ b/tools/aapt2/util/Files.cpp @@ -18,6 +18,7 @@ #include "util/Util.h" #include +#include #include #include #include @@ -190,6 +191,23 @@ Maybe mmapPath(const StringPiece& path, std::string* outError) return std::move(fileMap); } +bool appendArgsFromFile(const StringPiece& path, std::vector* outArgList, + std::string* outError) { + std::string contents; + if (!android::base::ReadFileToString(path.toString(), &contents)) { + if (outError) *outError = "failed to read argument-list file"; + return false; + } + + for (StringPiece line : util::tokenize(contents, ' ')) { + line = util::trimWhitespace(line); + if (!line.empty()) { + outArgList->push_back(line.toString()); + } + } + return true; +} + bool FileFilter::setPattern(const StringPiece& pattern) { mPatternTokens = util::splitAndLowercase(pattern, ':'); return true; diff --git a/tools/aapt2/util/Files.h b/tools/aapt2/util/Files.h index c2e611543b1e1..4d8a1feb63b1c 100644 --- a/tools/aapt2/util/Files.h +++ b/tools/aapt2/util/Files.h @@ -95,6 +95,12 @@ std::string packageToPath(const StringPiece& package); */ Maybe mmapPath(const StringPiece& path, std::string* outError); +/** + * Reads the file at path and appends each line to the outArgList vector. + */ +bool appendArgsFromFile(const StringPiece& path, std::vector* outArgList, + std::string* outError); + /* * Filter that determines which resource files/directories are * processed by AAPT. Takes a pattern string supplied by the user.