xref: /aosp_15_r20/frameworks/base/tools/aapt2/cmd/Dump.cpp (revision d57664e9bc4670b3ecf6748a746a57c557b6bc9e)
1*d57664e9SAndroid Build Coastguard Worker /*
2*d57664e9SAndroid Build Coastguard Worker  * Copyright (C) 2016 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 #include "Dump.h"
18*d57664e9SAndroid Build Coastguard Worker 
19*d57664e9SAndroid Build Coastguard Worker #include <cinttypes>
20*d57664e9SAndroid Build Coastguard Worker #include <vector>
21*d57664e9SAndroid Build Coastguard Worker 
22*d57664e9SAndroid Build Coastguard Worker #include "Debug.h"
23*d57664e9SAndroid Build Coastguard Worker #include "Diagnostics.h"
24*d57664e9SAndroid Build Coastguard Worker #include "LoadedApk.h"
25*d57664e9SAndroid Build Coastguard Worker #include "Util.h"
26*d57664e9SAndroid Build Coastguard Worker #include "android-base/stringprintf.h"
27*d57664e9SAndroid Build Coastguard Worker #include "androidfw/ConfigDescription.h"
28*d57664e9SAndroid Build Coastguard Worker #include "androidfw/FileStream.h"
29*d57664e9SAndroid Build Coastguard Worker #include "androidfw/StringPiece.h"
30*d57664e9SAndroid Build Coastguard Worker #include "format/Container.h"
31*d57664e9SAndroid Build Coastguard Worker #include "format/binary/BinaryResourceParser.h"
32*d57664e9SAndroid Build Coastguard Worker #include "format/binary/XmlFlattener.h"
33*d57664e9SAndroid Build Coastguard Worker #include "format/proto/ProtoDeserialize.h"
34*d57664e9SAndroid Build Coastguard Worker #include "io/ZipArchive.h"
35*d57664e9SAndroid Build Coastguard Worker #include "process/IResourceTableConsumer.h"
36*d57664e9SAndroid Build Coastguard Worker #include "text/Printer.h"
37*d57664e9SAndroid Build Coastguard Worker #include "util/Files.h"
38*d57664e9SAndroid Build Coastguard Worker 
39*d57664e9SAndroid Build Coastguard Worker using ::aapt::text::Printer;
40*d57664e9SAndroid Build Coastguard Worker using ::android::StringPiece;
41*d57664e9SAndroid Build Coastguard Worker using ::android::base::StringPrintf;
42*d57664e9SAndroid Build Coastguard Worker 
43*d57664e9SAndroid Build Coastguard Worker namespace aapt {
44*d57664e9SAndroid Build Coastguard Worker 
ResourceFileTypeToString(const ResourceFile::Type & type)45*d57664e9SAndroid Build Coastguard Worker static const char* ResourceFileTypeToString(const ResourceFile::Type& type) {
46*d57664e9SAndroid Build Coastguard Worker   switch (type) {
47*d57664e9SAndroid Build Coastguard Worker     case ResourceFile::Type::kPng:
48*d57664e9SAndroid Build Coastguard Worker       return "PNG";
49*d57664e9SAndroid Build Coastguard Worker     case ResourceFile::Type::kBinaryXml:
50*d57664e9SAndroid Build Coastguard Worker       return "BINARY_XML";
51*d57664e9SAndroid Build Coastguard Worker     case ResourceFile::Type::kProtoXml:
52*d57664e9SAndroid Build Coastguard Worker       return "PROTO_XML";
53*d57664e9SAndroid Build Coastguard Worker     default:
54*d57664e9SAndroid Build Coastguard Worker       break;
55*d57664e9SAndroid Build Coastguard Worker   }
56*d57664e9SAndroid Build Coastguard Worker   return "UNKNOWN";
57*d57664e9SAndroid Build Coastguard Worker }
58*d57664e9SAndroid Build Coastguard Worker 
DumpCompiledFile(const ResourceFile & file,const android::Source & source,off64_t offset,size_t len,Printer * printer)59*d57664e9SAndroid Build Coastguard Worker static void DumpCompiledFile(const ResourceFile& file, const android::Source& source,
60*d57664e9SAndroid Build Coastguard Worker                              off64_t offset, size_t len, Printer* printer) {
61*d57664e9SAndroid Build Coastguard Worker   printer->Print("Resource: ");
62*d57664e9SAndroid Build Coastguard Worker   printer->Println(file.name.to_string());
63*d57664e9SAndroid Build Coastguard Worker 
64*d57664e9SAndroid Build Coastguard Worker   printer->Print("Config:   ");
65*d57664e9SAndroid Build Coastguard Worker   printer->Println(file.config.to_string());
66*d57664e9SAndroid Build Coastguard Worker 
67*d57664e9SAndroid Build Coastguard Worker   printer->Print("Source:   ");
68*d57664e9SAndroid Build Coastguard Worker   printer->Println(file.source.to_string());
69*d57664e9SAndroid Build Coastguard Worker 
70*d57664e9SAndroid Build Coastguard Worker   printer->Print("Type:     ");
71*d57664e9SAndroid Build Coastguard Worker   printer->Println(ResourceFileTypeToString(file.type));
72*d57664e9SAndroid Build Coastguard Worker 
73*d57664e9SAndroid Build Coastguard Worker   printer->Println(StringPrintf("Data:     offset=%" PRIi64 " length=%zd", offset, len));
74*d57664e9SAndroid Build Coastguard Worker }
75*d57664e9SAndroid Build Coastguard Worker 
76*d57664e9SAndroid Build Coastguard Worker namespace {
77*d57664e9SAndroid Build Coastguard Worker 
78*d57664e9SAndroid Build Coastguard Worker class DumpContext : public IAaptContext {
79*d57664e9SAndroid Build Coastguard Worker  public:
GetPackageType()80*d57664e9SAndroid Build Coastguard Worker   PackageType GetPackageType() override {
81*d57664e9SAndroid Build Coastguard Worker     // Doesn't matter.
82*d57664e9SAndroid Build Coastguard Worker     return PackageType::kApp;
83*d57664e9SAndroid Build Coastguard Worker   }
84*d57664e9SAndroid Build Coastguard Worker 
GetDiagnostics()85*d57664e9SAndroid Build Coastguard Worker   android::IDiagnostics* GetDiagnostics() override {
86*d57664e9SAndroid Build Coastguard Worker     return &diagnostics_;
87*d57664e9SAndroid Build Coastguard Worker   }
88*d57664e9SAndroid Build Coastguard Worker 
GetNameMangler()89*d57664e9SAndroid Build Coastguard Worker   NameMangler* GetNameMangler() override {
90*d57664e9SAndroid Build Coastguard Worker     UNIMPLEMENTED(FATAL);
91*d57664e9SAndroid Build Coastguard Worker     return nullptr;
92*d57664e9SAndroid Build Coastguard Worker   }
93*d57664e9SAndroid Build Coastguard Worker 
GetCompilationPackage()94*d57664e9SAndroid Build Coastguard Worker   const std::string& GetCompilationPackage() override {
95*d57664e9SAndroid Build Coastguard Worker     static std::string empty;
96*d57664e9SAndroid Build Coastguard Worker     return empty;
97*d57664e9SAndroid Build Coastguard Worker   }
98*d57664e9SAndroid Build Coastguard Worker 
GetPackageId()99*d57664e9SAndroid Build Coastguard Worker   uint8_t GetPackageId() override {
100*d57664e9SAndroid Build Coastguard Worker     return 0;
101*d57664e9SAndroid Build Coastguard Worker   }
102*d57664e9SAndroid Build Coastguard Worker 
GetExternalSymbols()103*d57664e9SAndroid Build Coastguard Worker   SymbolTable* GetExternalSymbols() override {
104*d57664e9SAndroid Build Coastguard Worker     UNIMPLEMENTED(FATAL);
105*d57664e9SAndroid Build Coastguard Worker     return nullptr;
106*d57664e9SAndroid Build Coastguard Worker   }
107*d57664e9SAndroid Build Coastguard Worker 
IsVerbose()108*d57664e9SAndroid Build Coastguard Worker   bool IsVerbose() override {
109*d57664e9SAndroid Build Coastguard Worker     return verbose_;
110*d57664e9SAndroid Build Coastguard Worker   }
111*d57664e9SAndroid Build Coastguard Worker 
SetVerbose(bool val)112*d57664e9SAndroid Build Coastguard Worker   void SetVerbose(bool val) {
113*d57664e9SAndroid Build Coastguard Worker     verbose_ = val;
114*d57664e9SAndroid Build Coastguard Worker     diagnostics_.SetVerbose(val);
115*d57664e9SAndroid Build Coastguard Worker   }
116*d57664e9SAndroid Build Coastguard Worker 
GetMinSdkVersion()117*d57664e9SAndroid Build Coastguard Worker   int GetMinSdkVersion() override {
118*d57664e9SAndroid Build Coastguard Worker     return 0;
119*d57664e9SAndroid Build Coastguard Worker   }
120*d57664e9SAndroid Build Coastguard Worker 
GetSplitNameDependencies()121*d57664e9SAndroid Build Coastguard Worker   const std::set<std::string>& GetSplitNameDependencies() override {
122*d57664e9SAndroid Build Coastguard Worker     UNIMPLEMENTED(FATAL) << "Split Name Dependencies should not be necessary";
123*d57664e9SAndroid Build Coastguard Worker     static std::set<std::string> empty;
124*d57664e9SAndroid Build Coastguard Worker     return empty;
125*d57664e9SAndroid Build Coastguard Worker   }
126*d57664e9SAndroid Build Coastguard Worker 
127*d57664e9SAndroid Build Coastguard Worker  private:
128*d57664e9SAndroid Build Coastguard Worker   StdErrDiagnostics diagnostics_;
129*d57664e9SAndroid Build Coastguard Worker   bool verbose_ = false;
130*d57664e9SAndroid Build Coastguard Worker };
131*d57664e9SAndroid Build Coastguard Worker 
132*d57664e9SAndroid Build Coastguard Worker }  // namespace
133*d57664e9SAndroid Build Coastguard Worker 
Action(const std::vector<std::string> & args)134*d57664e9SAndroid Build Coastguard Worker int DumpAPCCommand::Action(const std::vector<std::string>& args) {
135*d57664e9SAndroid Build Coastguard Worker   DumpContext context;
136*d57664e9SAndroid Build Coastguard Worker   DebugPrintTableOptions print_options;
137*d57664e9SAndroid Build Coastguard Worker   print_options.show_sources = true;
138*d57664e9SAndroid Build Coastguard Worker   print_options.show_values = !no_values_;
139*d57664e9SAndroid Build Coastguard Worker 
140*d57664e9SAndroid Build Coastguard Worker   if (args.size() < 1) {
141*d57664e9SAndroid Build Coastguard Worker     diag_->Error(android::DiagMessage() << "No dump container specified");
142*d57664e9SAndroid Build Coastguard Worker     return 1;
143*d57664e9SAndroid Build Coastguard Worker   }
144*d57664e9SAndroid Build Coastguard Worker 
145*d57664e9SAndroid Build Coastguard Worker   bool error = false;
146*d57664e9SAndroid Build Coastguard Worker   for (auto container : args) {
147*d57664e9SAndroid Build Coastguard Worker     android::FileInputStream input(container);
148*d57664e9SAndroid Build Coastguard Worker     if (input.HadError()) {
149*d57664e9SAndroid Build Coastguard Worker       context.GetDiagnostics()->Error(android::DiagMessage(container)
150*d57664e9SAndroid Build Coastguard Worker                                       << "failed to open file: " << input.GetError());
151*d57664e9SAndroid Build Coastguard Worker       error = true;
152*d57664e9SAndroid Build Coastguard Worker       continue;
153*d57664e9SAndroid Build Coastguard Worker     }
154*d57664e9SAndroid Build Coastguard Worker 
155*d57664e9SAndroid Build Coastguard Worker     // Try as a compiled file.
156*d57664e9SAndroid Build Coastguard Worker     ContainerReader reader(&input);
157*d57664e9SAndroid Build Coastguard Worker     if (reader.HadError()) {
158*d57664e9SAndroid Build Coastguard Worker       context.GetDiagnostics()->Error(android::DiagMessage(container)
159*d57664e9SAndroid Build Coastguard Worker                                       << "failed to read container: " << reader.GetError());
160*d57664e9SAndroid Build Coastguard Worker       error = true;
161*d57664e9SAndroid Build Coastguard Worker       continue;
162*d57664e9SAndroid Build Coastguard Worker     }
163*d57664e9SAndroid Build Coastguard Worker 
164*d57664e9SAndroid Build Coastguard Worker     printer_->Println("AAPT2 Container (APC)");
165*d57664e9SAndroid Build Coastguard Worker     ContainerReaderEntry* entry;
166*d57664e9SAndroid Build Coastguard Worker     std::string error;
167*d57664e9SAndroid Build Coastguard Worker     while ((entry = reader.Next()) != nullptr) {
168*d57664e9SAndroid Build Coastguard Worker       if (entry->Type() == ContainerEntryType::kResTable) {
169*d57664e9SAndroid Build Coastguard Worker         printer_->Println("kResTable");
170*d57664e9SAndroid Build Coastguard Worker 
171*d57664e9SAndroid Build Coastguard Worker         pb::ResourceTable pb_table;
172*d57664e9SAndroid Build Coastguard Worker         if (!entry->GetResTable(&pb_table)) {
173*d57664e9SAndroid Build Coastguard Worker           context.GetDiagnostics()->Error(android::DiagMessage(container)
174*d57664e9SAndroid Build Coastguard Worker                                           << "failed to parse proto table: " << entry->GetError());
175*d57664e9SAndroid Build Coastguard Worker           error = true;
176*d57664e9SAndroid Build Coastguard Worker           continue;
177*d57664e9SAndroid Build Coastguard Worker         }
178*d57664e9SAndroid Build Coastguard Worker 
179*d57664e9SAndroid Build Coastguard Worker         ResourceTable table;
180*d57664e9SAndroid Build Coastguard Worker         error.clear();
181*d57664e9SAndroid Build Coastguard Worker         if (!DeserializeTableFromPb(pb_table, nullptr /*files*/, &table, &error)) {
182*d57664e9SAndroid Build Coastguard Worker           context.GetDiagnostics()->Error(android::DiagMessage(container)
183*d57664e9SAndroid Build Coastguard Worker                                           << "failed to parse table: " << error);
184*d57664e9SAndroid Build Coastguard Worker           error = true;
185*d57664e9SAndroid Build Coastguard Worker           continue;
186*d57664e9SAndroid Build Coastguard Worker         }
187*d57664e9SAndroid Build Coastguard Worker 
188*d57664e9SAndroid Build Coastguard Worker         printer_->Indent();
189*d57664e9SAndroid Build Coastguard Worker         Debug::PrintTable(table, print_options, printer_);
190*d57664e9SAndroid Build Coastguard Worker         printer_->Undent();
191*d57664e9SAndroid Build Coastguard Worker       } else if (entry->Type() == ContainerEntryType::kResFile) {
192*d57664e9SAndroid Build Coastguard Worker         printer_->Println("kResFile");
193*d57664e9SAndroid Build Coastguard Worker         pb::internal::CompiledFile pb_compiled_file;
194*d57664e9SAndroid Build Coastguard Worker         off64_t offset;
195*d57664e9SAndroid Build Coastguard Worker         size_t length;
196*d57664e9SAndroid Build Coastguard Worker         if (!entry->GetResFileOffsets(&pb_compiled_file, &offset, &length)) {
197*d57664e9SAndroid Build Coastguard Worker           context.GetDiagnostics()->Error(android::DiagMessage(container)
198*d57664e9SAndroid Build Coastguard Worker                                           << "failed to parse compiled proto file: "
199*d57664e9SAndroid Build Coastguard Worker                                           << entry->GetError());
200*d57664e9SAndroid Build Coastguard Worker           error = true;
201*d57664e9SAndroid Build Coastguard Worker           continue;
202*d57664e9SAndroid Build Coastguard Worker         }
203*d57664e9SAndroid Build Coastguard Worker 
204*d57664e9SAndroid Build Coastguard Worker         ResourceFile file;
205*d57664e9SAndroid Build Coastguard Worker         if (!DeserializeCompiledFileFromPb(pb_compiled_file, &file, &error)) {
206*d57664e9SAndroid Build Coastguard Worker           context.GetDiagnostics()->Warn(android::DiagMessage(container)
207*d57664e9SAndroid Build Coastguard Worker                                          << "failed to parse compiled file: " << error);
208*d57664e9SAndroid Build Coastguard Worker           error = true;
209*d57664e9SAndroid Build Coastguard Worker           continue;
210*d57664e9SAndroid Build Coastguard Worker         }
211*d57664e9SAndroid Build Coastguard Worker 
212*d57664e9SAndroid Build Coastguard Worker         printer_->Indent();
213*d57664e9SAndroid Build Coastguard Worker         DumpCompiledFile(file, android::Source(container), offset, length, printer_);
214*d57664e9SAndroid Build Coastguard Worker         printer_->Undent();
215*d57664e9SAndroid Build Coastguard Worker       }
216*d57664e9SAndroid Build Coastguard Worker     }
217*d57664e9SAndroid Build Coastguard Worker   }
218*d57664e9SAndroid Build Coastguard Worker 
219*d57664e9SAndroid Build Coastguard Worker   return (error) ? 1 : 0;
220*d57664e9SAndroid Build Coastguard Worker }
221*d57664e9SAndroid Build Coastguard Worker 
Action(const std::vector<std::string> & args)222*d57664e9SAndroid Build Coastguard Worker int DumpBadgerCommand::Action(const std::vector<std::string>& args) {
223*d57664e9SAndroid Build Coastguard Worker   printer_->Print(StringPrintf("%s", kBadgerData));
224*d57664e9SAndroid Build Coastguard Worker   printer_->Print("Did you mean \"aapt2 dump badging\"?\n");
225*d57664e9SAndroid Build Coastguard Worker   return 1;
226*d57664e9SAndroid Build Coastguard Worker }
227*d57664e9SAndroid Build Coastguard Worker 
Dump(LoadedApk * apk)228*d57664e9SAndroid Build Coastguard Worker int DumpConfigsCommand::Dump(LoadedApk* apk) {
229*d57664e9SAndroid Build Coastguard Worker   ResourceTable* table = apk->GetResourceTable();
230*d57664e9SAndroid Build Coastguard Worker   if (!table) {
231*d57664e9SAndroid Build Coastguard Worker     GetDiagnostics()->Error(android::DiagMessage() << "Failed to retrieve resource table");
232*d57664e9SAndroid Build Coastguard Worker     return 1;
233*d57664e9SAndroid Build Coastguard Worker   }
234*d57664e9SAndroid Build Coastguard Worker 
235*d57664e9SAndroid Build Coastguard Worker   // Comparison function used to order configurations
236*d57664e9SAndroid Build Coastguard Worker   auto compare = [](android::ConfigDescription c1, android::ConfigDescription c2) -> bool {
237*d57664e9SAndroid Build Coastguard Worker     return c1.compare(c2) < 0;
238*d57664e9SAndroid Build Coastguard Worker   };
239*d57664e9SAndroid Build Coastguard Worker 
240*d57664e9SAndroid Build Coastguard Worker   // Insert the configurations into a set in order to keep every configuarion seen
241*d57664e9SAndroid Build Coastguard Worker   std::set<android::ConfigDescription, decltype(compare)> configs(compare);
242*d57664e9SAndroid Build Coastguard Worker   for (auto& package : table->packages) {
243*d57664e9SAndroid Build Coastguard Worker     for (auto& type : package->types) {
244*d57664e9SAndroid Build Coastguard Worker       for (auto& entry : type->entries) {
245*d57664e9SAndroid Build Coastguard Worker         for (auto& value : entry->values) {
246*d57664e9SAndroid Build Coastguard Worker           configs.insert(value->config);
247*d57664e9SAndroid Build Coastguard Worker         }
248*d57664e9SAndroid Build Coastguard Worker       }
249*d57664e9SAndroid Build Coastguard Worker     }
250*d57664e9SAndroid Build Coastguard Worker   }
251*d57664e9SAndroid Build Coastguard Worker 
252*d57664e9SAndroid Build Coastguard Worker   // Print the configurations in order
253*d57664e9SAndroid Build Coastguard Worker   for (auto& config : configs) {
254*d57664e9SAndroid Build Coastguard Worker     GetPrinter()->Print(StringPrintf("%s\n", config.to_string().data()));
255*d57664e9SAndroid Build Coastguard Worker   }
256*d57664e9SAndroid Build Coastguard Worker   return 0;
257*d57664e9SAndroid Build Coastguard Worker }
258*d57664e9SAndroid Build Coastguard Worker 
Dump(LoadedApk * apk)259*d57664e9SAndroid Build Coastguard Worker int DumpPackageNameCommand::Dump(LoadedApk* apk) {
260*d57664e9SAndroid Build Coastguard Worker   auto package_name = GetPackageName(apk);
261*d57664e9SAndroid Build Coastguard Worker   if (!package_name.has_value()) {
262*d57664e9SAndroid Build Coastguard Worker     return 1;
263*d57664e9SAndroid Build Coastguard Worker   }
264*d57664e9SAndroid Build Coastguard Worker   GetPrinter()->Println(*package_name);
265*d57664e9SAndroid Build Coastguard Worker   return 0;
266*d57664e9SAndroid Build Coastguard Worker }
267*d57664e9SAndroid Build Coastguard Worker 
Dump(LoadedApk * apk)268*d57664e9SAndroid Build Coastguard Worker int DumpStringsCommand::Dump(LoadedApk* apk) {
269*d57664e9SAndroid Build Coastguard Worker   ResourceTable* table = apk->GetResourceTable();
270*d57664e9SAndroid Build Coastguard Worker   if (!table) {
271*d57664e9SAndroid Build Coastguard Worker     GetDiagnostics()->Error(android::DiagMessage() << "Failed to retrieve resource table");
272*d57664e9SAndroid Build Coastguard Worker     return 1;
273*d57664e9SAndroid Build Coastguard Worker   }
274*d57664e9SAndroid Build Coastguard Worker 
275*d57664e9SAndroid Build Coastguard Worker   // Load the run-time xml string pool using the flattened data
276*d57664e9SAndroid Build Coastguard Worker   android::BigBuffer buffer(4096);
277*d57664e9SAndroid Build Coastguard Worker   android::StringPool::FlattenUtf8(&buffer, table->string_pool, GetDiagnostics());
278*d57664e9SAndroid Build Coastguard Worker   auto data = buffer.to_string();
279*d57664e9SAndroid Build Coastguard Worker   android::ResStringPool pool(data.data(), data.size(), false);
280*d57664e9SAndroid Build Coastguard Worker   Debug::DumpResStringPool(&pool, GetPrinter());
281*d57664e9SAndroid Build Coastguard Worker   return 0;
282*d57664e9SAndroid Build Coastguard Worker }
283*d57664e9SAndroid Build Coastguard Worker 
Dump(LoadedApk * apk)284*d57664e9SAndroid Build Coastguard Worker int DumpStyleParentCommand::Dump(LoadedApk* apk) {
285*d57664e9SAndroid Build Coastguard Worker   auto package_name = GetPackageName(apk);
286*d57664e9SAndroid Build Coastguard Worker   if (!package_name.has_value()) {
287*d57664e9SAndroid Build Coastguard Worker     return 1;
288*d57664e9SAndroid Build Coastguard Worker   }
289*d57664e9SAndroid Build Coastguard Worker 
290*d57664e9SAndroid Build Coastguard Worker   const auto target_style = ResourceName(*package_name, ResourceType::kStyle, style_);
291*d57664e9SAndroid Build Coastguard Worker   const auto table = apk->GetResourceTable();
292*d57664e9SAndroid Build Coastguard Worker 
293*d57664e9SAndroid Build Coastguard Worker   if (!table) {
294*d57664e9SAndroid Build Coastguard Worker     GetDiagnostics()->Error(android::DiagMessage() << "Failed to retrieve resource table");
295*d57664e9SAndroid Build Coastguard Worker     return 1;
296*d57664e9SAndroid Build Coastguard Worker   }
297*d57664e9SAndroid Build Coastguard Worker 
298*d57664e9SAndroid Build Coastguard Worker   std::optional<ResourceTable::SearchResult> target = table->FindResource(target_style);
299*d57664e9SAndroid Build Coastguard Worker   if (!target) {
300*d57664e9SAndroid Build Coastguard Worker     GetDiagnostics()->Error(android::DiagMessage()
301*d57664e9SAndroid Build Coastguard Worker                             << "Target style \"" << target_style.entry << "\" does not exist");
302*d57664e9SAndroid Build Coastguard Worker     return 1;
303*d57664e9SAndroid Build Coastguard Worker   }
304*d57664e9SAndroid Build Coastguard Worker 
305*d57664e9SAndroid Build Coastguard Worker   Debug::PrintStyleGraph(table, target_style);
306*d57664e9SAndroid Build Coastguard Worker   return 0;
307*d57664e9SAndroid Build Coastguard Worker }
308*d57664e9SAndroid Build Coastguard Worker 
Dump(LoadedApk * apk)309*d57664e9SAndroid Build Coastguard Worker int DumpTableCommand::Dump(LoadedApk* apk) {
310*d57664e9SAndroid Build Coastguard Worker   if (apk->GetApkFormat() == ApkFormat::kProto) {
311*d57664e9SAndroid Build Coastguard Worker     GetPrinter()->Println("Proto APK");
312*d57664e9SAndroid Build Coastguard Worker   } else {
313*d57664e9SAndroid Build Coastguard Worker     GetPrinter()->Println("Binary APK");
314*d57664e9SAndroid Build Coastguard Worker   }
315*d57664e9SAndroid Build Coastguard Worker 
316*d57664e9SAndroid Build Coastguard Worker   ResourceTable* table = apk->GetResourceTable();
317*d57664e9SAndroid Build Coastguard Worker   if (!table) {
318*d57664e9SAndroid Build Coastguard Worker     GetDiagnostics()->Error(android::DiagMessage() << "Failed to retrieve resource table");
319*d57664e9SAndroid Build Coastguard Worker     return 1;
320*d57664e9SAndroid Build Coastguard Worker   }
321*d57664e9SAndroid Build Coastguard Worker 
322*d57664e9SAndroid Build Coastguard Worker   DebugPrintTableOptions print_options;
323*d57664e9SAndroid Build Coastguard Worker   print_options.show_sources = true;
324*d57664e9SAndroid Build Coastguard Worker   print_options.show_values = !no_values_;
325*d57664e9SAndroid Build Coastguard Worker   Debug::PrintTable(*table, print_options, GetPrinter());
326*d57664e9SAndroid Build Coastguard Worker   return 0;
327*d57664e9SAndroid Build Coastguard Worker }
328*d57664e9SAndroid Build Coastguard Worker 
Dump(LoadedApk * apk)329*d57664e9SAndroid Build Coastguard Worker int DumpXmlStringsCommand::Dump(LoadedApk* apk) {
330*d57664e9SAndroid Build Coastguard Worker   DumpContext context;
331*d57664e9SAndroid Build Coastguard Worker   bool error = false;
332*d57664e9SAndroid Build Coastguard Worker   for (auto xml_file : files_) {
333*d57664e9SAndroid Build Coastguard Worker     android::ResXMLTree tree;
334*d57664e9SAndroid Build Coastguard Worker 
335*d57664e9SAndroid Build Coastguard Worker     if (apk->GetApkFormat() == ApkFormat::kProto) {
336*d57664e9SAndroid Build Coastguard Worker       auto xml = apk->LoadXml(xml_file, GetDiagnostics());
337*d57664e9SAndroid Build Coastguard Worker       if (!xml) {
338*d57664e9SAndroid Build Coastguard Worker         error = true;
339*d57664e9SAndroid Build Coastguard Worker         continue;
340*d57664e9SAndroid Build Coastguard Worker       }
341*d57664e9SAndroid Build Coastguard Worker 
342*d57664e9SAndroid Build Coastguard Worker       // Flatten the xml document to get a binary representation of the proto xml file
343*d57664e9SAndroid Build Coastguard Worker       android::BigBuffer buffer(4096);
344*d57664e9SAndroid Build Coastguard Worker       XmlFlattenerOptions options = {};
345*d57664e9SAndroid Build Coastguard Worker       options.keep_raw_values = true;
346*d57664e9SAndroid Build Coastguard Worker       XmlFlattener flattener(&buffer, options);
347*d57664e9SAndroid Build Coastguard Worker       if (!flattener.Consume(&context, xml.get())) {
348*d57664e9SAndroid Build Coastguard Worker         error = true;
349*d57664e9SAndroid Build Coastguard Worker         continue;
350*d57664e9SAndroid Build Coastguard Worker       }
351*d57664e9SAndroid Build Coastguard Worker 
352*d57664e9SAndroid Build Coastguard Worker       // Load the run-time xml tree using the flattened data
353*d57664e9SAndroid Build Coastguard Worker       std::string data = buffer.to_string();
354*d57664e9SAndroid Build Coastguard Worker       tree.setTo(data.data(), data.size(), /** copyData */ true);
355*d57664e9SAndroid Build Coastguard Worker 
356*d57664e9SAndroid Build Coastguard Worker     } else if (apk->GetApkFormat() == ApkFormat::kBinary) {
357*d57664e9SAndroid Build Coastguard Worker       io::IFile* file = apk->GetFileCollection()->FindFile(xml_file);
358*d57664e9SAndroid Build Coastguard Worker       if (!file) {
359*d57664e9SAndroid Build Coastguard Worker         GetDiagnostics()->Error(android::DiagMessage(xml_file)
360*d57664e9SAndroid Build Coastguard Worker                                 << "File '" << xml_file << "' not found in APK");
361*d57664e9SAndroid Build Coastguard Worker         error = true;
362*d57664e9SAndroid Build Coastguard Worker         continue;
363*d57664e9SAndroid Build Coastguard Worker       }
364*d57664e9SAndroid Build Coastguard Worker 
365*d57664e9SAndroid Build Coastguard Worker       std::unique_ptr<io::IData> data = file->OpenAsData();
366*d57664e9SAndroid Build Coastguard Worker       if (!data) {
367*d57664e9SAndroid Build Coastguard Worker         GetDiagnostics()->Error(android::DiagMessage() << "Failed to open " << xml_file);
368*d57664e9SAndroid Build Coastguard Worker         error = true;
369*d57664e9SAndroid Build Coastguard Worker         continue;
370*d57664e9SAndroid Build Coastguard Worker       }
371*d57664e9SAndroid Build Coastguard Worker 
372*d57664e9SAndroid Build Coastguard Worker       // Load the run-time xml tree from the file data
373*d57664e9SAndroid Build Coastguard Worker       tree.setTo(data->data(), data->size(), /** copyData */ true);
374*d57664e9SAndroid Build Coastguard Worker     } else {
375*d57664e9SAndroid Build Coastguard Worker       GetDiagnostics()->Error(android::DiagMessage(apk->GetSource()) << "Unknown APK format");
376*d57664e9SAndroid Build Coastguard Worker       error = true;
377*d57664e9SAndroid Build Coastguard Worker       continue;
378*d57664e9SAndroid Build Coastguard Worker     }
379*d57664e9SAndroid Build Coastguard Worker 
380*d57664e9SAndroid Build Coastguard Worker     Debug::DumpResStringPool(&tree.getStrings(), GetPrinter());
381*d57664e9SAndroid Build Coastguard Worker   }
382*d57664e9SAndroid Build Coastguard Worker   return (error) ? 1 : 0;
383*d57664e9SAndroid Build Coastguard Worker }
384*d57664e9SAndroid Build Coastguard Worker 
Dump(LoadedApk * apk)385*d57664e9SAndroid Build Coastguard Worker int DumpXmlTreeCommand::Dump(LoadedApk* apk) {
386*d57664e9SAndroid Build Coastguard Worker   for (auto file : files_) {
387*d57664e9SAndroid Build Coastguard Worker     auto xml = apk->LoadXml(file, GetDiagnostics());
388*d57664e9SAndroid Build Coastguard Worker     if (!xml) {
389*d57664e9SAndroid Build Coastguard Worker       return 1;
390*d57664e9SAndroid Build Coastguard Worker     }
391*d57664e9SAndroid Build Coastguard Worker     Debug::DumpXml(*xml, GetPrinter());
392*d57664e9SAndroid Build Coastguard Worker   }
393*d57664e9SAndroid Build Coastguard Worker   return 0;
394*d57664e9SAndroid Build Coastguard Worker }
395*d57664e9SAndroid Build Coastguard Worker 
Dump(LoadedApk * apk)396*d57664e9SAndroid Build Coastguard Worker int DumpOverlayableCommand::Dump(LoadedApk* apk) {
397*d57664e9SAndroid Build Coastguard Worker   ResourceTable* table = apk->GetResourceTable();
398*d57664e9SAndroid Build Coastguard Worker   if (!table) {
399*d57664e9SAndroid Build Coastguard Worker     GetDiagnostics()->Error(android::DiagMessage() << "Failed to retrieve resource table");
400*d57664e9SAndroid Build Coastguard Worker     return 1;
401*d57664e9SAndroid Build Coastguard Worker   }
402*d57664e9SAndroid Build Coastguard Worker 
403*d57664e9SAndroid Build Coastguard Worker   Debug::DumpOverlayable(*table, GetPrinter());
404*d57664e9SAndroid Build Coastguard Worker   return 0;
405*d57664e9SAndroid Build Coastguard Worker }
406*d57664e9SAndroid Build Coastguard Worker 
407*d57664e9SAndroid Build Coastguard Worker const char DumpBadgerCommand::kBadgerData[2925] = {
408*d57664e9SAndroid Build Coastguard Worker     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
409*d57664e9SAndroid Build Coastguard Worker     32,  32,  32,  32,  32,  32,  95,  46,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
410*d57664e9SAndroid Build Coastguard Worker     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
411*d57664e9SAndroid Build Coastguard Worker     32,  32,  32,  32,  32,  32,  32,  10,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
412*d57664e9SAndroid Build Coastguard Worker     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  61,  63,  86,  35,  40,  46,  46,
413*d57664e9SAndroid Build Coastguard Worker     95,  95,  95,  95,  97,  97,  44,  32,  46,  124, 42,  33,  83,  62,  32,  32,  32,  32,  32,
414*d57664e9SAndroid Build Coastguard Worker     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  10,  32,  32,  32,
415*d57664e9SAndroid Build Coastguard Worker     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
416*d57664e9SAndroid Build Coastguard Worker     32,  32,  58,  46,  58,  59,  61,  59,  61,  81,  81,  81,  81,  66,  96,  61,  61,  58,  46,
417*d57664e9SAndroid Build Coastguard Worker     46,  46,  58,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
418*d57664e9SAndroid Build Coastguard Worker     32,  32,  32,  32,  10,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
419*d57664e9SAndroid Build Coastguard Worker     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  46,  61,  59,  59,  59,  58,  106, 81,  81,
420*d57664e9SAndroid Build Coastguard Worker     81,  81,  102, 59,  61,  59,  59,  61,  61,  61,  58,  46,  32,  32,  32,  32,  32,  32,  32,
421*d57664e9SAndroid Build Coastguard Worker     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  10,  32,  32,  32,  32,  32,  32,
422*d57664e9SAndroid Build Coastguard Worker     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
423*d57664e9SAndroid Build Coastguard Worker     61,  59,  59,  59,  58,  109, 81,  81,  81,  81,  61,  59,  59,  59,  59,  59,  58,  59,  59,
424*d57664e9SAndroid Build Coastguard Worker     46,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
425*d57664e9SAndroid Build Coastguard Worker     32,  10,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
426*d57664e9SAndroid Build Coastguard Worker     32,  32,  32,  32,  32,  32,  32,  46,  61,  59,  59,  59,  60,  81,  81,  81,  81,  87,  58,
427*d57664e9SAndroid Build Coastguard Worker     59,  59,  59,  59,  59,  59,  61,  119, 44,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
428*d57664e9SAndroid Build Coastguard Worker     32,  32,  32,  32,  32,  32,  32,  32,  32,  10,  32,  32,  32,  32,  32,  32,  32,  32,  32,
429*d57664e9SAndroid Build Coastguard Worker     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  46,  47,  61,  59,  59,
430*d57664e9SAndroid Build Coastguard Worker     58,  100, 81,  81,  81,  81,  35,  58,  59,  59,  59,  59,  59,  58,  121, 81,  91,  32,  32,
431*d57664e9SAndroid Build Coastguard Worker     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  10,  32,
432*d57664e9SAndroid Build Coastguard Worker     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
433*d57664e9SAndroid Build Coastguard Worker     32,  32,  32,  46,  109, 58,  59,  59,  61,  81,  81,  81,  81,  81,  109, 58,  59,  59,  59,
434*d57664e9SAndroid Build Coastguard Worker     59,  61,  109, 81,  81,  76,  46,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
435*d57664e9SAndroid Build Coastguard Worker     32,  32,  32,  32,  32,  32,  10,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
436*d57664e9SAndroid Build Coastguard Worker     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  41,  87,  59,  61,  59,  41,  81,  81,
437*d57664e9SAndroid Build Coastguard Worker     81,  81,  81,  81,  59,  61,  59,  59,  58,  109, 81,  81,  87,  39,  46,  32,  32,  32,  32,
438*d57664e9SAndroid Build Coastguard Worker     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  10,  32,  32,  32,  32,
439*d57664e9SAndroid Build Coastguard Worker     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
440*d57664e9SAndroid Build Coastguard Worker     60,  81,  91,  59,  59,  61,  81,  81,  81,  81,  81,  87,  43,  59,  58,  59,  60,  81,  81,
441*d57664e9SAndroid Build Coastguard Worker     81,  76,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
442*d57664e9SAndroid Build Coastguard Worker     32,  32,  32,  10,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
443*d57664e9SAndroid Build Coastguard Worker     32,  32,  32,  32,  32,  32,  32,  32,  32,  52,  91,  58,  45,  59,  87,  81,  81,  81,  81,
444*d57664e9SAndroid Build Coastguard Worker     70,  58,  58,  58,  59,  106, 81,  81,  81,  91,  32,  32,  32,  32,  32,  32,  32,  32,  32,
445*d57664e9SAndroid Build Coastguard Worker     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  10,  32,  32,  32,  32,  32,  32,  32,
446*d57664e9SAndroid Build Coastguard Worker     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  93,  40,
447*d57664e9SAndroid Build Coastguard Worker     32,  46,  59,  100, 81,  81,  81,  81,  40,  58,  46,  46,  58,  100, 81,  81,  68,  32,  32,
448*d57664e9SAndroid Build Coastguard Worker     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
449*d57664e9SAndroid Build Coastguard Worker     10,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  46,  46,  46,  32,  46,
450*d57664e9SAndroid Build Coastguard Worker     46,  46,  32,  46,  32,  46,  45,  91,  59,  61,  58,  109, 81,  81,  81,  87,  46,  58,  61,
451*d57664e9SAndroid Build Coastguard Worker     59,  60,  81,  81,  80,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
452*d57664e9SAndroid Build Coastguard Worker     32,  32,  32,  32,  32,  32,  32,  32,  10,  32,  32,  32,  32,  32,  32,  32,  32,  46,  46,
453*d57664e9SAndroid Build Coastguard Worker     61,  59,  61,  61,  61,  59,  61,  61,  59,  59,  59,  58,  58,  46,  46,  41,  58,  59,  58,
454*d57664e9SAndroid Build Coastguard Worker     81,  81,  81,  81,  69,  58,  59,  59,  60,  81,  81,  68,  32,  32,  32,  32,  32,  32,  32,
455*d57664e9SAndroid Build Coastguard Worker     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  10,  32,  32,
456*d57664e9SAndroid Build Coastguard Worker     32,  32,  32,  32,  58,  59,  61,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,
457*d57664e9SAndroid Build Coastguard Worker     59,  59,  61,  61,  46,  61,  59,  93,  81,  81,  81,  81,  107, 58,  59,  58,  109, 87,  68,
458*d57664e9SAndroid Build Coastguard Worker     96,  32,  32,  32,  46,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
459*d57664e9SAndroid Build Coastguard Worker     32,  32,  32,  32,  32,  10,  32,  32,  32,  46,  60,  61,  61,  59,  59,  59,  59,  59,  59,
460*d57664e9SAndroid Build Coastguard Worker     59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  58,  58,  58,  115, 109, 68,  41,  36,
461*d57664e9SAndroid Build Coastguard Worker     81,  109, 46,  61,  61,  81,  69,  96,  46,  58,  58,  46,  58,  46,  46,  32,  32,  32,  32,
462*d57664e9SAndroid Build Coastguard Worker     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  10,  46,  32,  95,  81,  67,
463*d57664e9SAndroid Build Coastguard Worker     61,  61,  58,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,
464*d57664e9SAndroid Build Coastguard Worker     59,  59,  58,  68,  39,  61,  105, 61,  63,  81,  119, 58,  106, 80,  32,  58,  61,  59,  59,
465*d57664e9SAndroid Build Coastguard Worker     61,  59,  61,  59,  61,  46,  95,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
466*d57664e9SAndroid Build Coastguard Worker     32,  32,  10,  32,  32,  36,  81,  109, 105, 59,  61,  59,  59,  59,  59,  59,  59,  59,  59,
467*d57664e9SAndroid Build Coastguard Worker     59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  46,  58,  37,  73,  108, 108, 62,  52,  81,
468*d57664e9SAndroid Build Coastguard Worker     109, 34,  32,  61,  59,  59,  59,  59,  59,  59,  59,  59,  59,  61,  59,  61,  61,  46,  46,
469*d57664e9SAndroid Build Coastguard Worker     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  10,  32,  46,  45,  57,  101, 43,  43,  61,
470*d57664e9SAndroid Build Coastguard Worker     61,  59,  59,  59,  59,  59,  59,  61,  59,  59,  59,  59,  59,  59,  59,  59,  59,  58,  97,
471*d57664e9SAndroid Build Coastguard Worker     46,  61,  108, 62,  126, 58,  106, 80,  96,  46,  61,  61,  59,  59,  59,  59,  59,  59,  59,
472*d57664e9SAndroid Build Coastguard Worker     59,  59,  59,  59,  59,  59,  61,  61,  97,  103, 97,  32,  32,  32,  32,  32,  32,  32,  10,
473*d57664e9SAndroid Build Coastguard Worker     32,  32,  32,  32,  45,  46,  32,  46,  32,  32,  32,  32,  32,  32,  32,  32,  45,  45,  45,
474*d57664e9SAndroid Build Coastguard Worker     58,  59,  59,  59,  59,  61,  119, 81,  97,  124, 105, 124, 124, 39,  126, 95,  119, 58,  61,
475*d57664e9SAndroid Build Coastguard Worker     58,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  61,  119, 81,  81,
476*d57664e9SAndroid Build Coastguard Worker     99,  32,  32,  32,  32,  32,  32,  10,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
477*d57664e9SAndroid Build Coastguard Worker     32,  32,  32,  32,  32,  32,  32,  32,  32,  58,  59,  59,  58,  106, 81,  81,  81,  109, 119,
478*d57664e9SAndroid Build Coastguard Worker     119, 119, 109, 109, 81,  81,  122, 58,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,
479*d57664e9SAndroid Build Coastguard Worker     59,  59,  59,  58,  115, 81,  87,  81,  102, 32,  32,  32,  32,  32,  32,  10,  32,  32,  32,
480*d57664e9SAndroid Build Coastguard Worker     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  61,  58,
481*d57664e9SAndroid Build Coastguard Worker     59,  61,  81,  81,  81,  81,  81,  81,  87,  87,  81,  81,  81,  81,  81,  58,  59,  59,  59,
482*d57664e9SAndroid Build Coastguard Worker     59,  59,  59,  59,  59,  58,  45,  45,  45,  59,  59,  59,  41,  87,  66,  33,  32,  32,  32,
483*d57664e9SAndroid Build Coastguard Worker     32,  32,  32,  32,  10,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
484*d57664e9SAndroid Build Coastguard Worker     32,  32,  32,  32,  32,  32,  58,  59,  59,  93,  81,  81,  81,  81,  81,  81,  81,  81,  81,
485*d57664e9SAndroid Build Coastguard Worker     81,  81,  81,  81,  40,  58,  59,  59,  59,  58,  45,  32,  46,  32,  32,  32,  32,  32,  46,
486*d57664e9SAndroid Build Coastguard Worker     32,  126, 96,  32,  32,  32,  32,  32,  32,  32,  32,  32,  10,  32,  32,  32,  32,  32,  32,
487*d57664e9SAndroid Build Coastguard Worker     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  58,  61,  59,  58,  81,
488*d57664e9SAndroid Build Coastguard Worker     81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  40,  58,  59,  59,  59,  58,  32,
489*d57664e9SAndroid Build Coastguard Worker     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
490*d57664e9SAndroid Build Coastguard Worker     32,  10,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
491*d57664e9SAndroid Build Coastguard Worker     32,  32,  32,  58,  59,  59,  58,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,
492*d57664e9SAndroid Build Coastguard Worker     81,  40,  58,  59,  59,  59,  46,  46,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
493*d57664e9SAndroid Build Coastguard Worker     32,  32,  32,  32,  32,  32,  32,  32,  32,  10,  32,  32,  32,  32,  32,  32,  32,  32,  32,
494*d57664e9SAndroid Build Coastguard Worker     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  58,  61,  59,  60,  81,  81,  81,  81,
495*d57664e9SAndroid Build Coastguard Worker     81,  81,  81,  81,  81,  81,  81,  81,  81,  59,  61,  59,  59,  61,  32,  32,  32,  32,  32,
496*d57664e9SAndroid Build Coastguard Worker     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  10,  32,
497*d57664e9SAndroid Build Coastguard Worker     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
498*d57664e9SAndroid Build Coastguard Worker     58,  59,  59,  93,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  40,  59,
499*d57664e9SAndroid Build Coastguard Worker     59,  59,  59,  32,  46,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
500*d57664e9SAndroid Build Coastguard Worker     32,  32,  32,  32,  32,  32,  10,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
501*d57664e9SAndroid Build Coastguard Worker     32,  32,  32,  32,  32,  32,  32,  32,  58,  61,  58,  106, 81,  81,  81,  81,  81,  81,  81,
502*d57664e9SAndroid Build Coastguard Worker     81,  81,  81,  81,  81,  81,  76,  58,  59,  59,  59,  32,  46,  32,  32,  32,  32,  32,  32,
503*d57664e9SAndroid Build Coastguard Worker     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  10,  32,  32,  32,  32,
504*d57664e9SAndroid Build Coastguard Worker     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  61,  58,  58,
505*d57664e9SAndroid Build Coastguard Worker     81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  87,  58,  59,  59,  59,  59,
506*d57664e9SAndroid Build Coastguard Worker     32,  46,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
507*d57664e9SAndroid Build Coastguard Worker     32,  32,  32,  10,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
508*d57664e9SAndroid Build Coastguard Worker     32,  32,  32,  32,  32,  58,  59,  61,  41,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,
509*d57664e9SAndroid Build Coastguard Worker     81,  81,  87,  59,  61,  58,  59,  59,  46,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
510*d57664e9SAndroid Build Coastguard Worker     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  10,  32,  32,  32,  32,  32,  32,  32,
511*d57664e9SAndroid Build Coastguard Worker     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  58,  61,  58,  61,  81,  81,
512*d57664e9SAndroid Build Coastguard Worker     81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  107, 58,  59,  59,  59,  59,  58,  32,  32,
513*d57664e9SAndroid Build Coastguard Worker     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
514*d57664e9SAndroid Build Coastguard Worker     10,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
515*d57664e9SAndroid Build Coastguard Worker     32,  32,  58,  59,  59,  58,  51,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  102, 94,
516*d57664e9SAndroid Build Coastguard Worker     59,  59,  59,  59,  59,  61,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
517*d57664e9SAndroid Build Coastguard Worker     32,  32,  32,  32,  32,  32,  32,  32,  10,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
518*d57664e9SAndroid Build Coastguard Worker     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  58,  61,  59,  59,  59,  43,  63,  36,  81,
519*d57664e9SAndroid Build Coastguard Worker     81,  81,  87,  64,  86,  102, 58,  59,  59,  59,  59,  59,  59,  59,  46,  32,  32,  32,  32,
520*d57664e9SAndroid Build Coastguard Worker     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  10,  32,  32,
521*d57664e9SAndroid Build Coastguard Worker     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  46,  61,
522*d57664e9SAndroid Build Coastguard Worker     59,  59,  59,  59,  59,  59,  59,  43,  33,  58,  126, 126, 58,  59,  59,  59,  59,  59,  59,
523*d57664e9SAndroid Build Coastguard Worker     59,  59,  59,  59,  32,  46,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
524*d57664e9SAndroid Build Coastguard Worker     32,  32,  32,  32,  32,  10,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
525*d57664e9SAndroid Build Coastguard Worker     32,  32,  32,  32,  32,  46,  61,  59,  59,  59,  58,  45,  58,  61,  59,  58,  58,  58,  61,
526*d57664e9SAndroid Build Coastguard Worker     59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  58,  32,  46,  32,  32,  32,  32,
527*d57664e9SAndroid Build Coastguard Worker     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  10,  32,  32,  32,  32,  32,
528*d57664e9SAndroid Build Coastguard Worker     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  46,  61,  59,  59,  59,  59,  59,
529*d57664e9SAndroid Build Coastguard Worker     58,  95,  32,  45,  61,  59,  61,  59,  59,  59,  59,  59,  59,  59,  45,  58,  59,  59,  59,
530*d57664e9SAndroid Build Coastguard Worker     59,  61,  58,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
531*d57664e9SAndroid Build Coastguard Worker     32,  32,  10,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
532*d57664e9SAndroid Build Coastguard Worker     32,  58,  61,  59,  59,  59,  59,  59,  61,  59,  61,  46,  46,  32,  45,  45,  45,  59,  58,
533*d57664e9SAndroid Build Coastguard Worker     45,  45,  46,  58,  59,  59,  59,  59,  59,  59,  61,  46,  32,  32,  32,  32,  32,  32,  32,
534*d57664e9SAndroid Build Coastguard Worker     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  10,  32,  32,  32,  32,  32,  32,  32,  32,
535*d57664e9SAndroid Build Coastguard Worker     32,  32,  32,  32,  32,  32,  32,  32,  46,  58,  59,  59,  59,  59,  59,  59,  59,  59,  59,
536*d57664e9SAndroid Build Coastguard Worker     61,  59,  46,  32,  32,  46,  32,  46,  32,  58,  61,  59,  59,  59,  59,  59,  59,  59,  59,
537*d57664e9SAndroid Build Coastguard Worker     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  10,
538*d57664e9SAndroid Build Coastguard Worker     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  45,
539*d57664e9SAndroid Build Coastguard Worker     59,  59,  59,  59,  59,  59,  59,  59,  58,  32,  32,  32,  32,  32,  32,  32,  32,  32,  61,
540*d57664e9SAndroid Build Coastguard Worker     59,  59,  59,  59,  59,  59,  59,  58,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
541*d57664e9SAndroid Build Coastguard Worker     32,  32,  32,  32,  32,  32,  32,  10,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
542*d57664e9SAndroid Build Coastguard Worker     32,  32,  32,  32,  32,  32,  32,  46,  61,  59,  59,  59,  59,  59,  59,  59,  32,  46,  32,
543*d57664e9SAndroid Build Coastguard Worker     32,  32,  32,  32,  32,  61,  46,  61,  59,  59,  59,  59,  59,  59,  58,  32,  32,  32,  32,
544*d57664e9SAndroid Build Coastguard Worker     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  10,  32,  32,  32,
545*d57664e9SAndroid Build Coastguard Worker     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  61,  59,  59,  59,
546*d57664e9SAndroid Build Coastguard Worker     59,  59,  59,  59,  59,  32,  46,  32,  32,  32,  32,  32,  32,  32,  46,  61,  58,  59,  59,
547*d57664e9SAndroid Build Coastguard Worker     59,  59,  59,  58,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
548*d57664e9SAndroid Build Coastguard Worker     32,  32,  32,  32,  10,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
549*d57664e9SAndroid Build Coastguard Worker     32,  32,  32,  32,  58,  59,  59,  59,  59,  59,  59,  59,  59,  46,  46,  32,  32,  32,  32,
550*d57664e9SAndroid Build Coastguard Worker     32,  32,  32,  61,  59,  59,  59,  59,  59,  59,  59,  45,  32,  32,  32,  32,  32,  32,  32,
551*d57664e9SAndroid Build Coastguard Worker     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  10,  32,  32,  32,  32,  32,  32,
552*d57664e9SAndroid Build Coastguard Worker     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  46,  32,  45,  61,  59,  59,  59,  59,
553*d57664e9SAndroid Build Coastguard Worker     59,  58,  32,  46,  32,  32,  32,  32,  32,  32,  32,  58,  59,  59,  59,  59,  59,  58,  45,
554*d57664e9SAndroid Build Coastguard Worker     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
555*d57664e9SAndroid Build Coastguard Worker     32,  10,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
556*d57664e9SAndroid Build Coastguard Worker     32,  32,  32,  32,  45,  45,  45,  45,  32,  46,  32,  32,  32,  32,  32,  32,  32,  32,  32,
557*d57664e9SAndroid Build Coastguard Worker     32,  45,  61,  59,  58,  45,  45,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
558*d57664e9SAndroid Build Coastguard Worker     32,  32,  32,  32,  32,  32,  32,  32,  32,  10,  32,  32,  32,  32,  32,  32,  32,  32,  32,
559*d57664e9SAndroid Build Coastguard Worker     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
560*d57664e9SAndroid Build Coastguard Worker     32,  32,  32,  32,  32,  32,  32,  32,  32,  46,  32,  32,  46,  32,  32,  32,  32,  32,  32,
561*d57664e9SAndroid Build Coastguard Worker     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  10};
562*d57664e9SAndroid Build Coastguard Worker 
Dump(LoadedApk * apk)563*d57664e9SAndroid Build Coastguard Worker int DumpChunks::Dump(LoadedApk* apk) {
564*d57664e9SAndroid Build Coastguard Worker   auto file = apk->GetFileCollection()->FindFile("resources.arsc");
565*d57664e9SAndroid Build Coastguard Worker   if (!file) {
566*d57664e9SAndroid Build Coastguard Worker     GetDiagnostics()->Error(android::DiagMessage() << "Failed to find resources.arsc in APK");
567*d57664e9SAndroid Build Coastguard Worker     return 1;
568*d57664e9SAndroid Build Coastguard Worker   }
569*d57664e9SAndroid Build Coastguard Worker 
570*d57664e9SAndroid Build Coastguard Worker   auto data = file->OpenAsData();
571*d57664e9SAndroid Build Coastguard Worker   if (!data) {
572*d57664e9SAndroid Build Coastguard Worker     GetDiagnostics()->Error(android::DiagMessage() << "Failed to open resources.arsc ");
573*d57664e9SAndroid Build Coastguard Worker     return 1;
574*d57664e9SAndroid Build Coastguard Worker   }
575*d57664e9SAndroid Build Coastguard Worker 
576*d57664e9SAndroid Build Coastguard Worker   Debug::DumpChunks(data->data(), data->size(), GetPrinter(), GetDiagnostics());
577*d57664e9SAndroid Build Coastguard Worker   return 0;
578*d57664e9SAndroid Build Coastguard Worker }
579*d57664e9SAndroid Build Coastguard Worker 
580*d57664e9SAndroid Build Coastguard Worker }  // namespace aapt
581