From: Xavier Ducrohet Date: Mon, 17 Sep 2012 19:08:36 +0000 (-0700) Subject: am 79c95c3b: am 5de96035: am 31820a35: Merge "Add --output-text-symbols option to... X-Git-Url: https://git.saurik.com/android/aapt.git/commitdiff_plain/c0baa58fb1c1b1eb0e50befed999928a4fac46d6?hp=265e9fb4152fa410aacd0fd336221f9db1bf4eb1 am 79c95c3b: am 5de96035: am 31820a35: Merge "Add --output-text-symbols option to aapt." * commit '79c95c3b50ff332f9c92430fd10a15eb648a0b02': Add --output-text-symbols option to aapt. --- diff --git a/Bundle.h b/Bundle.h index be08291..fde3bd6 100644 --- a/Bundle.h +++ b/Bundle.h @@ -61,7 +61,8 @@ public: mMinSdkVersion(NULL), mTargetSdkVersion(NULL), mMaxSdkVersion(NULL), mVersionCode(NULL), mVersionName(NULL), mCustomPackage(NULL), mExtraPackages(NULL), mMaxResVersion(NULL), mDebugMode(false), mNonConstantId(false), mProduct(NULL), - mUseCrunchCache(false), mErrorOnFailedInsert(false), mArgc(0), mArgv(NULL) + mUseCrunchCache(false), mErrorOnFailedInsert(false), mOutputTextSymbols(NULL), + mArgc(0), mArgv(NULL) {} ~Bundle(void) {} @@ -173,6 +174,8 @@ public: void setProduct(const char * val) { mProduct = val; } void setUseCrunchCache(bool val) { mUseCrunchCache = val; } bool getUseCrunchCache() const { return mUseCrunchCache; } + const char* getOutputTextSymbols() const { return mOutputTextSymbols; } + void setOutputTextSymbols(const char* val) { mOutputTextSymbols = val; } /* * Set and get the file specification. @@ -279,6 +282,7 @@ private: const char* mProduct; bool mUseCrunchCache; bool mErrorOnFailedInsert; + const char* mOutputTextSymbols; /* file specification */ int mArgc; diff --git a/Main.cpp b/Main.cpp index 1773f48..f398de0 100644 --- a/Main.cpp +++ b/Main.cpp @@ -69,7 +69,8 @@ void usage(void) " [-F apk-file] [-J R-file-dir] \\\n" " [--product product1,product2,...] \\\n" " [-c CONFIGS] [--preferred-configurations CONFIGS] \\\n" - " [raw-files-dir [raw-files-dir] ...]\n" + " [raw-files-dir [raw-files-dir] ...] \\\n" + " [--output-text-symbols DIR]\n" "\n" " Package the android resources. It will read assets and resources that are\n" " supplied with the -M -A -S or raw-files-dir arguments. The -J -P -F and -R\n" @@ -182,6 +183,9 @@ void usage(void) " with --debug-mode, --min-sdk-version, --target-sdk-version --version-code\n" " and --version-name.\n" " Insertion typically fails if the manifest already defines the attribute.\n" + " --output-text-symbols\n" + " Generates a text file containing the resource symbols of the R class in the\n" + " specified folder.\n" " --ignore-assets\n" " Assets to be ignored. Default pattern is:\n" " %s\n", @@ -549,6 +553,15 @@ int main(int argc, char* const argv[]) bundle.setAutoAddOverlay(true); } else if (strcmp(cp, "-error-on-failed-insert") == 0) { bundle.setErrorOnFailedInsert(true); + } else if (strcmp(cp, "-output-text-symbols") == 0) { + argc--; + argv++; + if (!argc) { + fprintf(stderr, "ERROR: No argument supplied for '-output-text-symbols' option\n"); + wantUsage = true; + goto bail; + } + bundle.setOutputTextSymbols(argv[0]); } else if (strcmp(cp, "-product") == 0) { argc--; argv++; diff --git a/Resource.cpp b/Resource.cpp index 1785683..9c2e1b9 100644 --- a/Resource.cpp +++ b/Resource.cpp @@ -1852,6 +1852,110 @@ static status_t writeLayoutClasses( return hasErrors ? UNKNOWN_ERROR : NO_ERROR; } +static status_t writeTextLayoutClasses( + FILE* fp, const sp& assets, + const sp& 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 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 idents; + Vector origOrder; + Vector publicFlags; + + size_t a; + size_t NA = nsymbols->getSymbols().size(); + for (a=0; agetSymbols().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 %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= 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& assets, bool includePrivate, const sp& symbols, const String8& className, int indent, @@ -1879,7 +1983,6 @@ static status_t writeSymbolClass( continue; } String16 name(sym.name); - String8 realName(name); if (fixupSymbol(&name) != NO_ERROR) { return UNKNOWN_ERROR; } @@ -1991,6 +2094,51 @@ static status_t writeSymbolClass( return NO_ERROR; } +static status_t writeTextSymbolClass( + FILE* fp, const sp& assets, bool includePrivate, + const sp& symbols, const String8& className) +{ + size_t i; + status_t err = NO_ERROR; + + size_t N = symbols->getSymbols().size(); + for (i=0; igetSymbols().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 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& assets, const String8& package, bool includePrivate) { @@ -1998,11 +2146,15 @@ status_t writeResourceSymbols(Bundle* bundle, const sp& assets, return NO_ERROR; } + const char* textSymbolsDest = bundle->getOutputTextSymbols(); + + String8 R("R"); const size_t N = assets->getSymbols().size(); for (size_t i=0; i 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(); @@ -2034,14 +2186,14 @@ status_t writeResourceSymbols(Bundle* bundle, const sp& assets, } 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()); @@ -2050,14 +2202,37 @@ status_t writeResourceSymbols(Bundle* bundle, const sp& assets, } 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); } @@ -2067,7 +2242,6 @@ status_t writeResourceSymbols(Bundle* bundle, const sp& assets, } - class ProguardKeepSet { public: