Loading tools/aapt/Resource.cpp +2 −4 Original line number Original line Diff line number Diff line Loading @@ -475,10 +475,8 @@ static bool applyFileOverlay(const sp<AaptAssets>& assets, } } } else { } else { // this group doesn't exist (a file that's only in the overlay) // this group doesn't exist (a file that's only in the overlay) fprintf(stderr, "aapt: error: " baseSet->add(overlaySet->keyAt(overlayIndex), "*** Resource file '%s' exists only in an overlay\n", overlaySet->valueAt(overlayIndex)); overlaySet->keyAt(overlayIndex).string()); return false; } } } } // this overlay didn't have resources for this type // this overlay didn't have resources for this type Loading tools/aapt/ResourceTable.cpp +64 −6 Original line number Original line Diff line number Diff line Loading @@ -663,6 +663,7 @@ status_t compileResourceFile(Bundle* bundle, const String16 public16("public"); const String16 public16("public"); const String16 public_padding16("public-padding"); const String16 public_padding16("public-padding"); const String16 private_symbols16("private-symbols"); const String16 private_symbols16("private-symbols"); const String16 add_resource16("add-resource"); const String16 skip16("skip"); const String16 skip16("skip"); const String16 eat_comment16("eat-comment"); const String16 eat_comment16("eat-comment"); Loading Loading @@ -960,6 +961,36 @@ status_t compileResourceFile(Bundle* bundle, } } continue; continue; } else if (strcmp16(block.getElementName(&len), add_resource16.string()) == 0) { SourcePos srcPos(in->getPrintableSource(), block.getLineNumber()); String16 typeName; ssize_t typeIdx = block.indexOfAttribute(NULL, "type"); if (typeIdx < 0) { srcPos.error("A 'type' attribute is required for <add-resource>\n"); hasErrors = localHasErrors = true; } typeName = String16(block.getAttributeStringValue(typeIdx, &len)); String16 name; ssize_t nameIdx = block.indexOfAttribute(NULL, "name"); if (nameIdx < 0) { srcPos.error("A 'name' attribute is required for <add-resource>\n"); hasErrors = localHasErrors = true; } name = String16(block.getAttributeStringValue(nameIdx, &len)); outTable->canAddEntry(srcPos, myPackage, typeName, name); while ((code=block.next()) != ResXMLTree::END_DOCUMENT && code != ResXMLTree::BAD_DOCUMENT) { if (code == ResXMLTree::END_TAG) { if (strcmp16(block.getElementName(&len), private_symbols16.string()) == 0) { break; } } } continue; } else if (strcmp16(block.getElementName(&len), declare_styleable16.string()) == 0) { } else if (strcmp16(block.getElementName(&len), declare_styleable16.string()) == 0) { SourcePos srcPos(in->getPrintableSource(), block.getLineNumber()); SourcePos srcPos(in->getPrintableSource(), block.getLineNumber()); Loading Loading @@ -1557,10 +1588,22 @@ status_t ResourceTable::startBag(const SourcePos& sourcePos, } } #endif #endif if (overlay && !hasBagOrEntry(package, type, name)) { if (overlay && !hasBagOrEntry(package, type, name)) { sourcePos.error("Can't add new bags in an overlay. See '%s'\n", bool canAdd = false; sp<Package> p = mPackages.valueFor(package); if (p != NULL) { sp<Type> t = p->getTypes().valueFor(type); if (t != NULL) { if (t->getCanAddEntries().indexOf(name) >= 0) { canAdd = true; } } } if (!canAdd) { sourcePos.error("Resource does not already exist in overlay at '%s'; use <add-resource> to add.\n", String8(name).string()); String8(name).string()); return UNKNOWN_ERROR; return UNKNOWN_ERROR; } } } sp<Entry> e = getEntry(package, type, name, sourcePos, overlay, params); sp<Entry> e = getEntry(package, type, name, sourcePos, overlay, params); if (e == NULL) { if (e == NULL) { return UNKNOWN_ERROR; return UNKNOWN_ERROR; Loading Loading @@ -1724,6 +1767,15 @@ bool ResourceTable::appendTypeComment(const String16& package, return false; return false; } } void ResourceTable::canAddEntry(const SourcePos& pos, const String16& package, const String16& type, const String16& name) { sp<Type> t = getType(package, type, pos); if (t != NULL) { t->canAddEntry(name); } } size_t ResourceTable::size() const { size_t ResourceTable::size() const { return mPackages.size(); return mPackages.size(); } } Loading Loading @@ -3215,6 +3267,11 @@ status_t ResourceTable::Type::addPublic(const SourcePos& sourcePos, return NO_ERROR; return NO_ERROR; } } void ResourceTable::Type::canAddEntry(const String16& name) { mCanAddEntries.add(name); } sp<ResourceTable::Entry> ResourceTable::Type::getEntry(const String16& entry, sp<ResourceTable::Entry> ResourceTable::Type::getEntry(const String16& entry, const SourcePos& sourcePos, const SourcePos& sourcePos, const ResTable_config* config, const ResTable_config* config, Loading @@ -3224,9 +3281,10 @@ sp<ResourceTable::Entry> ResourceTable::Type::getEntry(const String16& entry, int pos = -1; int pos = -1; sp<ConfigList> c = mConfigs.valueFor(entry); sp<ConfigList> c = mConfigs.valueFor(entry); if (c == NULL) { if (c == NULL) { if (overlay == true) { if (overlay == true && mCanAddEntries.indexOf(entry) < 0) { sourcePos.error("Resource %s appears in overlay but not" sourcePos.error("Resource at %s appears in overlay but not" " in the base package.\n", String8(entry).string()); " in the base package; use <add-resource> to add.\n", String8(entry).string()); return NULL; return NULL; } } c = new ConfigList(entry, sourcePos); c = new ConfigList(entry, sourcePos); Loading tools/aapt/ResourceTable.h +9 −1 Original line number Original line Diff line number Diff line Loading @@ -132,6 +132,9 @@ public: const String16& name, const String16& name, const String16& comment); const String16& comment); void canAddEntry(const SourcePos& pos, const String16& package, const String16& type, const String16& name); size_t size() const; size_t size() const; size_t numLocalResources() const; size_t numLocalResources() const; bool hasResources() const; bool hasResources() const; Loading Loading @@ -414,6 +417,8 @@ public: const String16& name, const String16& name, const uint32_t ident); const uint32_t ident); void canAddEntry(const String16& name); String16 getName() const { return mName; } String16 getName() const { return mName; } sp<Entry> getEntry(const String16& entry, sp<Entry> getEntry(const String16& entry, const SourcePos& pos, const SourcePos& pos, Loading @@ -435,6 +440,8 @@ public: const DefaultKeyedVector<String16, sp<ConfigList> >& getConfigs() const { return mConfigs; } const DefaultKeyedVector<String16, sp<ConfigList> >& getConfigs() const { return mConfigs; } const Vector<sp<ConfigList> >& getOrderedConfigs() const { return mOrderedConfigs; } const Vector<sp<ConfigList> >& getOrderedConfigs() const { return mOrderedConfigs; } const SortedVector<String16>& getCanAddEntries() const { return mCanAddEntries; } const SourcePos& getPos() const { return mPos; } const SourcePos& getPos() const { return mPos; } private: private: String16 mName; String16 mName; Loading @@ -443,6 +450,7 @@ public: SortedVector<ConfigDescription> mUniqueConfigs; SortedVector<ConfigDescription> mUniqueConfigs; DefaultKeyedVector<String16, sp<ConfigList> > mConfigs; DefaultKeyedVector<String16, sp<ConfigList> > mConfigs; Vector<sp<ConfigList> > mOrderedConfigs; Vector<sp<ConfigList> > mOrderedConfigs; SortedVector<String16> mCanAddEntries; int32_t mPublicIndex; int32_t mPublicIndex; int32_t mIndex; int32_t mIndex; SourcePos mPos; SourcePos mPos; Loading Loading
tools/aapt/Resource.cpp +2 −4 Original line number Original line Diff line number Diff line Loading @@ -475,10 +475,8 @@ static bool applyFileOverlay(const sp<AaptAssets>& assets, } } } else { } else { // this group doesn't exist (a file that's only in the overlay) // this group doesn't exist (a file that's only in the overlay) fprintf(stderr, "aapt: error: " baseSet->add(overlaySet->keyAt(overlayIndex), "*** Resource file '%s' exists only in an overlay\n", overlaySet->valueAt(overlayIndex)); overlaySet->keyAt(overlayIndex).string()); return false; } } } } // this overlay didn't have resources for this type // this overlay didn't have resources for this type Loading
tools/aapt/ResourceTable.cpp +64 −6 Original line number Original line Diff line number Diff line Loading @@ -663,6 +663,7 @@ status_t compileResourceFile(Bundle* bundle, const String16 public16("public"); const String16 public16("public"); const String16 public_padding16("public-padding"); const String16 public_padding16("public-padding"); const String16 private_symbols16("private-symbols"); const String16 private_symbols16("private-symbols"); const String16 add_resource16("add-resource"); const String16 skip16("skip"); const String16 skip16("skip"); const String16 eat_comment16("eat-comment"); const String16 eat_comment16("eat-comment"); Loading Loading @@ -960,6 +961,36 @@ status_t compileResourceFile(Bundle* bundle, } } continue; continue; } else if (strcmp16(block.getElementName(&len), add_resource16.string()) == 0) { SourcePos srcPos(in->getPrintableSource(), block.getLineNumber()); String16 typeName; ssize_t typeIdx = block.indexOfAttribute(NULL, "type"); if (typeIdx < 0) { srcPos.error("A 'type' attribute is required for <add-resource>\n"); hasErrors = localHasErrors = true; } typeName = String16(block.getAttributeStringValue(typeIdx, &len)); String16 name; ssize_t nameIdx = block.indexOfAttribute(NULL, "name"); if (nameIdx < 0) { srcPos.error("A 'name' attribute is required for <add-resource>\n"); hasErrors = localHasErrors = true; } name = String16(block.getAttributeStringValue(nameIdx, &len)); outTable->canAddEntry(srcPos, myPackage, typeName, name); while ((code=block.next()) != ResXMLTree::END_DOCUMENT && code != ResXMLTree::BAD_DOCUMENT) { if (code == ResXMLTree::END_TAG) { if (strcmp16(block.getElementName(&len), private_symbols16.string()) == 0) { break; } } } continue; } else if (strcmp16(block.getElementName(&len), declare_styleable16.string()) == 0) { } else if (strcmp16(block.getElementName(&len), declare_styleable16.string()) == 0) { SourcePos srcPos(in->getPrintableSource(), block.getLineNumber()); SourcePos srcPos(in->getPrintableSource(), block.getLineNumber()); Loading Loading @@ -1557,10 +1588,22 @@ status_t ResourceTable::startBag(const SourcePos& sourcePos, } } #endif #endif if (overlay && !hasBagOrEntry(package, type, name)) { if (overlay && !hasBagOrEntry(package, type, name)) { sourcePos.error("Can't add new bags in an overlay. See '%s'\n", bool canAdd = false; sp<Package> p = mPackages.valueFor(package); if (p != NULL) { sp<Type> t = p->getTypes().valueFor(type); if (t != NULL) { if (t->getCanAddEntries().indexOf(name) >= 0) { canAdd = true; } } } if (!canAdd) { sourcePos.error("Resource does not already exist in overlay at '%s'; use <add-resource> to add.\n", String8(name).string()); String8(name).string()); return UNKNOWN_ERROR; return UNKNOWN_ERROR; } } } sp<Entry> e = getEntry(package, type, name, sourcePos, overlay, params); sp<Entry> e = getEntry(package, type, name, sourcePos, overlay, params); if (e == NULL) { if (e == NULL) { return UNKNOWN_ERROR; return UNKNOWN_ERROR; Loading Loading @@ -1724,6 +1767,15 @@ bool ResourceTable::appendTypeComment(const String16& package, return false; return false; } } void ResourceTable::canAddEntry(const SourcePos& pos, const String16& package, const String16& type, const String16& name) { sp<Type> t = getType(package, type, pos); if (t != NULL) { t->canAddEntry(name); } } size_t ResourceTable::size() const { size_t ResourceTable::size() const { return mPackages.size(); return mPackages.size(); } } Loading Loading @@ -3215,6 +3267,11 @@ status_t ResourceTable::Type::addPublic(const SourcePos& sourcePos, return NO_ERROR; return NO_ERROR; } } void ResourceTable::Type::canAddEntry(const String16& name) { mCanAddEntries.add(name); } sp<ResourceTable::Entry> ResourceTable::Type::getEntry(const String16& entry, sp<ResourceTable::Entry> ResourceTable::Type::getEntry(const String16& entry, const SourcePos& sourcePos, const SourcePos& sourcePos, const ResTable_config* config, const ResTable_config* config, Loading @@ -3224,9 +3281,10 @@ sp<ResourceTable::Entry> ResourceTable::Type::getEntry(const String16& entry, int pos = -1; int pos = -1; sp<ConfigList> c = mConfigs.valueFor(entry); sp<ConfigList> c = mConfigs.valueFor(entry); if (c == NULL) { if (c == NULL) { if (overlay == true) { if (overlay == true && mCanAddEntries.indexOf(entry) < 0) { sourcePos.error("Resource %s appears in overlay but not" sourcePos.error("Resource at %s appears in overlay but not" " in the base package.\n", String8(entry).string()); " in the base package; use <add-resource> to add.\n", String8(entry).string()); return NULL; return NULL; } } c = new ConfigList(entry, sourcePos); c = new ConfigList(entry, sourcePos); Loading
tools/aapt/ResourceTable.h +9 −1 Original line number Original line Diff line number Diff line Loading @@ -132,6 +132,9 @@ public: const String16& name, const String16& name, const String16& comment); const String16& comment); void canAddEntry(const SourcePos& pos, const String16& package, const String16& type, const String16& name); size_t size() const; size_t size() const; size_t numLocalResources() const; size_t numLocalResources() const; bool hasResources() const; bool hasResources() const; Loading Loading @@ -414,6 +417,8 @@ public: const String16& name, const String16& name, const uint32_t ident); const uint32_t ident); void canAddEntry(const String16& name); String16 getName() const { return mName; } String16 getName() const { return mName; } sp<Entry> getEntry(const String16& entry, sp<Entry> getEntry(const String16& entry, const SourcePos& pos, const SourcePos& pos, Loading @@ -435,6 +440,8 @@ public: const DefaultKeyedVector<String16, sp<ConfigList> >& getConfigs() const { return mConfigs; } const DefaultKeyedVector<String16, sp<ConfigList> >& getConfigs() const { return mConfigs; } const Vector<sp<ConfigList> >& getOrderedConfigs() const { return mOrderedConfigs; } const Vector<sp<ConfigList> >& getOrderedConfigs() const { return mOrderedConfigs; } const SortedVector<String16>& getCanAddEntries() const { return mCanAddEntries; } const SourcePos& getPos() const { return mPos; } const SourcePos& getPos() const { return mPos; } private: private: String16 mName; String16 mName; Loading @@ -443,6 +450,7 @@ public: SortedVector<ConfigDescription> mUniqueConfigs; SortedVector<ConfigDescription> mUniqueConfigs; DefaultKeyedVector<String16, sp<ConfigList> > mConfigs; DefaultKeyedVector<String16, sp<ConfigList> > mConfigs; Vector<sp<ConfigList> > mOrderedConfigs; Vector<sp<ConfigList> > mOrderedConfigs; SortedVector<String16> mCanAddEntries; int32_t mPublicIndex; int32_t mPublicIndex; int32_t mIndex; int32_t mIndex; SourcePos mPos; SourcePos mPos; Loading