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

This commit is contained in:
Adam Lesinski
2017-03-30 00:30:58 +00:00
committed by Android (Google) Code Review
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(); ATRACE_CALL();
std::unique_ptr<LoadedPackage> loaded_package{new LoadedPackage()}; 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) { if (header == nullptr) {
LOG(ERROR) << "Chunk RES_TABLE_PACKAGE_TYPE is too small."; LOG(ERROR) << "Chunk RES_TABLE_PACKAGE_TYPE is too small.";
return {}; return {};

View File

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

View File

@@ -1,5 +1,13 @@
# Android Asset Packaging Tool 2.0 (AAPT2) release notes # 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 ## Version 2.11
### `aapt2 link ...` ### `aapt2 link ...`
- Adds the ability to specify assets directories with the -A parameter. Assets work just like - 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) { 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) { if (!package_header) {
context_->GetDiagnostics()->Error(DiagMessage(source_) context_->GetDiagnostics()->Error(DiagMessage(source_) << "corrupt ResTable_package chunk");
<< "corrupt ResTable_package chunk");
return false; return false;
} }
@@ -498,8 +499,14 @@ std::unique_ptr<Value> BinaryResourceParser::ParseMapEntry(
return ParseArray(name, config, map); return ParseArray(name, config, map);
case ResourceType::kPlurals: case ResourceType::kPlurals:
return ParsePlural(name, config, map); 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: default:
LOG(FATAL) << "unknown map type"; context_->GetDiagnostics()->Error(DiagMessage() << "illegal map type '" << ToString(name.type)
<< "' (" << (int)name.type << ")");
break; break;
} }
return {}; return {};