am b5fb50a1: Merge "Add instrumentation as a source tag for proguard keep options." into eclair

Merge commit 'b5fb50a133c6fc7fc93d6241912dd9ec24de6ace' into eclair-plus-aosp

* commit 'b5fb50a133c6fc7fc93d6241912dd9ec24de6ace':
  Add instrumentation as a source tag for proguard keep options.
diff --git a/tools/aapt/Resource.cpp b/tools/aapt/Resource.cpp
index 02b46aa..e2aeddf 100644
--- a/tools/aapt/Resource.cpp
+++ b/tools/aapt/Resource.cpp
@@ -1727,51 +1727,59 @@
         depth++;
         String8 tag(tree.getElementName(&len));
         // printf("Depth %d tag %s\n", depth, tag.string());
+        bool keepTag = false;
         if (depth == 1) {
             if (tag != "manifest") {
                 fprintf(stderr, "ERROR: manifest does not start with <manifest> tag\n");
                 return -1;
             }
             pkg = getAttribute(tree, NULL, "package", NULL);
-        } else if (depth == 2 && tag == "application") {
-            inApplication = true;
+        } else if (depth == 2) {
+            if (tag == "application") {
+                inApplication = true;
+                keepTag = true;
+            } else if (tag == "instrumentation") {
+                keepTag = true;
+            }
         }
-        if (inApplication) {
-            if (tag == "application" || tag == "activity" || tag == "service" || tag == "receiver"
-                    || tag == "provider") {
-                String8 name = getAttribute(tree, "http://schemas.android.com/apk/res/android",
-                        "name", &error);
-                if (error != "") {
-                    fprintf(stderr, "ERROR: %s\n", error.string());
-                    return -1;
+        if (!keepTag && inApplication && depth == 3) {
+            if (tag == "activity" || tag == "service" || tag == "receiver" || tag == "provider") {
+                keepTag = true;
+            }
+        }
+        if (keepTag) {
+            String8 name = getAttribute(tree, "http://schemas.android.com/apk/res/android",
+                    "name", &error);
+            if (error != "") {
+                fprintf(stderr, "ERROR: %s\n", error.string());
+                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;
                 }
-                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;
+                String8 location = tag;
+                location += " ";
+                location += assFile->getSourceFile();
+                char lineno[20];
+                sprintf(lineno, ":%d", tree.getLineNumber());
+                location += lineno;
 
-                    keep->add(rule, location);
-                }
+                keep->add(rule, location);
             }
         }
     }