@@ -2210,7 +2210,7 @@ struct NamespaceAttributePair {
22102210
22112211status_t
22122212writeProguardForXml (ProguardKeepSet* keep, const sp<AaptFile>& layoutFile,
2213- const char * startTag, const KeyedVector<String8, NamespaceAttributePair>* tagAttrPairs)
2213+ const char * startTag, const KeyedVector<String8, Vector< NamespaceAttributePair> >* tagAttrPairs)
22142214{
22152215 status_t err;
22162216 ResXMLTree tree;
@@ -2254,17 +2254,21 @@ writeProguardForXml(ProguardKeepSet* keep, const sp<AaptFile>& layoutFile,
22542254 } else if (tagAttrPairs != NULL ) {
22552255 ssize_t tagIndex = tagAttrPairs->indexOfKey (tag);
22562256 if (tagIndex >= 0 ) {
2257- const NamespaceAttributePair& nsAttr = tagAttrPairs->valueAt (tagIndex);
2258- ssize_t attrIndex = tree.indexOfAttribute (nsAttr.ns , nsAttr.attr );
2259- if (attrIndex < 0 ) {
2260- // fprintf(stderr, "%s:%d: <%s> does not have attribute %s:%s.\n",
2261- // layoutFile->getPrintableSource().string(), tree.getLineNumber(),
2262- // tag.string(), nsAttr.ns, nsAttr.attr);
2263- } else {
2264- size_t len;
2265- addProguardKeepRule (keep,
2266- String8 (tree.getAttributeStringValue (attrIndex, &len)), NULL ,
2267- layoutFile->getPrintableSource (), tree.getLineNumber ());
2257+ const Vector<NamespaceAttributePair>& nsAttrVector = tagAttrPairs->valueAt (tagIndex);
2258+ for (size_t i = 0 ; i < nsAttrVector.size (); i++) {
2259+ const NamespaceAttributePair& nsAttr = nsAttrVector[i];
2260+
2261+ ssize_t attrIndex = tree.indexOfAttribute (nsAttr.ns , nsAttr.attr );
2262+ if (attrIndex < 0 ) {
2263+ // fprintf(stderr, "%s:%d: <%s> does not have attribute %s:%s.\n",
2264+ // layoutFile->getPrintableSource().string(), tree.getLineNumber(),
2265+ // tag.string(), nsAttr.ns, nsAttr.attr);
2266+ } else {
2267+ size_t len;
2268+ addProguardKeepRule (keep,
2269+ String8 (tree.getAttributeStringValue (attrIndex, &len)), NULL ,
2270+ layoutFile->getPrintableSource (), tree.getLineNumber ());
2271+ }
22682272 }
22692273 }
22702274 }
@@ -2280,9 +2284,18 @@ writeProguardForXml(ProguardKeepSet* keep, const sp<AaptFile>& layoutFile,
22802284 return NO_ERROR;
22812285}
22822286
2283- static void addTagAttrPair (KeyedVector<String8, NamespaceAttributePair>* dest,
2287+ static void addTagAttrPair (KeyedVector<String8, Vector< NamespaceAttributePair> >* dest,
22842288 const char * tag, const char * ns, const char * attr) {
2285- dest->add (String8 (tag), NamespaceAttributePair (ns, attr));
2289+ String8 tagStr (tag);
2290+ ssize_t index = dest->indexOfKey (tagStr);
2291+
2292+ if (index < 0 ) {
2293+ Vector<NamespaceAttributePair> vector;
2294+ vector.add (NamespaceAttributePair (ns, attr));
2295+ dest->add (tagStr, vector);
2296+ } else {
2297+ dest->editValueAt (index).add (NamespaceAttributePair (ns, attr));
2298+ }
22862299}
22872300
22882301status_t
@@ -2291,13 +2304,13 @@ writeProguardForLayouts(ProguardKeepSet* keep, const sp<AaptAssets>& assets)
22912304 status_t err;
22922305
22932306 // tag:attribute pairs that should be checked in layout files.
2294- KeyedVector<String8, NamespaceAttributePair> kLayoutTagAttrPairs ;
2307+ KeyedVector<String8, Vector< NamespaceAttributePair> > kLayoutTagAttrPairs ;
22952308 addTagAttrPair (&kLayoutTagAttrPairs , " view" , NULL , " class" );
22962309 addTagAttrPair (&kLayoutTagAttrPairs , " fragment" , NULL , " class" );
22972310 addTagAttrPair (&kLayoutTagAttrPairs , " fragment" , RESOURCES_ANDROID_NAMESPACE, " name" );
22982311
22992312 // tag:attribute pairs that should be checked in xml files.
2300- KeyedVector<String8, NamespaceAttributePair> kXmlTagAttrPairs ;
2313+ KeyedVector<String8, Vector< NamespaceAttributePair> > kXmlTagAttrPairs ;
23012314 addTagAttrPair (&kXmlTagAttrPairs , " PreferenceScreen" , RESOURCES_ANDROID_NAMESPACE, " fragment" );
23022315 addTagAttrPair (&kXmlTagAttrPairs , " header" , RESOURCES_ANDROID_NAMESPACE, " fragment" );
23032316
@@ -2307,7 +2320,7 @@ writeProguardForLayouts(ProguardKeepSet* keep, const sp<AaptAssets>& assets)
23072320 const sp<AaptDir>& d = dirs.itemAt (k);
23082321 const String8& dirName = d->getLeaf ();
23092322 const char * startTag = NULL ;
2310- const KeyedVector<String8, NamespaceAttributePair>* tagAttrPairs = NULL ;
2323+ const KeyedVector<String8, Vector< NamespaceAttributePair> >* tagAttrPairs = NULL ;
23112324 if ((dirName == String8 (" layout" )) || (strncmp (dirName.string (), " layout-" , 7 ) == 0 )) {
23122325 tagAttrPairs = &kLayoutTagAttrPairs ;
23132326 } else if ((dirName == String8 (" xml" )) || (strncmp (dirName.string (), " xml-" , 4 ) == 0 )) {
@@ -2339,6 +2352,7 @@ writeProguardForLayouts(ProguardKeepSet* keep, const sp<AaptAssets>& assets)
23392352 if (overlay.get ()) {
23402353 return writeProguardForLayouts (keep, overlay);
23412354 }
2355+
23422356 return NO_ERROR;
23432357}
23442358
0 commit comments