Ryan Mitchell 701a7fe39d Ignore resources from unknown types
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
2020-09-17 08:20:09 -07:00

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