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