]> git.saurik.com Git - android/aapt.git/commitdiff
am d7252571: Merge "Add --error-on-failed-insert option to aapt."
authorXavier Ducrohet <xav@android.com>
Mon, 17 Sep 2012 19:03:12 +0000 (12:03 -0700)
committerAndroid Git Automerger <android-git-automerger@android.com>
Mon, 17 Sep 2012 19:03:12 +0000 (12:03 -0700)
* commit 'd72525718ea7ef3e1f97cf557365b143c8919a5b':
  Add --error-on-failed-insert option to aapt.

1  2 
Resource.cpp

diff --combined Resource.cpp
index ee076e602e5eee3ab0c0edad4ae47c71fdb71ac3,e2e0dc37ce961f585f4296f8c50262d018cee926..17856835652a9f4ff7e2734e2905faf57b4cbf3a
@@@ -673,24 -673,40 +673,40 @@@ static bool applyFileOverlay(Bundle *bu
      return true;
  }
  
- void addTagAttribute(const sp<XMLNode>& node, const char* ns8,
-         const char* attr8, const char* value)
+ /*
+  * Inserts an attribute in a given node, only if the attribute does not
+  * exist.
+  * If errorOnFailedInsert is true, and the attribute already exists, returns false.
+  * Returns true otherwise, even if the attribute already exists.
+  */
+ bool addTagAttribute(const sp<XMLNode>& node, const char* ns8,
+         const char* attr8, const char* value, bool errorOnFailedInsert)
  {
      if (value == NULL) {
-         return;
+         return true;
      }
-     
      const String16 ns(ns8);
      const String16 attr(attr8);
-     
      if (node->getAttribute(ns, attr) != NULL) {
+         if (errorOnFailedInsert) {
+             fprintf(stderr, "Error: AndroidManifest.xml already defines %s (in %s);"
+                             " cannot insert new value %s.\n",
+                     String8(attr).string(), String8(ns).string(), value);
+             return false;
+         }
          fprintf(stderr, "Warning: AndroidManifest.xml already defines %s (in %s);"
                          " using existing value in manifest.\n",
                  String8(attr).string(), String8(ns).string());
-         return;
+         // don't stop the build.
+         return true;
      }
      
      node->addAttribute(ns, attr, String16(value));
+     return true;
  }
  
  static void fullyQualifyClassName(const String8& package, sp<XMLNode> node,
@@@ -728,11 -744,17 +744,17 @@@ status_t massageManifest(Bundle* bundle
          fprintf(stderr, "No <manifest> tag.\n");
          return UNKNOWN_ERROR;
      }
-     
-     addTagAttribute(root, RESOURCES_ANDROID_NAMESPACE, "versionCode",
-             bundle->getVersionCode());
-     addTagAttribute(root, RESOURCES_ANDROID_NAMESPACE, "versionName",
-             bundle->getVersionName());
+     bool errorOnFailedInsert = bundle->getErrorOnFailedInsert();
+     if (!addTagAttribute(root, RESOURCES_ANDROID_NAMESPACE, "versionCode",
+             bundle->getVersionCode(), errorOnFailedInsert)) {
+         return UNKNOWN_ERROR;
+     }
+     if (!addTagAttribute(root, RESOURCES_ANDROID_NAMESPACE, "versionName",
+             bundle->getVersionName(), errorOnFailedInsert)) {
+         return UNKNOWN_ERROR;
+     }
      
      if (bundle->getMinSdkVersion() != NULL
              || bundle->getTargetSdkVersion() != NULL
              root->insertChildAt(vers, 0);
          }
          
-         addTagAttribute(vers, RESOURCES_ANDROID_NAMESPACE, "minSdkVersion",
-                 bundle->getMinSdkVersion());
-         addTagAttribute(vers, RESOURCES_ANDROID_NAMESPACE, "targetSdkVersion",
-                 bundle->getTargetSdkVersion());
-         addTagAttribute(vers, RESOURCES_ANDROID_NAMESPACE, "maxSdkVersion",
-                 bundle->getMaxSdkVersion());
+         if (!addTagAttribute(vers, RESOURCES_ANDROID_NAMESPACE, "minSdkVersion",
+                 bundle->getMinSdkVersion(), errorOnFailedInsert)) {
+             return UNKNOWN_ERROR;
+         }
+         if (!addTagAttribute(vers, RESOURCES_ANDROID_NAMESPACE, "targetSdkVersion",
+                 bundle->getTargetSdkVersion(), errorOnFailedInsert)) {
+             return UNKNOWN_ERROR;
+         }
+         if (!addTagAttribute(vers, RESOURCES_ANDROID_NAMESPACE, "maxSdkVersion",
+                 bundle->getMaxSdkVersion(), errorOnFailedInsert)) {
+             return UNKNOWN_ERROR;
+         }
      }
  
      if (bundle->getDebugMode()) {
          sp<XMLNode> application = root->getChildElement(String16(), String16("application"));
          if (application != NULL) {
-             addTagAttribute(application, RESOURCES_ANDROID_NAMESPACE, "debuggable", "true");
+             if (!addTagAttribute(application, RESOURCES_ANDROID_NAMESPACE, "debuggable", "true",
+                     errorOnFailedInsert)) {
+                 return UNKNOWN_ERROR;
+             }
          }
      }
  
@@@ -2210,7 -2241,7 +2241,7 @@@ struct NamespaceAttributePair 
  
  status_t
  writeProguardForXml(ProguardKeepSet* keep, const sp<AaptFile>& layoutFile,
 -        const char* startTag, const KeyedVector<String8, NamespaceAttributePair>* tagAttrPairs)
 +        const char* startTag, const KeyedVector<String8, Vector<NamespaceAttributePair> >* tagAttrPairs)
  {
      status_t err;
      ResXMLTree tree;
          } else if (tagAttrPairs != NULL) {
              ssize_t tagIndex = tagAttrPairs->indexOfKey(tag);
              if (tagIndex >= 0) {
 -                const NamespaceAttributePair& nsAttr = tagAttrPairs->valueAt(tagIndex);
 -                ssize_t attrIndex = tree.indexOfAttribute(nsAttr.ns, nsAttr.attr);
 -                if (attrIndex < 0) {
 -                    // fprintf(stderr, "%s:%d: <%s> does not have attribute %s:%s.\n",
 -                    //        layoutFile->getPrintableSource().string(), tree.getLineNumber(),
 -                    //        tag.string(), nsAttr.ns, nsAttr.attr);
 -                } else {
 -                    size_t len;
 -                    addProguardKeepRule(keep,
 -                                        String8(tree.getAttributeStringValue(attrIndex, &len)), NULL,
 -                                        layoutFile->getPrintableSource(), tree.getLineNumber());
 +                const Vector<NamespaceAttributePair>& nsAttrVector = tagAttrPairs->valueAt(tagIndex);
 +                for (size_t i = 0; i < nsAttrVector.size(); i++) {
 +                    const NamespaceAttributePair& nsAttr = nsAttrVector[i];
 +
 +                    ssize_t attrIndex = tree.indexOfAttribute(nsAttr.ns, nsAttr.attr);
 +                    if (attrIndex < 0) {
 +                        // fprintf(stderr, "%s:%d: <%s> does not have attribute %s:%s.\n",
 +                        //        layoutFile->getPrintableSource().string(), tree.getLineNumber(),
 +                        //        tag.string(), nsAttr.ns, nsAttr.attr);
 +                    } else {
 +                        size_t len;
 +                        addProguardKeepRule(keep,
 +                                            String8(tree.getAttributeStringValue(attrIndex, &len)), NULL,
 +                                            layoutFile->getPrintableSource(), tree.getLineNumber());
 +                    }
                  }
              }
          }
      return NO_ERROR;
  }
  
 -static void addTagAttrPair(KeyedVector<String8, NamespaceAttributePair>* dest,
 +static void addTagAttrPair(KeyedVector<String8, Vector<NamespaceAttributePair> >* dest,
          const char* tag, const char* ns, const char* attr) {
 -    dest->add(String8(tag), NamespaceAttributePair(ns, attr));
 +    String8 tagStr(tag);
 +    ssize_t index = dest->indexOfKey(tagStr);
 +
 +    if (index < 0) {
 +        Vector<NamespaceAttributePair> vector;
 +        vector.add(NamespaceAttributePair(ns, attr));
 +        dest->add(tagStr, vector);
 +    } else {
 +        dest->editValueAt(index).add(NamespaceAttributePair(ns, attr));
 +    }
  }
  
  status_t
@@@ -2304,13 -2322,13 +2335,13 @@@ writeProguardForLayouts(ProguardKeepSet
      status_t err;
  
      // tag:attribute pairs that should be checked in layout files.
 -    KeyedVector<String8, NamespaceAttributePair> kLayoutTagAttrPairs;
 +    KeyedVector<String8, Vector<NamespaceAttributePair> > kLayoutTagAttrPairs;
      addTagAttrPair(&kLayoutTagAttrPairs, "view", NULL, "class");
      addTagAttrPair(&kLayoutTagAttrPairs, "fragment", NULL, "class");
      addTagAttrPair(&kLayoutTagAttrPairs, "fragment", RESOURCES_ANDROID_NAMESPACE, "name");
  
      // tag:attribute pairs that should be checked in xml files.
 -    KeyedVector<String8, NamespaceAttributePair> kXmlTagAttrPairs;
 +    KeyedVector<String8, Vector<NamespaceAttributePair> > kXmlTagAttrPairs;
      addTagAttrPair(&kXmlTagAttrPairs, "PreferenceScreen", RESOURCES_ANDROID_NAMESPACE, "fragment");
      addTagAttrPair(&kXmlTagAttrPairs, "header", RESOURCES_ANDROID_NAMESPACE, "fragment");
  
          const sp<AaptDir>& d = dirs.itemAt(k);
          const String8& dirName = d->getLeaf();
          const char* startTag = NULL;
 -        const KeyedVector<String8, NamespaceAttributePair>* tagAttrPairs = NULL;
 +        const KeyedVector<String8, Vector<NamespaceAttributePair> >* tagAttrPairs = NULL;
          if ((dirName == String8("layout")) || (strncmp(dirName.string(), "layout-", 7) == 0)) {
              tagAttrPairs = &kLayoutTagAttrPairs;
          } else if ((dirName == String8("xml")) || (strncmp(dirName.string(), "xml-", 4) == 0)) {
      if (overlay.get()) {
          return writeProguardForLayouts(keep, overlay);
      }
 +
      return NO_ERROR;
  }