X-Git-Url: https://git.saurik.com/android/aapt.git/blobdiff_plain/3b8c05ce0707be71abb209f7dbae564088426d87..94eabf4be088c6ab8252caf2fa24cbc71aba1220:/Resource.cpp diff --git a/Resource.cpp b/Resource.cpp index e2e0dc3..1785683 100644 --- a/Resource.cpp +++ b/Resource.cpp @@ -2241,7 +2241,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; @@ -2285,17 +2285,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()); + } } } } @@ -2311,9 +2315,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 @@ -2322,13 +2335,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"); @@ -2338,7 +2351,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)) { @@ -2370,6 +2383,7 @@ writeProguardForLayouts(ProguardKeepSet* keep, const sp& assets) if (overlay.get()) { return writeProguardForLayouts(keep, overlay); } + return NO_ERROR; }