From: Ying Wang Date: Mon, 16 Aug 2010 22:16:52 +0000 (-0700) Subject: am 8cfd3c01: am e05184f2: Merge "Output proguard keep flags for fragment classes... X-Git-Url: https://git.saurik.com/android/aapt.git/commitdiff_plain/ae135026bab1eff4ae75d9542bf4dc178af60039?hp=-c am 8cfd3c01: am e05184f2: Merge "Output proguard keep flags for fragment classes." into gingerbread Merge commit '8cfd3c01e4582a587765588c02234527e7808ca0' * commit '8cfd3c01e4582a587765588c02234527e7808ca0': Output proguard keep flags for fragment classes. --- ae135026bab1eff4ae75d9542bf4dc178af60039 diff --combined Resource.cpp index 5855b56,bd84e23..31c1722 --- a/Resource.cpp +++ b/Resource.cpp @@@ -542,11 -542,11 +542,11 @@@ static bool applyFileOverlay(Bundle *bu DefaultKeyedVector > baseFiles = baseGroup->getFiles(); for (size_t i=0; i < baseFiles.size(); i++) { - printf("baseFile %ld has flavor %s\n", i, + printf("baseFile %d has flavor %s\n", i, baseFiles.keyAt(i).toString().string()); } for (size_t i=0; i < overlayFiles.size(); i++) { - printf("overlayFile %ld has flavor %s\n", i, + printf("overlayFile %d has flavor %s\n", i, overlayFiles.keyAt(i).toString().string()); } } @@@ -560,7 -560,7 +560,7 @@@ keyAt(overlayGroupIndex)); if(baseFileIndex < UNKNOWN_ERROR) { if (bundle->getVerbose()) { - printf("found a match (%ld) for overlay file %s, for flavor %s\n", + printf("found a match (%d) for overlay file %s, for flavor %s\n", baseFileIndex, overlayGroup->getLeaf().string(), overlayFiles.keyAt(overlayGroupIndex).toString().string()); @@@ -1880,7 -1880,7 +1880,7 @@@ addProguardKeepRule(ProguardKeepSet* ke className.append(inClassName); } } - + String8 rule("-keep class "); rule += className; rule += " { (...); }"; @@@ -1955,7 -1955,7 +1955,7 @@@ writeProguardForAndroidManifest(Proguar if (tag == "application") { inApplication = true; keepTag = true; - + String8 agent = getAttribute(tree, "http://schemas.android.com/apk/res/android", "backupAgent", &error); if (agent.length() > 0) { @@@ -1988,9 -1988,17 +1988,17 @@@ return NO_ERROR; } + struct NamespaceAttributePair { + const char* ns; + const char* attr; + + NamespaceAttributePair(const char* n, const char* a) : ns(n), attr(a) {} + NamespaceAttributePair() : ns(NULL), attr(NULL) {} + }; + status_t writeProguardForXml(ProguardKeepSet* keep, const sp& layoutFile, - const char* startTag, const char* altTag) + const char* startTag, const KeyedVector* tagAttrPairs) { status_t err; ResXMLTree tree; @@@ -2020,7 -2028,7 +2028,7 @@@ return NO_ERROR; } } - + while ((code=tree.next()) != ResXMLTree::END_DOCUMENT && code != ResXMLTree::BAD_DOCUMENT) { if (code != ResXMLTree::START_TAG) { continue; @@@ -2031,16 -2039,21 +2039,21 @@@ if (strchr(tag.string(), '.')) { addProguardKeepRule(keep, tag, NULL, layoutFile->getPrintableSource(), tree.getLineNumber()); - } else if (altTag != NULL && tag == altTag) { - ssize_t classIndex = tree.indexOfAttribute(NULL, "class"); - if (classIndex < 0) { - fprintf(stderr, "%s:%d: does not have class attribute.\n", - layoutFile->getPrintableSource().string(), tree.getLineNumber()); - } else { - size_t len; - addProguardKeepRule(keep, - String8(tree.getAttributeStringValue(classIndex, &len)), NULL, - layoutFile->getPrintableSource(), tree.getLineNumber()); + } 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()); + } } } } @@@ -2048,25 -2061,42 +2061,42 @@@ return NO_ERROR; } + static void addTagAttrPair(KeyedVector* dest, + const char* tag, const char* ns, const char* attr) { + dest->add(String8(tag), NamespaceAttributePair(ns, attr)); + } + status_t writeProguardForLayouts(ProguardKeepSet* keep, const sp& assets) { status_t err; + + // tag:attribute pairs that should be checked in layout files. + KeyedVector kLayoutTagAttrPairs; + addTagAttrPair(&kLayoutTagAttrPairs, "view", NULL, "class"); + addTagAttrPair(&kLayoutTagAttrPairs, "fragment", RESOURCES_ANDROID_NAMESPACE, "name"); + + // tag:attribute pairs that should be checked in xml files. + KeyedVector kXmlTagAttrPairs; + addTagAttrPair(&kXmlTagAttrPairs, "PreferenceScreen", RESOURCES_ANDROID_NAMESPACE, "fragment"); + addTagAttrPair(&kXmlTagAttrPairs, "Header", RESOURCES_ANDROID_NAMESPACE, "fragment"); + const Vector >& dirs = assets->resDirs(); const size_t K = dirs.size(); for (size_t k=0; k& d = dirs.itemAt(k); const String8& dirName = d->getLeaf(); const char* startTag = NULL; - const char* altTag = NULL; + const KeyedVector* tagAttrPairs = NULL; if ((dirName == String8("layout")) || (strncmp(dirName.string(), "layout-", 7) == 0)) { - altTag = "view"; + tagAttrPairs = &kLayoutTagAttrPairs; } else if ((dirName == String8("xml")) || (strncmp(dirName.string(), "xml-", 4) == 0)) { startTag = "PreferenceScreen"; + tagAttrPairs = &kXmlTagAttrPairs; } else { continue; } - + const KeyedVector > groups = d->getFiles(); const size_t N = groups.size(); for (size_t i=0; i >& files = group->getFiles(); const size_t M = files.size(); for (size_t j=0; j