Merge "AAPT2: Parse an ID encoded as a map" into oc-dev

am: c26ace0754

Change-Id: I5e2aba17860b27cd5f27d4b73c65775a74630881
This commit is contained in:
Adam Lesinski
2017-03-30 00:36:24 +00:00
committed by android-build-merger
4 changed files with 23 additions and 6 deletions

View File

@@ -416,7 +416,9 @@ std::unique_ptr<LoadedPackage> LoadedPackage::Load(const Chunk& chunk) {
ATRACE_CALL();
std::unique_ptr<LoadedPackage> loaded_package{new LoadedPackage()};
const ResTable_package* header = chunk.header<ResTable_package>();
constexpr size_t kMinPackageSize =
sizeof(ResTable_package) - sizeof(ResTable_package::typeIdOffset);
const ResTable_package* header = chunk.header<ResTable_package, kMinPackageSize>();
if (header == nullptr) {
LOG(ERROR) << "Chunk RES_TABLE_PACKAGE_TYPE is too small.";
return {};

View File

@@ -25,7 +25,7 @@ namespace aapt {
static const char* sMajorVersion = "2";
// Update minor version whenever a feature or flag is added.
static const char* sMinorVersion = "11";
static const char* sMinorVersion = "12";
int PrintVersion() {
std::cerr << "Android Asset Packaging Tool (aapt) " << sMajorVersion << "."

View File

@@ -1,5 +1,13 @@
# Android Asset Packaging Tool 2.0 (AAPT2) release notes
## Version 2.12
### `aapt2 optimize ...`
- aapt2 optimize now understands map (complex) values under the type `id`. It ignores their
contents and interprets them as a sentinel `id` type. This was added to support existing
apps that build with their `id` types as map values.
AAPT and AAPT2 always generate a simple value for the type `ID`, so it is unclear how some
these apps are encoded.
## Version 2.11
### `aapt2 link ...`
- Adds the ability to specify assets directories with the -A parameter. Assets work just like

View File

@@ -168,10 +168,11 @@ bool BinaryResourceParser::ParseTable(const ResChunk_header* chunk) {
}
bool BinaryResourceParser::ParsePackage(const ResChunk_header* chunk) {
const ResTable_package* package_header = ConvertTo<ResTable_package>(chunk);
constexpr size_t kMinPackageSize =
sizeof(ResTable_package) - sizeof(ResTable_package::typeIdOffset);
const ResTable_package* package_header = ConvertTo<ResTable_package, kMinPackageSize>(chunk);
if (!package_header) {
context_->GetDiagnostics()->Error(DiagMessage(source_)
<< "corrupt ResTable_package chunk");
context_->GetDiagnostics()->Error(DiagMessage(source_) << "corrupt ResTable_package chunk");
return false;
}
@@ -498,8 +499,14 @@ std::unique_ptr<Value> BinaryResourceParser::ParseMapEntry(
return ParseArray(name, config, map);
case ResourceType::kPlurals:
return ParsePlural(name, config, map);
case ResourceType::kId:
// Special case: An ID is not a bag, but some apps have defined the auto-generated
// IDs that come from declaring an enum value in an attribute as an empty map...
// We can ignore the value here.
return util::make_unique<Id>();
default:
LOG(FATAL) << "unknown map type";
context_->GetDiagnostics()->Error(DiagMessage() << "illegal map type '" << ToString(name.type)
<< "' (" << (int)name.type << ")");
break;
}
return {};