Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3316a953 authored by Dianne Hackborn's avatar Dianne Hackborn Committed by Android (Google) Code Review
Browse files

Merge "Fix issue #2485441: SettingsBackupAgent crashed system server"

parents 7b18d7a3 b0381efa
Loading
Loading
Loading
Loading
+46 −44
Original line number Original line Diff line number Diff line
@@ -637,6 +637,7 @@ status_t massageManifest(Bundle* bundle, sp<XMLNode> root)
        sp<XMLNode> application = root->getChildElement(String16(), String16("application"));
        sp<XMLNode> application = root->getChildElement(String16(), String16("application"));
        if (application != NULL) {
        if (application != NULL) {
            fullyQualifyClassName(origPackage, application, String16("name"));
            fullyQualifyClassName(origPackage, application, String16("name"));
            fullyQualifyClassName(origPackage, application, String16("backupAgent"));


            Vector<sp<XMLNode> >& children = const_cast<Vector<sp<XMLNode> >&>(application->getChildren());
            Vector<sp<XMLNode> >& children = const_cast<Vector<sp<XMLNode> >&>(application->getChildren());
            for (size_t i = 0; i < children.size(); i++) {
            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);
    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
status_t
writeProguardForAndroidManifest(ProguardKeepSet* keep, const sp<AaptAssets>& assets)
writeProguardForAndroidManifest(ProguardKeepSet* keep, const sp<AaptAssets>& assets)
{
{
@@ -1839,6 +1874,13 @@ writeProguardForAndroidManifest(ProguardKeepSet* keep, const sp<AaptAssets>& ass
            if (tag == "application") {
            if (tag == "application") {
                inApplication = true;
                inApplication = true;
                keepTag = 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") {
            } else if (tag == "instrumentation") {
                keepTag = true;
                keepTag = true;
            }
            }
@@ -1856,31 +1898,8 @@ writeProguardForAndroidManifest(ProguardKeepSet* keep, const sp<AaptAssets>& ass
                return -1;
                return -1;
            }
            }
            if (name.length() > 0) {
            if (name.length() > 0) {
                // asdf     --> package.asdf
                addProguardKeepRule(keep, name, pkg.string(),
                // .asdf  .a.b  --> package.asdf package.a.b
                        assFile->getPrintableSource(), tree.getLineNumber());
                // 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);
            }
            }
        }
        }
    }
    }
@@ -1888,23 +1907,6 @@ writeProguardForAndroidManifest(ProguardKeepSet* keep, const sp<AaptAssets>& ass
    return NO_ERROR;
    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
status_t
writeProguardForXml(ProguardKeepSet* keep, const sp<AaptFile>& layoutFile,
writeProguardForXml(ProguardKeepSet* keep, const sp<AaptFile>& layoutFile,
        const char* startTag, const char* altTag)
        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 there is no '.', we'll assume that it's one of the built in names.
        if (strchr(tag.string(), '.')) {
        if (strchr(tag.string(), '.')) {
            addProguardKeepRule(keep, tag,
            addProguardKeepRule(keep, tag, NULL,
                    layoutFile->getPrintableSource(), tree.getLineNumber());
                    layoutFile->getPrintableSource(), tree.getLineNumber());
        } else if (altTag != NULL && tag == altTag) {
        } else if (altTag != NULL && tag == altTag) {
            ssize_t classIndex = tree.indexOfAttribute(NULL, "class");
            ssize_t classIndex = tree.indexOfAttribute(NULL, "class");
@@ -1956,7 +1958,7 @@ writeProguardForXml(ProguardKeepSet* keep, const sp<AaptFile>& layoutFile,
            } else {
            } else {
                size_t len;
                size_t len;
                addProguardKeepRule(keep,
                addProguardKeepRule(keep,
                        String8(tree.getAttributeStringValue(classIndex, &len)),
                        String8(tree.getAttributeStringValue(classIndex, &len)), NULL,
                        layoutFile->getPrintableSource(), tree.getLineNumber());
                        layoutFile->getPrintableSource(), tree.getLineNumber());
            }
            }
        }
        }