summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDianne Hackborn <hackbod@google.com>2010-03-03 13:49:16 -0800
committerAndroid (Google) Code Review <android-gerrit@google.com>2010-03-03 13:49:16 -0800
commit3316a953a7d27d9cc1ab63c5621df7c5d7d3c572 (patch)
tree668f4004cec429fc5ee55272953d710a0c12d11f
parent7b18d7a30e4a9b31b963f7d47f993b40748955ae (diff)
parentb0381efaf71e917214cec78ed1c35eb688454e93 (diff)
downloadframeworks_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.cpp90
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());
}
}