701a7fe39d
When loading binary APKs into aapt2 for dumping purposes, aapt2 allows the presence of custom resource types in the resources.arsc. Since apapt2 may not be able to correctly interpret the data of custom types, ignore resources from custom types completely when constructing the ResourceTable data structure for the APK. Bug: 168247188 Bug: 36051266 Test: run aapt2 dump bading/resources on APKs from both bugs Merged-In: Ia3c0b4e07457eb8634b5a256ef77270e99b8bd72 Change-Id: Ia3c0b4e07457eb8634b5a256ef77270e99b8bd72
151 lines
4.3 KiB
C++
151 lines
4.3 KiB
C++
/*
|
|
* Copyright (C) 2015 The Android Open Source Project
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
#include "Resource.h"
|
|
|
|
#include <map>
|
|
#include <sstream>
|
|
#include <string>
|
|
|
|
#include "android-base/stringprintf.h"
|
|
|
|
using ::android::StringPiece;
|
|
using ::android::base::StringPrintf;
|
|
|
|
namespace aapt {
|
|
|
|
std::string ResourceId::to_string() const {
|
|
return StringPrintf("0x%08x", id);
|
|
}
|
|
|
|
std::string ResourceName::to_string() const {
|
|
return ResourceNameRef(*this).to_string();
|
|
}
|
|
|
|
std::string ResourceNameRef::to_string() const {
|
|
std::ostringstream str_stream;
|
|
if (!package.empty()) {
|
|
str_stream << package << ":";
|
|
}
|
|
str_stream << type << "/" << entry;
|
|
return str_stream.str();
|
|
}
|
|
|
|
StringPiece to_string(ResourceType type) {
|
|
switch (type) {
|
|
case ResourceType::kAnim:
|
|
return "anim";
|
|
case ResourceType::kAnimator:
|
|
return "animator";
|
|
case ResourceType::kArray:
|
|
return "array";
|
|
case ResourceType::kAttr:
|
|
return "attr";
|
|
case ResourceType::kAttrPrivate:
|
|
return "^attr-private";
|
|
case ResourceType::kBool:
|
|
return "bool";
|
|
case ResourceType::kColor:
|
|
return "color";
|
|
case ResourceType::kConfigVarying:
|
|
return "configVarying";
|
|
case ResourceType::kDimen:
|
|
return "dimen";
|
|
case ResourceType::kDrawable:
|
|
return "drawable";
|
|
case ResourceType::kFont:
|
|
return "font";
|
|
case ResourceType::kFraction:
|
|
return "fraction";
|
|
case ResourceType::kId:
|
|
return "id";
|
|
case ResourceType::kInteger:
|
|
return "integer";
|
|
case ResourceType::kInterpolator:
|
|
return "interpolator";
|
|
case ResourceType::kLayout:
|
|
return "layout";
|
|
case ResourceType::kMenu:
|
|
return "menu";
|
|
case ResourceType::kMipmap:
|
|
return "mipmap";
|
|
case ResourceType::kNavigation:
|
|
return "navigation";
|
|
case ResourceType::kPlurals:
|
|
return "plurals";
|
|
case ResourceType::kRaw:
|
|
return "raw";
|
|
case ResourceType::kString:
|
|
return "string";
|
|
case ResourceType::kStyle:
|
|
return "style";
|
|
case ResourceType::kStyleable:
|
|
return "styleable";
|
|
case ResourceType::kTransition:
|
|
return "transition";
|
|
case ResourceType::kXml:
|
|
return "xml";
|
|
}
|
|
return {};
|
|
}
|
|
|
|
static const std::map<StringPiece, ResourceType> sResourceTypeMap{
|
|
{"anim", ResourceType::kAnim},
|
|
{"animator", ResourceType::kAnimator},
|
|
{"array", ResourceType::kArray},
|
|
{"attr", ResourceType::kAttr},
|
|
{"^attr-private", ResourceType::kAttrPrivate},
|
|
{"bool", ResourceType::kBool},
|
|
{"color", ResourceType::kColor},
|
|
{"configVarying", ResourceType::kConfigVarying},
|
|
{"dimen", ResourceType::kDimen},
|
|
{"drawable", ResourceType::kDrawable},
|
|
{"font", ResourceType::kFont},
|
|
{"fraction", ResourceType::kFraction},
|
|
{"id", ResourceType::kId},
|
|
{"integer", ResourceType::kInteger},
|
|
{"interpolator", ResourceType::kInterpolator},
|
|
{"layout", ResourceType::kLayout},
|
|
{"menu", ResourceType::kMenu},
|
|
{"mipmap", ResourceType::kMipmap},
|
|
{"navigation", ResourceType::kNavigation},
|
|
{"plurals", ResourceType::kPlurals},
|
|
{"raw", ResourceType::kRaw},
|
|
{"string", ResourceType::kString},
|
|
{"style", ResourceType::kStyle},
|
|
{"styleable", ResourceType::kStyleable},
|
|
{"transition", ResourceType::kTransition},
|
|
{"xml", ResourceType::kXml},
|
|
};
|
|
|
|
const ResourceType* ParseResourceType(const StringPiece& str) {
|
|
auto iter = sResourceTypeMap.find(str);
|
|
if (iter == std::end(sResourceTypeMap)) {
|
|
return nullptr;
|
|
}
|
|
return &iter->second;
|
|
}
|
|
|
|
bool operator<(const ResourceKey& a, const ResourceKey& b) {
|
|
return std::tie(a.name, a.config) < std::tie(b.name, b.config);
|
|
}
|
|
|
|
bool operator<(const ResourceKeyRef& a, const ResourceKeyRef& b) {
|
|
return std::tie(a.name, a.config) < std::tie(b.name, b.config);
|
|
}
|
|
|
|
} // namespace aapt
|