X-Git-Url: https://git.saurik.com/android/aapt.git/blobdiff_plain/e0b7b47c23c876d1c27b30bc4e5742e7afb81807..17f321193829cfb0d99b4d839d32e8904e013cb1:/Resource.cpp diff --git a/Resource.cpp b/Resource.cpp index a52a9de..77168f9 100644 --- a/Resource.cpp +++ b/Resource.cpp @@ -2415,7 +2415,7 @@ struct NamespaceAttributePair { status_t writeProguardForXml(ProguardKeepSet* keep, const sp& layoutFile, - const char* startTag, const KeyedVector* tagAttrPairs) + const char* startTag, const KeyedVector >* tagAttrPairs) { status_t err; ResXMLTree tree; @@ -2459,17 +2459,21 @@ writeProguardForXml(ProguardKeepSet* keep, const sp& layoutFile, } else if (tagAttrPairs != NULL) { ssize_t tagIndex = tagAttrPairs->indexOfKey(tag); if (tagIndex >= 0) { - const NamespaceAttributePair& nsAttr = tagAttrPairs->valueAt(tagIndex); - ssize_t attrIndex = tree.indexOfAttribute(nsAttr.ns, nsAttr.attr); - if (attrIndex < 0) { - // fprintf(stderr, "%s:%d: <%s> does not have attribute %s:%s.\n", - // layoutFile->getPrintableSource().string(), tree.getLineNumber(), - // tag.string(), nsAttr.ns, nsAttr.attr); - } else { - size_t len; - addProguardKeepRule(keep, - String8(tree.getAttributeStringValue(attrIndex, &len)), NULL, - layoutFile->getPrintableSource(), tree.getLineNumber()); + const Vector& nsAttrVector = tagAttrPairs->valueAt(tagIndex); + for (size_t i = 0; i < nsAttrVector.size(); i++) { + const NamespaceAttributePair& nsAttr = nsAttrVector[i]; + + ssize_t attrIndex = tree.indexOfAttribute(nsAttr.ns, nsAttr.attr); + if (attrIndex < 0) { + // fprintf(stderr, "%s:%d: <%s> does not have attribute %s:%s.\n", + // layoutFile->getPrintableSource().string(), tree.getLineNumber(), + // tag.string(), nsAttr.ns, nsAttr.attr); + } else { + size_t len; + addProguardKeepRule(keep, + String8(tree.getAttributeStringValue(attrIndex, &len)), NULL, + layoutFile->getPrintableSource(), tree.getLineNumber()); + } } } } @@ -2485,9 +2489,18 @@ writeProguardForXml(ProguardKeepSet* keep, const sp& layoutFile, return NO_ERROR; } -static void addTagAttrPair(KeyedVector* dest, +static void addTagAttrPair(KeyedVector >* dest, const char* tag, const char* ns, const char* attr) { - dest->add(String8(tag), NamespaceAttributePair(ns, attr)); + String8 tagStr(tag); + ssize_t index = dest->indexOfKey(tagStr); + + if (index < 0) { + Vector vector; + vector.add(NamespaceAttributePair(ns, attr)); + dest->add(tagStr, vector); + } else { + dest->editValueAt(index).add(NamespaceAttributePair(ns, attr)); + } } status_t @@ -2496,13 +2509,13 @@ writeProguardForLayouts(ProguardKeepSet* keep, const sp& assets) status_t err; // tag:attribute pairs that should be checked in layout files. - KeyedVector kLayoutTagAttrPairs; + KeyedVector > kLayoutTagAttrPairs; addTagAttrPair(&kLayoutTagAttrPairs, "view", NULL, "class"); addTagAttrPair(&kLayoutTagAttrPairs, "fragment", NULL, "class"); addTagAttrPair(&kLayoutTagAttrPairs, "fragment", RESOURCES_ANDROID_NAMESPACE, "name"); // tag:attribute pairs that should be checked in xml files. - KeyedVector kXmlTagAttrPairs; + KeyedVector > kXmlTagAttrPairs; addTagAttrPair(&kXmlTagAttrPairs, "PreferenceScreen", RESOURCES_ANDROID_NAMESPACE, "fragment"); addTagAttrPair(&kXmlTagAttrPairs, "header", RESOURCES_ANDROID_NAMESPACE, "fragment"); @@ -2512,7 +2525,7 @@ writeProguardForLayouts(ProguardKeepSet* keep, const sp& assets) const sp& d = dirs.itemAt(k); const String8& dirName = d->getLeaf(); const char* startTag = NULL; - const KeyedVector* tagAttrPairs = NULL; + const KeyedVector >* tagAttrPairs = NULL; if ((dirName == String8("layout")) || (strncmp(dirName.string(), "layout-", 7) == 0)) { tagAttrPairs = &kLayoutTagAttrPairs; } else if ((dirName == String8("xml")) || (strncmp(dirName.string(), "xml-", 4) == 0)) { @@ -2544,6 +2557,7 @@ writeProguardForLayouts(ProguardKeepSet* keep, const sp& assets) if (overlay.get()) { return writeProguardForLayouts(keep, overlay); } + return NO_ERROR; }