1*d57664e9SAndroid Build Coastguard Worker /* 2*d57664e9SAndroid Build Coastguard Worker * Copyright (C) 2018 The Android Open Source Project 3*d57664e9SAndroid Build Coastguard Worker * 4*d57664e9SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*d57664e9SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*d57664e9SAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*d57664e9SAndroid Build Coastguard Worker * 8*d57664e9SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*d57664e9SAndroid Build Coastguard Worker * 10*d57664e9SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*d57664e9SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*d57664e9SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*d57664e9SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*d57664e9SAndroid Build Coastguard Worker * limitations under the License. 15*d57664e9SAndroid Build Coastguard Worker */ 16*d57664e9SAndroid Build Coastguard Worker 17*d57664e9SAndroid Build Coastguard Worker #ifndef AAPT2_DUMP_H 18*d57664e9SAndroid Build Coastguard Worker #define AAPT2_DUMP_H 19*d57664e9SAndroid Build Coastguard Worker 20*d57664e9SAndroid Build Coastguard Worker #include <androidfw/FileStream.h> 21*d57664e9SAndroid Build Coastguard Worker #include <io/ZipArchive.h> 22*d57664e9SAndroid Build Coastguard Worker 23*d57664e9SAndroid Build Coastguard Worker #include "Command.h" 24*d57664e9SAndroid Build Coastguard Worker #include "Debug.h" 25*d57664e9SAndroid Build Coastguard Worker #include "LoadedApk.h" 26*d57664e9SAndroid Build Coastguard Worker #include "dump/DumpManifest.h" 27*d57664e9SAndroid Build Coastguard Worker 28*d57664e9SAndroid Build Coastguard Worker namespace aapt { 29*d57664e9SAndroid Build Coastguard Worker 30*d57664e9SAndroid Build Coastguard Worker /** 31*d57664e9SAndroid Build Coastguard Worker * The base command for dumping information about apks. When the command is executed, the command 32*d57664e9SAndroid Build Coastguard Worker * performs the DumpApkCommand::Dump() operation on each apk provided as a file argument. 33*d57664e9SAndroid Build Coastguard Worker **/ 34*d57664e9SAndroid Build Coastguard Worker class DumpApkCommand : public Command { 35*d57664e9SAndroid Build Coastguard Worker public: DumpApkCommand(const std::string && name,text::Printer * printer,android::IDiagnostics * diag)36*d57664e9SAndroid Build Coastguard Worker explicit DumpApkCommand(const std::string&& name, text::Printer* printer, 37*d57664e9SAndroid Build Coastguard Worker android::IDiagnostics* diag) 38*d57664e9SAndroid Build Coastguard Worker : Command(name), printer_(printer), diag_(diag) { 39*d57664e9SAndroid Build Coastguard Worker SetDescription("Dump information about an APK or APC."); 40*d57664e9SAndroid Build Coastguard Worker } 41*d57664e9SAndroid Build Coastguard Worker GetPrinter()42*d57664e9SAndroid Build Coastguard Worker text::Printer* GetPrinter() { 43*d57664e9SAndroid Build Coastguard Worker return printer_; 44*d57664e9SAndroid Build Coastguard Worker } 45*d57664e9SAndroid Build Coastguard Worker GetDiagnostics()46*d57664e9SAndroid Build Coastguard Worker android::IDiagnostics* GetDiagnostics() { 47*d57664e9SAndroid Build Coastguard Worker return diag_; 48*d57664e9SAndroid Build Coastguard Worker } 49*d57664e9SAndroid Build Coastguard Worker GetPackageName(LoadedApk * apk)50*d57664e9SAndroid Build Coastguard Worker std::optional<std::string> GetPackageName(LoadedApk* apk) { 51*d57664e9SAndroid Build Coastguard Worker xml::Element* manifest_el = apk->GetManifest()->root.get(); 52*d57664e9SAndroid Build Coastguard Worker if (!manifest_el) { 53*d57664e9SAndroid Build Coastguard Worker GetDiagnostics()->Error(android::DiagMessage() << "No AndroidManifest."); 54*d57664e9SAndroid Build Coastguard Worker return {}; 55*d57664e9SAndroid Build Coastguard Worker } 56*d57664e9SAndroid Build Coastguard Worker 57*d57664e9SAndroid Build Coastguard Worker xml::Attribute* attr = manifest_el->FindAttribute({}, "package"); 58*d57664e9SAndroid Build Coastguard Worker if (!attr) { 59*d57664e9SAndroid Build Coastguard Worker GetDiagnostics()->Error(android::DiagMessage() << "No package name."); 60*d57664e9SAndroid Build Coastguard Worker return {}; 61*d57664e9SAndroid Build Coastguard Worker } 62*d57664e9SAndroid Build Coastguard Worker return attr->value; 63*d57664e9SAndroid Build Coastguard Worker } 64*d57664e9SAndroid Build Coastguard Worker 65*d57664e9SAndroid Build Coastguard Worker /** Perform the dump operation on the apk. */ 66*d57664e9SAndroid Build Coastguard Worker virtual int Dump(LoadedApk* apk) = 0; 67*d57664e9SAndroid Build Coastguard Worker Action(const std::vector<std::string> & args)68*d57664e9SAndroid Build Coastguard Worker int Action(const std::vector<std::string>& args) final { 69*d57664e9SAndroid Build Coastguard Worker if (args.size() < 1) { 70*d57664e9SAndroid Build Coastguard Worker diag_->Error(android::DiagMessage() << "No dump apk specified."); 71*d57664e9SAndroid Build Coastguard Worker return 1; 72*d57664e9SAndroid Build Coastguard Worker } 73*d57664e9SAndroid Build Coastguard Worker 74*d57664e9SAndroid Build Coastguard Worker bool error = false; 75*d57664e9SAndroid Build Coastguard Worker for (auto apk : args) { 76*d57664e9SAndroid Build Coastguard Worker auto loaded_apk = LoadedApk::LoadApkFromPath(apk, diag_); 77*d57664e9SAndroid Build Coastguard Worker if (!loaded_apk) { 78*d57664e9SAndroid Build Coastguard Worker error = true; 79*d57664e9SAndroid Build Coastguard Worker continue; 80*d57664e9SAndroid Build Coastguard Worker } 81*d57664e9SAndroid Build Coastguard Worker 82*d57664e9SAndroid Build Coastguard Worker error |= Dump(loaded_apk.get()); 83*d57664e9SAndroid Build Coastguard Worker } 84*d57664e9SAndroid Build Coastguard Worker 85*d57664e9SAndroid Build Coastguard Worker return error; 86*d57664e9SAndroid Build Coastguard Worker } 87*d57664e9SAndroid Build Coastguard Worker 88*d57664e9SAndroid Build Coastguard Worker private: 89*d57664e9SAndroid Build Coastguard Worker text::Printer* printer_; 90*d57664e9SAndroid Build Coastguard Worker android::IDiagnostics* diag_; 91*d57664e9SAndroid Build Coastguard Worker }; 92*d57664e9SAndroid Build Coastguard Worker 93*d57664e9SAndroid Build Coastguard Worker /** Command that prints contents of files generated from the compilation stage. */ 94*d57664e9SAndroid Build Coastguard Worker class DumpAPCCommand : public Command { 95*d57664e9SAndroid Build Coastguard Worker public: DumpAPCCommand(text::Printer * printer,android::IDiagnostics * diag)96*d57664e9SAndroid Build Coastguard Worker explicit DumpAPCCommand(text::Printer* printer, android::IDiagnostics* diag) 97*d57664e9SAndroid Build Coastguard Worker : Command("apc"), printer_(printer), diag_(diag) { 98*d57664e9SAndroid Build Coastguard Worker SetDescription("Print the contents of the AAPT2 Container (APC) generated fom compilation."); 99*d57664e9SAndroid Build Coastguard Worker AddOptionalSwitch("--no-values", "Suppresses output of values when displaying resource tables.", 100*d57664e9SAndroid Build Coastguard Worker &no_values_); 101*d57664e9SAndroid Build Coastguard Worker AddOptionalSwitch("-v", "Enables verbose logging.", &verbose_); 102*d57664e9SAndroid Build Coastguard Worker } 103*d57664e9SAndroid Build Coastguard Worker 104*d57664e9SAndroid Build Coastguard Worker int Action(const std::vector<std::string>& args) override; 105*d57664e9SAndroid Build Coastguard Worker 106*d57664e9SAndroid Build Coastguard Worker private: 107*d57664e9SAndroid Build Coastguard Worker text::Printer* printer_; 108*d57664e9SAndroid Build Coastguard Worker android::IDiagnostics* diag_; 109*d57664e9SAndroid Build Coastguard Worker bool no_values_ = false; 110*d57664e9SAndroid Build Coastguard Worker bool verbose_ = false; 111*d57664e9SAndroid Build Coastguard Worker }; 112*d57664e9SAndroid Build Coastguard Worker 113*d57664e9SAndroid Build Coastguard Worker /** Easter egg command shown when users enter "badger" instead of "badging". */ 114*d57664e9SAndroid Build Coastguard Worker class DumpBadgerCommand : public Command { 115*d57664e9SAndroid Build Coastguard Worker public: DumpBadgerCommand(text::Printer * printer)116*d57664e9SAndroid Build Coastguard Worker explicit DumpBadgerCommand(text::Printer* printer) : Command("badger"), printer_(printer) { 117*d57664e9SAndroid Build Coastguard Worker } 118*d57664e9SAndroid Build Coastguard Worker 119*d57664e9SAndroid Build Coastguard Worker int Action(const std::vector<std::string>& args) override; 120*d57664e9SAndroid Build Coastguard Worker 121*d57664e9SAndroid Build Coastguard Worker private: 122*d57664e9SAndroid Build Coastguard Worker text::Printer* printer_; 123*d57664e9SAndroid Build Coastguard Worker const static char kBadgerData[2925]; 124*d57664e9SAndroid Build Coastguard Worker }; 125*d57664e9SAndroid Build Coastguard Worker 126*d57664e9SAndroid Build Coastguard Worker class DumpBadgingCommand : public DumpApkCommand { 127*d57664e9SAndroid Build Coastguard Worker public: DumpBadgingCommand(text::Printer * printer,android::IDiagnostics * diag)128*d57664e9SAndroid Build Coastguard Worker explicit DumpBadgingCommand(text::Printer* printer, android::IDiagnostics* diag) 129*d57664e9SAndroid Build Coastguard Worker : DumpApkCommand("badging", printer, diag) { 130*d57664e9SAndroid Build Coastguard Worker SetDescription("Print information extracted from the manifest of the APK."); 131*d57664e9SAndroid Build Coastguard Worker AddOptionalSwitch("--include-meta-data", "Include meta-data information.", 132*d57664e9SAndroid Build Coastguard Worker &options_.include_meta_data); 133*d57664e9SAndroid Build Coastguard Worker } 134*d57664e9SAndroid Build Coastguard Worker SetIncludeMetaData(bool value)135*d57664e9SAndroid Build Coastguard Worker void SetIncludeMetaData(bool value) { 136*d57664e9SAndroid Build Coastguard Worker options_.include_meta_data = value; 137*d57664e9SAndroid Build Coastguard Worker } 138*d57664e9SAndroid Build Coastguard Worker SetOnlyPermissions(bool value)139*d57664e9SAndroid Build Coastguard Worker void SetOnlyPermissions(bool value) { 140*d57664e9SAndroid Build Coastguard Worker options_.only_permissions = value; 141*d57664e9SAndroid Build Coastguard Worker } 142*d57664e9SAndroid Build Coastguard Worker Dump(LoadedApk * apk)143*d57664e9SAndroid Build Coastguard Worker int Dump(LoadedApk* apk) override { 144*d57664e9SAndroid Build Coastguard Worker return DumpManifest(apk, options_, GetPrinter(), GetDiagnostics()); 145*d57664e9SAndroid Build Coastguard Worker } 146*d57664e9SAndroid Build Coastguard Worker 147*d57664e9SAndroid Build Coastguard Worker private: 148*d57664e9SAndroid Build Coastguard Worker DumpManifestOptions options_; 149*d57664e9SAndroid Build Coastguard Worker }; 150*d57664e9SAndroid Build Coastguard Worker 151*d57664e9SAndroid Build Coastguard Worker class DumpConfigsCommand : public DumpApkCommand { 152*d57664e9SAndroid Build Coastguard Worker public: DumpConfigsCommand(text::Printer * printer,android::IDiagnostics * diag)153*d57664e9SAndroid Build Coastguard Worker explicit DumpConfigsCommand(text::Printer* printer, android::IDiagnostics* diag) 154*d57664e9SAndroid Build Coastguard Worker : DumpApkCommand("configurations", printer, diag) { 155*d57664e9SAndroid Build Coastguard Worker SetDescription("Print every configuration used by a resource in the APK."); 156*d57664e9SAndroid Build Coastguard Worker } 157*d57664e9SAndroid Build Coastguard Worker 158*d57664e9SAndroid Build Coastguard Worker int Dump(LoadedApk* apk) override; 159*d57664e9SAndroid Build Coastguard Worker }; 160*d57664e9SAndroid Build Coastguard Worker 161*d57664e9SAndroid Build Coastguard Worker class DumpPackageNameCommand : public DumpApkCommand { 162*d57664e9SAndroid Build Coastguard Worker public: DumpPackageNameCommand(text::Printer * printer,android::IDiagnostics * diag)163*d57664e9SAndroid Build Coastguard Worker explicit DumpPackageNameCommand(text::Printer* printer, android::IDiagnostics* diag) 164*d57664e9SAndroid Build Coastguard Worker : DumpApkCommand("packagename", printer, diag) { 165*d57664e9SAndroid Build Coastguard Worker SetDescription("Print the package name of the APK."); 166*d57664e9SAndroid Build Coastguard Worker } 167*d57664e9SAndroid Build Coastguard Worker 168*d57664e9SAndroid Build Coastguard Worker int Dump(LoadedApk* apk) override; 169*d57664e9SAndroid Build Coastguard Worker }; 170*d57664e9SAndroid Build Coastguard Worker 171*d57664e9SAndroid Build Coastguard Worker class DumpPermissionsCommand : public DumpApkCommand { 172*d57664e9SAndroid Build Coastguard Worker public: DumpPermissionsCommand(text::Printer * printer,android::IDiagnostics * diag)173*d57664e9SAndroid Build Coastguard Worker explicit DumpPermissionsCommand(text::Printer* printer, android::IDiagnostics* diag) 174*d57664e9SAndroid Build Coastguard Worker : DumpApkCommand("permissions", printer, diag) { 175*d57664e9SAndroid Build Coastguard Worker SetDescription("Print the permissions extracted from the manifest of the APK."); 176*d57664e9SAndroid Build Coastguard Worker } 177*d57664e9SAndroid Build Coastguard Worker Dump(LoadedApk * apk)178*d57664e9SAndroid Build Coastguard Worker int Dump(LoadedApk* apk) override { 179*d57664e9SAndroid Build Coastguard Worker DumpManifestOptions options; 180*d57664e9SAndroid Build Coastguard Worker options.only_permissions = true; 181*d57664e9SAndroid Build Coastguard Worker return DumpManifest(apk, options, GetPrinter(), GetDiagnostics()); 182*d57664e9SAndroid Build Coastguard Worker } 183*d57664e9SAndroid Build Coastguard Worker }; 184*d57664e9SAndroid Build Coastguard Worker 185*d57664e9SAndroid Build Coastguard Worker class DumpStringsCommand : public DumpApkCommand { 186*d57664e9SAndroid Build Coastguard Worker public: DumpStringsCommand(text::Printer * printer,android::IDiagnostics * diag)187*d57664e9SAndroid Build Coastguard Worker explicit DumpStringsCommand(text::Printer* printer, android::IDiagnostics* diag) 188*d57664e9SAndroid Build Coastguard Worker : DumpApkCommand("strings", printer, diag) { 189*d57664e9SAndroid Build Coastguard Worker SetDescription("Print the contents of the resource table string pool in the APK."); 190*d57664e9SAndroid Build Coastguard Worker } 191*d57664e9SAndroid Build Coastguard Worker 192*d57664e9SAndroid Build Coastguard Worker int Dump(LoadedApk* apk) override; 193*d57664e9SAndroid Build Coastguard Worker }; 194*d57664e9SAndroid Build Coastguard Worker 195*d57664e9SAndroid Build Coastguard Worker /** Prints the graph of parents of a style in an APK. */ 196*d57664e9SAndroid Build Coastguard Worker class DumpStyleParentCommand : public DumpApkCommand { 197*d57664e9SAndroid Build Coastguard Worker public: DumpStyleParentCommand(text::Printer * printer,android::IDiagnostics * diag)198*d57664e9SAndroid Build Coastguard Worker explicit DumpStyleParentCommand(text::Printer* printer, android::IDiagnostics* diag) 199*d57664e9SAndroid Build Coastguard Worker : DumpApkCommand("styleparents", printer, diag) { 200*d57664e9SAndroid Build Coastguard Worker SetDescription("Print the parents of a style in an APK."); 201*d57664e9SAndroid Build Coastguard Worker AddRequiredFlag("--style", "The name of the style to print", &style_); 202*d57664e9SAndroid Build Coastguard Worker } 203*d57664e9SAndroid Build Coastguard Worker 204*d57664e9SAndroid Build Coastguard Worker int Dump(LoadedApk* apk) override; 205*d57664e9SAndroid Build Coastguard Worker 206*d57664e9SAndroid Build Coastguard Worker private: 207*d57664e9SAndroid Build Coastguard Worker std::string style_; 208*d57664e9SAndroid Build Coastguard Worker }; 209*d57664e9SAndroid Build Coastguard Worker 210*d57664e9SAndroid Build Coastguard Worker class DumpTableCommand : public DumpApkCommand { 211*d57664e9SAndroid Build Coastguard Worker public: DumpTableCommand(text::Printer * printer,android::IDiagnostics * diag)212*d57664e9SAndroid Build Coastguard Worker explicit DumpTableCommand(text::Printer* printer, android::IDiagnostics* diag) 213*d57664e9SAndroid Build Coastguard Worker : DumpApkCommand("resources", printer, diag) { 214*d57664e9SAndroid Build Coastguard Worker SetDescription("Print the contents of the resource table from the APK."); 215*d57664e9SAndroid Build Coastguard Worker AddOptionalSwitch("--no-values", "Suppresses output of values when displaying resource tables.", 216*d57664e9SAndroid Build Coastguard Worker &no_values_); 217*d57664e9SAndroid Build Coastguard Worker AddOptionalSwitch("-v", "Enables verbose logging.", &verbose_); 218*d57664e9SAndroid Build Coastguard Worker } 219*d57664e9SAndroid Build Coastguard Worker 220*d57664e9SAndroid Build Coastguard Worker int Dump(LoadedApk* apk) override; 221*d57664e9SAndroid Build Coastguard Worker 222*d57664e9SAndroid Build Coastguard Worker private: 223*d57664e9SAndroid Build Coastguard Worker bool no_values_ = false; 224*d57664e9SAndroid Build Coastguard Worker bool verbose_ = false; 225*d57664e9SAndroid Build Coastguard Worker }; 226*d57664e9SAndroid Build Coastguard Worker 227*d57664e9SAndroid Build Coastguard Worker class DumpXmlStringsCommand : public DumpApkCommand { 228*d57664e9SAndroid Build Coastguard Worker public: DumpXmlStringsCommand(text::Printer * printer,android::IDiagnostics * diag)229*d57664e9SAndroid Build Coastguard Worker explicit DumpXmlStringsCommand(text::Printer* printer, android::IDiagnostics* diag) 230*d57664e9SAndroid Build Coastguard Worker : DumpApkCommand("xmlstrings", printer, diag) { 231*d57664e9SAndroid Build Coastguard Worker SetDescription("Print the string pool of a compiled xml in an APK."); 232*d57664e9SAndroid Build Coastguard Worker AddRequiredFlagList("--file", "A compiled xml file to print", &files_); 233*d57664e9SAndroid Build Coastguard Worker } 234*d57664e9SAndroid Build Coastguard Worker 235*d57664e9SAndroid Build Coastguard Worker int Dump(LoadedApk* apk) override; 236*d57664e9SAndroid Build Coastguard Worker 237*d57664e9SAndroid Build Coastguard Worker private: 238*d57664e9SAndroid Build Coastguard Worker std::vector<std::string> files_; 239*d57664e9SAndroid Build Coastguard Worker }; 240*d57664e9SAndroid Build Coastguard Worker 241*d57664e9SAndroid Build Coastguard Worker class DumpChunks : public DumpApkCommand { 242*d57664e9SAndroid Build Coastguard Worker public: DumpChunks(text::Printer * printer,android::IDiagnostics * diag)243*d57664e9SAndroid Build Coastguard Worker DumpChunks(text::Printer* printer, android::IDiagnostics* diag) 244*d57664e9SAndroid Build Coastguard Worker : DumpApkCommand("chunks", printer, diag) { 245*d57664e9SAndroid Build Coastguard Worker SetDescription("Print the chunk information of the compiled resources.arsc in the APK."); 246*d57664e9SAndroid Build Coastguard Worker } 247*d57664e9SAndroid Build Coastguard Worker 248*d57664e9SAndroid Build Coastguard Worker int Dump(LoadedApk* apk) override; 249*d57664e9SAndroid Build Coastguard Worker }; 250*d57664e9SAndroid Build Coastguard Worker 251*d57664e9SAndroid Build Coastguard Worker /** Prints the tree of a compiled xml in an APK. */ 252*d57664e9SAndroid Build Coastguard Worker class DumpXmlTreeCommand : public DumpApkCommand { 253*d57664e9SAndroid Build Coastguard Worker public: DumpXmlTreeCommand(text::Printer * printer,android::IDiagnostics * diag)254*d57664e9SAndroid Build Coastguard Worker explicit DumpXmlTreeCommand(text::Printer* printer, android::IDiagnostics* diag) 255*d57664e9SAndroid Build Coastguard Worker : DumpApkCommand("xmltree", printer, diag) { 256*d57664e9SAndroid Build Coastguard Worker SetDescription("Print the tree of a compiled xml in an APK."); 257*d57664e9SAndroid Build Coastguard Worker AddRequiredFlagList("--file", "A compiled xml file to print", &files_); 258*d57664e9SAndroid Build Coastguard Worker } 259*d57664e9SAndroid Build Coastguard Worker 260*d57664e9SAndroid Build Coastguard Worker int Dump(LoadedApk* apk) override; 261*d57664e9SAndroid Build Coastguard Worker 262*d57664e9SAndroid Build Coastguard Worker private: 263*d57664e9SAndroid Build Coastguard Worker std::vector<std::string> files_; 264*d57664e9SAndroid Build Coastguard Worker }; 265*d57664e9SAndroid Build Coastguard Worker 266*d57664e9SAndroid Build Coastguard Worker class DumpOverlayableCommand : public DumpApkCommand { 267*d57664e9SAndroid Build Coastguard Worker public: DumpOverlayableCommand(text::Printer * printer,android::IDiagnostics * diag)268*d57664e9SAndroid Build Coastguard Worker explicit DumpOverlayableCommand(text::Printer* printer, android::IDiagnostics* diag) 269*d57664e9SAndroid Build Coastguard Worker : DumpApkCommand("overlayable", printer, diag) { 270*d57664e9SAndroid Build Coastguard Worker SetDescription("Print the <overlayable> resources of an APK."); 271*d57664e9SAndroid Build Coastguard Worker } 272*d57664e9SAndroid Build Coastguard Worker 273*d57664e9SAndroid Build Coastguard Worker int Dump(LoadedApk* apk) override; 274*d57664e9SAndroid Build Coastguard Worker }; 275*d57664e9SAndroid Build Coastguard Worker 276*d57664e9SAndroid Build Coastguard Worker /** The default dump command. Performs no action because a subcommand is required. */ 277*d57664e9SAndroid Build Coastguard Worker class DumpCommand : public Command { 278*d57664e9SAndroid Build Coastguard Worker public: DumpCommand(text::Printer * printer,android::IDiagnostics * diag)279*d57664e9SAndroid Build Coastguard Worker explicit DumpCommand(text::Printer* printer, android::IDiagnostics* diag) 280*d57664e9SAndroid Build Coastguard Worker : Command("dump", "d"), diag_(diag) { 281*d57664e9SAndroid Build Coastguard Worker AddOptionalSubcommand(util::make_unique<DumpAPCCommand>(printer, diag_)); 282*d57664e9SAndroid Build Coastguard Worker AddOptionalSubcommand(util::make_unique<DumpBadgingCommand>(printer, diag_)); 283*d57664e9SAndroid Build Coastguard Worker AddOptionalSubcommand(util::make_unique<DumpConfigsCommand>(printer, diag_)); 284*d57664e9SAndroid Build Coastguard Worker AddOptionalSubcommand(util::make_unique<DumpPackageNameCommand>(printer, diag_)); 285*d57664e9SAndroid Build Coastguard Worker AddOptionalSubcommand(util::make_unique<DumpPermissionsCommand>(printer, diag_)); 286*d57664e9SAndroid Build Coastguard Worker AddOptionalSubcommand(util::make_unique<DumpStringsCommand>(printer, diag_)); 287*d57664e9SAndroid Build Coastguard Worker AddOptionalSubcommand(util::make_unique<DumpStyleParentCommand>(printer, diag_)); 288*d57664e9SAndroid Build Coastguard Worker AddOptionalSubcommand(util::make_unique<DumpTableCommand>(printer, diag_)); 289*d57664e9SAndroid Build Coastguard Worker AddOptionalSubcommand(util::make_unique<DumpChunks>(printer, diag_)); 290*d57664e9SAndroid Build Coastguard Worker AddOptionalSubcommand(util::make_unique<DumpXmlStringsCommand>(printer, diag_)); 291*d57664e9SAndroid Build Coastguard Worker AddOptionalSubcommand(util::make_unique<DumpXmlTreeCommand>(printer, diag_)); 292*d57664e9SAndroid Build Coastguard Worker AddOptionalSubcommand(util::make_unique<DumpOverlayableCommand>(printer, diag_)); 293*d57664e9SAndroid Build Coastguard Worker AddOptionalSubcommand(util::make_unique<DumpBadgerCommand>(printer), /* hidden */ true); 294*d57664e9SAndroid Build Coastguard Worker } 295*d57664e9SAndroid Build Coastguard Worker Action(const std::vector<std::string> & args)296*d57664e9SAndroid Build Coastguard Worker int Action(const std::vector<std::string>& args) override { 297*d57664e9SAndroid Build Coastguard Worker if (args.size() == 0) { 298*d57664e9SAndroid Build Coastguard Worker diag_->Error(android::DiagMessage() << "no subcommand specified"); 299*d57664e9SAndroid Build Coastguard Worker } else { 300*d57664e9SAndroid Build Coastguard Worker diag_->Error(android::DiagMessage() << "unknown subcommand '" << args[0] << "'"); 301*d57664e9SAndroid Build Coastguard Worker } 302*d57664e9SAndroid Build Coastguard Worker Usage(&std::cerr); 303*d57664e9SAndroid Build Coastguard Worker return 1; 304*d57664e9SAndroid Build Coastguard Worker } 305*d57664e9SAndroid Build Coastguard Worker 306*d57664e9SAndroid Build Coastguard Worker private: 307*d57664e9SAndroid Build Coastguard Worker android::IDiagnostics* diag_; 308*d57664e9SAndroid Build Coastguard Worker }; 309*d57664e9SAndroid Build Coastguard Worker 310*d57664e9SAndroid Build Coastguard Worker } // namespace aapt 311*d57664e9SAndroid Build Coastguard Worker 312*d57664e9SAndroid Build Coastguard Worker #endif // AAPT2_DUMP_H 313