From 4fd67e1daa2d896637d9236e81da77dccaab844e Mon Sep 17 00:00:00 2001 From: Dianne Hackborn Date: Wed, 3 Mar 2010 13:36:35 -0800 Subject: [PATCH] Fix issue #2485441: SettingsBackupAgent crashed system server Need to take care of fixing up backupAdjust as well as reporting it to ProGuard. --- Resource.cpp | 90 +++++++++++++++++++++++++++------------------------- 1 file changed, 46 insertions(+), 44 deletions(-) diff --git a/Resource.cpp b/Resource.cpp index 9fcb21c..ea021d8 100644 --- a/Resource.cpp +++ b/Resource.cpp @@ -637,6 +637,7 @@ status_t massageManifest(Bundle* bundle, sp root) sp application = root->getChildElement(String16(), String16("application")); if (application != NULL) { fullyQualifyClassName(origPackage, application, String16("name")); + fullyQualifyClassName(origPackage, application, String16("backupAgent")); Vector >& children = const_cast >&>(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 += " { (...); }"; + + 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& assets) { @@ -1839,6 +1874,13 @@ writeProguardForAndroidManifest(ProguardKeepSet* keep, const sp& 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& 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& ass return NO_ERROR; } -void -addProguardKeepRule(ProguardKeepSet* keep, const String8& className, - const String8& srcName, int line) -{ - String8 rule("-keep class "); - rule += className; - rule += " { (...); }"; - - 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& layoutFile, const char* startTag, const char* altTag) @@ -1946,7 +1948,7 @@ writeProguardForXml(ProguardKeepSet* keep, const sp& 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& layoutFile, } else { size_t len; addProguardKeepRule(keep, - String8(tree.getAttributeStringValue(classIndex, &len)), + String8(tree.getAttributeStringValue(classIndex, &len)), NULL, layoutFile->getPrintableSource(), tree.getLineNumber()); } } -- 2.47.2