diff options
author | Dianne Hackborn <hackbod@google.com> | 2010-03-03 13:49:16 -0800 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2010-03-03 13:49:16 -0800 |
commit | 3316a953a7d27d9cc1ab63c5621df7c5d7d3c572 (patch) | |
tree | 668f4004cec429fc5ee55272953d710a0c12d11f | |
parent | 7b18d7a30e4a9b31b963f7d47f993b40748955ae (diff) | |
parent | b0381efaf71e917214cec78ed1c35eb688454e93 (diff) | |
download | frameworks_base-3316a953a7d27d9cc1ab63c5621df7c5d7d3c572.zip frameworks_base-3316a953a7d27d9cc1ab63c5621df7c5d7d3c572.tar.gz frameworks_base-3316a953a7d27d9cc1ab63c5621df7c5d7d3c572.tar.bz2 |
Merge "Fix issue #2485441: SettingsBackupAgent crashed system server"
-rw-r--r-- | tools/aapt/Resource.cpp | 90 |
1 files changed, 46 insertions, 44 deletions
diff --git a/tools/aapt/Resource.cpp b/tools/aapt/Resource.cpp index 9fcb21c..ea021d8 100644 --- a/tools/aapt/Resource.cpp +++ b/tools/aapt/Resource.cpp @@ -637,6 +637,7 @@ status_t massageManifest(Bundle* bundle, sp<XMLNode> root) sp<XMLNode> application = root->getChildElement(String16(), String16("application")); if (application != NULL) { fullyQualifyClassName(origPackage, application, String16("name")); + fullyQualifyClassName(origPackage, application, String16("backupAgent")); Vector<sp<XMLNode> >& children = const_cast<Vector<sp<XMLNode> >&>(application->getChildren()); for (size_t i = 0; i < children.size(); i++) { @@ -1778,6 +1779,40 @@ void ProguardKeepSet::add(const String8& rule, const String8& where) rules.editValueAt(index).add(where); } +void +addProguardKeepRule(ProguardKeepSet* keep, const String8& inClassName, + const char* pkg, const String8& srcName, int line) +{ + String8 className(inClassName); + if (pkg != NULL) { + // asdf --> package.asdf + // .asdf .a.b --> package.asdf package.a.b + // asdf.adsf --> asdf.asdf + const char* p = className.string(); + const char* q = strchr(p, '.'); + if (p == q) { + className = pkg; + className.append(inClassName); + } else if (q == NULL) { + className = pkg; + className.append("."); + className.append(inClassName); + } + } + + String8 rule("-keep class "); + rule += className; + rule += " { <init>(...); }"; + + String8 location("view "); + location += srcName; + char lineno[20]; + sprintf(lineno, ":%d", line); + location += lineno; + + keep->add(rule, location); +} + status_t writeProguardForAndroidManifest(ProguardKeepSet* keep, const sp<AaptAssets>& assets) { @@ -1839,6 +1874,13 @@ writeProguardForAndroidManifest(ProguardKeepSet* keep, const sp<AaptAssets>& ass if (tag == "application") { inApplication = true; keepTag = true; + + String8 agent = getAttribute(tree, "http://schemas.android.com/apk/res/android", + "backupAgent", &error); + if (agent.length() > 0) { + addProguardKeepRule(keep, agent, pkg.string(), + assFile->getPrintableSource(), tree.getLineNumber()); + } } else if (tag == "instrumentation") { keepTag = true; } @@ -1856,31 +1898,8 @@ writeProguardForAndroidManifest(ProguardKeepSet* keep, const sp<AaptAssets>& ass return -1; } if (name.length() > 0) { - // asdf --> package.asdf - // .asdf .a.b --> package.asdf package.a.b - // asdf.adsf --> asdf.asdf - String8 rule("-keep class "); - const char* p = name.string(); - const char* q = strchr(p, '.'); - if (p == q) { - rule += pkg; - rule += name; - } else if (q == NULL) { - rule += pkg; - rule += "."; - rule += name; - } else { - rule += name; - } - - String8 location = tag; - location += " "; - location += assFile->getSourceFile(); - char lineno[20]; - sprintf(lineno, ":%d", tree.getLineNumber()); - location += lineno; - - keep->add(rule, location); + addProguardKeepRule(keep, name, pkg.string(), + assFile->getPrintableSource(), tree.getLineNumber()); } } } @@ -1888,23 +1907,6 @@ writeProguardForAndroidManifest(ProguardKeepSet* keep, const sp<AaptAssets>& ass return NO_ERROR; } -void -addProguardKeepRule(ProguardKeepSet* keep, const String8& className, - const String8& srcName, int line) -{ - String8 rule("-keep class "); - rule += className; - rule += " { <init>(...); }"; - - String8 location("view "); - location += srcName; - char lineno[20]; - sprintf(lineno, ":%d", line); - location += lineno; - - keep->add(rule, location); -} - status_t writeProguardForXml(ProguardKeepSet* keep, const sp<AaptFile>& layoutFile, const char* startTag, const char* altTag) @@ -1946,7 +1948,7 @@ writeProguardForXml(ProguardKeepSet* keep, const sp<AaptFile>& layoutFile, // If there is no '.', we'll assume that it's one of the built in names. if (strchr(tag.string(), '.')) { - addProguardKeepRule(keep, tag, + addProguardKeepRule(keep, tag, NULL, layoutFile->getPrintableSource(), tree.getLineNumber()); } else if (altTag != NULL && tag == altTag) { ssize_t classIndex = tree.indexOfAttribute(NULL, "class"); @@ -1956,7 +1958,7 @@ writeProguardForXml(ProguardKeepSet* keep, const sp<AaptFile>& layoutFile, } else { size_t len; addProguardKeepRule(keep, - String8(tree.getAttributeStringValue(classIndex, &len)), + String8(tree.getAttributeStringValue(classIndex, &len)), NULL, layoutFile->getPrintableSource(), tree.getLineNumber()); } } |