Merge "AAPT2: Parse an ID encoded as a map" into oc-dev
am: c26ace0754
Change-Id: I5e2aba17860b27cd5f27d4b73c65775a74630881
This commit is contained in:
@@ -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 {};
|
||||
|
||||
@@ -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 << "."
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 {};
|
||||
|
||||
Reference in New Issue
Block a user