]> git.saurik.com Git - android/aapt.git/commitdiff
am 31820a35: Merge "Add --output-text-symbols option to aapt."
authorXavier Ducrohet <xav@android.com>
Mon, 17 Sep 2012 19:03:19 +0000 (12:03 -0700)
committerAndroid Git Automerger <android-git-automerger@android.com>
Mon, 17 Sep 2012 19:03:19 +0000 (12:03 -0700)
* commit '31820a35b2cf864a8dcb71d43e6fd21d54f49a2d':
  Add --output-text-symbols option to aapt.

1  2 
Resource.cpp

diff --combined Resource.cpp
index 17856835652a9f4ff7e2734e2905faf57b4cbf3a,50334185fdf576c0cf82c19f98bfe9b9ec855dcb..9c2e1b9127f1947c937cfb61eafb1df7c5354288
@@@ -1852,6 -1852,110 +1852,110 @@@ static status_t writeLayoutClasses
      return hasErrors ? UNKNOWN_ERROR : NO_ERROR;
  }
  
+ static status_t writeTextLayoutClasses(
+     FILE* fp, const sp<AaptAssets>& assets,
+     const sp<AaptSymbols>& symbols, bool includePrivate)
+ {
+     String16 attr16("attr");
+     String16 package16(assets->getPackage());
+     bool hasErrors = false;
+     size_t i;
+     size_t N = symbols->getNestedSymbols().size();
+     for (i=0; i<N; i++) {
+         sp<AaptSymbols> nsymbols = symbols->getNestedSymbols().valueAt(i);
+         String16 nclassName16(symbols->getNestedSymbols().keyAt(i));
+         String8 realClassName(nclassName16);
+         if (fixupSymbol(&nclassName16) != NO_ERROR) {
+             hasErrors = true;
+         }
+         String8 nclassName(nclassName16);
+         SortedVector<uint32_t> idents;
+         Vector<uint32_t> origOrder;
+         Vector<bool> publicFlags;
+         size_t a;
+         size_t NA = nsymbols->getSymbols().size();
+         for (a=0; a<NA; a++) {
+             const AaptSymbolEntry& sym(nsymbols->getSymbols().valueAt(a));
+             int32_t code = sym.typeCode == AaptSymbolEntry::TYPE_INT32
+                     ? sym.int32Val : 0;
+             bool isPublic = true;
+             if (code == 0) {
+                 String16 name16(sym.name);
+                 uint32_t typeSpecFlags;
+                 code = assets->getIncludedResources().identifierForName(
+                     name16.string(), name16.size(),
+                     attr16.string(), attr16.size(),
+                     package16.string(), package16.size(), &typeSpecFlags);
+                 if (code == 0) {
+                     fprintf(stderr, "ERROR: In <declare-styleable> %s, unable to find attribute %s\n",
+                             nclassName.string(), sym.name.string());
+                     hasErrors = true;
+                 }
+                 isPublic = (typeSpecFlags&ResTable_typeSpec::SPEC_PUBLIC) != 0;
+             }
+             idents.add(code);
+             origOrder.add(code);
+             publicFlags.add(isPublic);
+         }
+         NA = idents.size();
+         fprintf(fp, "int[] styleable %s {", nclassName.string());
+         for (a=0; a<NA; a++) {
+             if (a != 0) {
+                 fprintf(fp, ",");
+             }
+             fprintf(fp, " 0x%08x", idents[a]);
+         }
+         fprintf(fp, " }\n");
+         for (a=0; a<NA; a++) {
+             ssize_t pos = idents.indexOf(origOrder.itemAt(a));
+             if (pos >= 0) {
+                 const AaptSymbolEntry& sym = nsymbols->getSymbols().valueAt(a);
+                 if (!publicFlags.itemAt(a) && !includePrivate) {
+                     continue;
+                 }
+                 String8 name8(sym.name);
+                 String16 comment(sym.comment);
+                 String16 typeComment;
+                 if (comment.size() <= 0) {
+                     comment = getAttributeComment(assets, name8, &typeComment);
+                 } else {
+                     getAttributeComment(assets, name8, &typeComment);
+                 }
+                 String16 name(name8);
+                 if (fixupSymbol(&name) != NO_ERROR) {
+                     hasErrors = true;
+                 }
+                 uint32_t typeSpecFlags = 0;
+                 String16 name16(sym.name);
+                 assets->getIncludedResources().identifierForName(
+                     name16.string(), name16.size(),
+                     attr16.string(), attr16.size(),
+                     package16.string(), package16.size(), &typeSpecFlags);
+                 //printf("%s:%s/%s: 0x%08x\n", String8(package16).string(),
+                 //    String8(attr16).string(), String8(name16).string(), typeSpecFlags);
+                 const bool pub = (typeSpecFlags&ResTable_typeSpec::SPEC_PUBLIC) != 0;
+                 fprintf(fp,
+                         "int styleable.%s_%s %d\n",
+                         nclassName.string(),
+                         String8(name).string(), (int)pos);
+             }
+         }
+     }
+     return hasErrors ? UNKNOWN_ERROR : NO_ERROR;
+ }
  static status_t writeSymbolClass(
      FILE* fp, const sp<AaptAssets>& assets, bool includePrivate,
      const sp<AaptSymbols>& symbols, const String8& className, int indent,
              continue;
          }
          String16 name(sym.name);
-         String8 realName(name);
          if (fixupSymbol(&name) != NO_ERROR) {
              return UNKNOWN_ERROR;
          }
      return NO_ERROR;
  }
  
+ static status_t writeTextSymbolClass(
+     FILE* fp, const sp<AaptAssets>& assets, bool includePrivate,
+     const sp<AaptSymbols>& symbols, const String8& className)
+ {
+     size_t i;
+     status_t err = NO_ERROR;
+     size_t N = symbols->getSymbols().size();
+     for (i=0; i<N; i++) {
+         const AaptSymbolEntry& sym = symbols->getSymbols().valueAt(i);
+         if (sym.typeCode != AaptSymbolEntry::TYPE_INT32) {
+             continue;
+         }
+         if (!assets->isJavaSymbol(sym, includePrivate)) {
+             continue;
+         }
+         String16 name(sym.name);
+         if (fixupSymbol(&name) != NO_ERROR) {
+             return UNKNOWN_ERROR;
+         }
+         fprintf(fp, "int %s %s 0x%08x\n",
+                 className.string(),
+                 String8(name).string(), (int)sym.int32Val);
+     }
+     N = symbols->getNestedSymbols().size();
+     for (i=0; i<N; i++) {
+         sp<AaptSymbols> nsymbols = symbols->getNestedSymbols().valueAt(i);
+         String8 nclassName(symbols->getNestedSymbols().keyAt(i));
+         if (nclassName == "styleable") {
+             err = writeTextLayoutClasses(fp, assets, nsymbols, includePrivate);
+         } else {
+             err = writeTextSymbolClass(fp, assets, includePrivate, nsymbols, nclassName);
+         }
+         if (err != NO_ERROR) {
+             return err;
+         }
+     }
+     return NO_ERROR;
+ }
  status_t writeResourceSymbols(Bundle* bundle, const sp<AaptAssets>& assets,
      const String8& package, bool includePrivate)
  {
          return NO_ERROR;
      }
  
+     const char* textSymbolsDest = bundle->getOutputTextSymbols();
+     String8 R("R");
      const size_t N = assets->getSymbols().size();
      for (size_t i=0; i<N; i++) {
          sp<AaptSymbols> symbols = assets->getSymbols().valueAt(i);
          String8 className(assets->getSymbols().keyAt(i));
          String8 dest(bundle->getRClassDir());
          if (bundle->getMakePackageDirs()) {
              String8 pkg(package);
              const char* last = pkg.string();
          }
  
          fprintf(fp,
-         "/* AUTO-GENERATED FILE.  DO NOT MODIFY.\n"
-         " *\n"
-         " * This class was automatically generated by the\n"
-         " * aapt tool from the resource data it found.  It\n"
-         " * should not be modified by hand.\n"
-         " */\n"
-         "\n"
-         "package %s;\n\n", package.string());
+             "/* AUTO-GENERATED FILE.  DO NOT MODIFY.\n"
+             " *\n"
+             " * This class was automatically generated by the\n"
+             " * aapt tool from the resource data it found.  It\n"
+             " * should not be modified by hand.\n"
+             " */\n"
+             "\n"
+             "package %s;\n\n", package.string());
  
          status_t err = writeSymbolClass(fp, assets, includePrivate, symbols,
                  className, 0, bundle->getNonConstantId());
          }
          fclose(fp);
  
+         if (textSymbolsDest != NULL && R == className) {
+             String8 textDest(textSymbolsDest);
+             textDest.appendPath(className);
+             textDest.append(".txt");
+             FILE* fp = fopen(textDest.string(), "w+");
+             if (fp == NULL) {
+                 fprintf(stderr, "ERROR: Unable to open text symbol file %s: %s\n",
+                         textDest.string(), strerror(errno));
+                 return UNKNOWN_ERROR;
+             }
+             if (bundle->getVerbose()) {
+                 printf("  Writing text symbols for class %s.\n", className.string());
+             }
+             status_t err = writeTextSymbolClass(fp, assets, includePrivate, symbols,
+                     className);
+             if (err != NO_ERROR) {
+                 return err;
+             }
+             fclose(fp);
+         }
          // If we were asked to generate a dependency file, we'll go ahead and add this R.java
          // as a target in the dependency file right next to it.
-         if (bundle->getGenDependencies()) {
+         if (bundle->getGenDependencies() && R == className) {
              // Add this R.java to the dependency file
              String8 dependencyFile(bundle->getRClassDir());
              dependencyFile.appendPath("R.java.d");
  
-             fp = fopen(dependencyFile.string(), "a");
+             FILE *fp = fopen(dependencyFile.string(), "a");
              fprintf(fp,"%s \\\n", dest.string());
              fclose(fp);
          }
  }
  
  
  class ProguardKeepSet
  {
  public:
@@@ -2241,7 -2415,7 +2415,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
@@@ -2335,13 -2496,13 +2509,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;
  }