summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Adam Lesinski <adamlesinski@google.com> 2014-08-14 13:53:34 -0700
committer Adam Lesinski <adamlesinski@google.com> 2014-08-14 21:20:41 +0000
commite23a91e2bdab06e3c0c64201e88e50ab76c6b74b (patch)
treeaba593b1c33e6f76fc7efca40e50a976dbff4480
parent0204938659d93347081caec107661ea3734f1a65 (diff)
Fix aapt dump for APKs with no resources
All APKs are expected to have at least one resource table (even if it is empty). We were missing the creation of an empty DynamicRefTable. Bug:16895517 Change-Id: I6a6e887f91b3b4bbcc52b3fd2741ef3d05fab1fd
-rw-r--r--libs/androidfw/ResourceTypes.cpp25
-rw-r--r--libs/androidfw/tests/ResTable_test.cpp17
2 files changed, 25 insertions, 17 deletions
diff --git a/libs/androidfw/ResourceTypes.cpp b/libs/androidfw/ResourceTypes.cpp
index 7661d586bcf4..71a7c0a42084 100644
--- a/libs/androidfw/ResourceTypes.cpp
+++ b/libs/androidfw/ResourceTypes.cpp
@@ -2852,17 +2852,16 @@ struct ResTable::Type
struct ResTable::Package
{
Package(ResTable* _owner, const Header* _header, const ResTable_package* _package)
- : owner(_owner), header(_header), package(_package), typeIdOffset(0) {
- if (dtohs(package->header.headerSize) == sizeof(package)) {
+ : owner(_owner), header(_header), typeIdOffset(0) {
+ if (_package != NULL && dtohs(_package->header.headerSize) == sizeof(_package)) {
// The package structure is the same size as the definition.
// This means it contains the typeIdOffset field.
- typeIdOffset = package->typeIdOffset;
+ typeIdOffset = _package->typeIdOffset;
}
}
const ResTable* const owner;
const Header* const header;
- const ResTable_package* const package;
ResStringPool typeStrings;
ResStringPool keyStrings;
@@ -3361,6 +3360,10 @@ status_t ResTable::addEmpty(const int32_t cookie) {
header->header = (const ResTable_header*) resHeader;
mHeaders.add(header);
+
+ PackageGroup* pg = new PackageGroup(this, String16(), 0);
+ pg->packages.add(new Package(this, header, NULL));
+ mPackageGroups.add(pg);
return (mError=NO_ERROR);
}
@@ -5929,7 +5932,7 @@ status_t ResTable::createIdmap(const ResTable& overlay,
*outSize += 2 * sizeof(uint16_t);
// overlay packages are assumed to contain only one package group
- const String16 overlayPackage(overlay.mPackageGroups[0]->packages[0]->package->name);
+ const String16 overlayPackage(overlay.mPackageGroups[0]->name);
for (size_t typeIndex = 0; typeIndex < pg->types.size(); ++typeIndex) {
const TypeList& typeList = pg->types[typeIndex];
@@ -6204,11 +6207,6 @@ void ResTable::print(bool inclValues) const
if (mError != 0) {
printf("mError=0x%x (%s)\n", mError, strerror(mError));
}
-#if 0
- char localeStr[RESTABLE_MAX_LOCALE_LEN];
- mParams.getBcp47Locale(localeStr);
- printf("mParams=%s,\n" localeStr);
-#endif
size_t pgCount = mPackageGroups.size();
printf("Package Groups (%d)\n", (int)pgCount);
for (size_t pgIndex=0; pgIndex<pgCount; pgIndex++) {
@@ -6217,13 +6215,6 @@ void ResTable::print(bool inclValues) const
(int)pgIndex, pg->id, (int)pg->packages.size(),
String8(pg->name).string());
- size_t pkgCount = pg->packages.size();
- for (size_t pkgIndex=0; pkgIndex<pkgCount; pkgIndex++) {
- const Package* pkg = pg->packages[pkgIndex];
- printf(" Package %d id=%d name=%s\n", (int)pkgIndex,
- pkg->package->id, String8(String16(pkg->package->name)).string());
- }
-
for (size_t typeIndex=0; typeIndex < pg->types.size(); typeIndex++) {
const TypeList& typeList = pg->types[typeIndex];
if (typeList.isEmpty()) {
diff --git a/libs/androidfw/tests/ResTable_test.cpp b/libs/androidfw/tests/ResTable_test.cpp
index 8016a82bd248..68c228e0de72 100644
--- a/libs/androidfw/tests/ResTable_test.cpp
+++ b/libs/androidfw/tests/ResTable_test.cpp
@@ -195,4 +195,21 @@ TEST(ResTableTest, resourceIsOverridenWithBetterConfig) {
ASSERT_EQ(uint32_t(400), val.data);
}
+TEST(ResTableTest, emptyTableHasSensibleDefaults) {
+ const int32_t expectedCookie = 1;
+
+ ResTable table;
+ ASSERT_EQ(NO_ERROR, table.addEmpty(expectedCookie));
+
+ ASSERT_EQ(uint32_t(1), table.getTableCount());
+ ASSERT_EQ(uint32_t(1), table.getBasePackageCount());
+ ASSERT_EQ(expectedCookie, table.getTableCookie(0));
+
+ const DynamicRefTable* dynamicRefTable = table.getDynamicRefTableForCookie(expectedCookie);
+ ASSERT_TRUE(dynamicRefTable != NULL);
+
+ Res_value val;
+ ASSERT_LT(table.getResource(base::R::integer::number1, &val, MAY_NOT_BE_BAG), 0);
+}
+
}