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