Dump.cpp revision 59e04c6f92da584b322c87072f18e6cab4de4c60
159e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski/* 259e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski * Copyright (C) 2016 The Android Open Source Project 359e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski * 459e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski * Licensed under the Apache License, Version 2.0 (the "License"); 559e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski * you may not use this file except in compliance with the License. 659e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski * You may obtain a copy of the License at 759e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski * 859e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski * http://www.apache.org/licenses/LICENSE-2.0 959e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski * 1059e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski * Unless required by applicable law or agreed to in writing, software 1159e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski * distributed under the License is distributed on an "AS IS" BASIS, 1259e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1359e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski * See the License for the specific language governing permissions and 1459e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski * limitations under the License. 1559e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski */ 1659e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski 1759e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski#include "Debug.h" 1859e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski#include "Diagnostics.h" 1959e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski#include "Flags.h" 2059e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski#include "process/IResourceTableConsumer.h" 2159e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski#include "proto/ProtoSerialize.h" 2259e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski#include "util/Files.h" 2359e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski#include "util/StringPiece.h" 2459e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski 2559e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski#include <vector> 2659e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski 2759e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinskinamespace aapt { 2859e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski 2959e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski//struct DumpOptions { 3059e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski// 3159e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski//}; 3259e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski 3359e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinskivoid dumpCompiledFile(const pb::CompiledFile& pbFile, const void* data, size_t len, 3459e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski const Source& source, IAaptContext* context) { 3559e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski std::unique_ptr<ResourceFile> file = deserializeCompiledFileFromPb(pbFile, source, 3659e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski context->getDiagnostics()); 3759e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski if (!file) { 3859e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski return; 3959e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski } 4059e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski 4159e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski std::cout << "Resource: " << file->name << "\n" 4259e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski << "Config: " << file->config << "\n" 4359e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski << "Source: " << file->source << "\n"; 4459e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski} 4559e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski 4659e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinskivoid dumpCompiledTable(const pb::ResourceTable& pbTable, const Source& source, 4759e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski IAaptContext* context) { 4859e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski std::unique_ptr<ResourceTable> table = deserializeTableFromPb(pbTable, source, 4959e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski context->getDiagnostics()); 5059e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski if (!table) { 5159e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski return; 5259e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski } 5359e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski 5459e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski Debug::printTable(table.get()); 5559e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski} 5659e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski 5759e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinskivoid tryDumpFile(IAaptContext* context, const std::string& filePath) { 5859e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski std::string err; 5959e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski Maybe<android::FileMap> file = file::mmapPath(filePath, &err); 6059e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski if (!file) { 6159e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski context->getDiagnostics()->error(DiagMessage(filePath) << err); 6259e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski return; 6359e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski } 6459e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski 6559e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski android::FileMap* fileMap = &file.value(); 6659e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski 6759e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski // Try as a compiled table. 6859e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski pb::ResourceTable pbTable; 6959e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski if (pbTable.ParseFromArray(fileMap->getDataPtr(), fileMap->getDataLength())) { 7059e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski dumpCompiledTable(pbTable, Source(filePath), context); 7159e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski return; 7259e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski } 7359e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski 7459e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski // Try as a compiled file. 7559e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski CompiledFileInputStream input(fileMap->getDataPtr(), fileMap->getDataLength()); 7659e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski if (const pb::CompiledFile* pbFile = input.CompiledFile()) { 7759e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski dumpCompiledFile(*pbFile, input.data(), input.size(), Source(filePath), context); 7859e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski return; 7959e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski } 8059e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski} 8159e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski 8259e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinskiclass DumpContext : public IAaptContext { 8359e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinskipublic: 8459e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski IDiagnostics* getDiagnostics() override { 8559e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski return &mDiagnostics; 8659e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski } 8759e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski 8859e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski NameMangler* getNameMangler() override { 8959e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski abort(); 9059e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski return nullptr; 9159e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski } 9259e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski 9359e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski StringPiece16 getCompilationPackage() override { 9459e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski return {}; 9559e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski } 9659e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski 9759e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski uint8_t getPackageId() override { 9859e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski return 0; 9959e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski } 10059e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski 10159e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski ISymbolTable* getExternalSymbols() override { 10259e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski abort(); 10359e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski return nullptr; 10459e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski } 10559e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski 10659e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinskiprivate: 10759e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski StdErrDiagnostics mDiagnostics; 10859e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski}; 10959e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski 11059e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski/** 11159e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski * Entry point for dump command. 11259e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski */ 11359e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinskiint dump(const std::vector<StringPiece>& args) { 11459e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski //DumpOptions options; 11559e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski Flags flags = Flags(); 11659e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski if (!flags.parse("aapt2 dump", args, &std::cerr)) { 11759e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski return 1; 11859e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski } 11959e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski 12059e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski DumpContext context; 12159e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski 12259e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski for (const std::string& arg : flags.getArgs()) { 12359e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski tryDumpFile(&context, arg); 12459e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski } 12559e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski return 0; 12659e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski} 12759e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski 12859e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski} // namespace aapt 129