Loading tools/aapt/Bundle.h +5 −1 Original line number Diff line number Diff line Loading @@ -62,7 +62,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), mArgc(0), mArgv(NULL) mUseCrunchCache(false), mOutputTextSymbols(NULL), mArgc(0), mArgv(NULL) {} ~Bundle(void) {} Loading Loading @@ -174,6 +175,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. Loading Loading @@ -280,6 +283,7 @@ private: bool mNonConstantId; const char* mProduct; bool mUseCrunchCache; const char* mOutputTextSymbols; /* file specification */ int mArgc; Loading tools/aapt/Main.cpp +14 −1 Original line number Diff line number Diff line Loading @@ -70,7 +70,8 @@ void usage(void) " [--product product1,product2,...] \\\n" " [-c CONFIGS] [--preferred-configurations CONFIGS] \\\n" " [-o] \\\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" Loading Loading @@ -179,6 +180,9 @@ void usage(void) " Make the resources ID non constant. This is required to make an R java class\n" " that does not contain the final value but is used to make reusable compiled\n" " libraries that need to access resources.\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", Loading Loading @@ -547,6 +551,15 @@ int main(int argc, char* const argv[]) bundle.setInstrumentationPackageNameOverride(argv[0]); } else if (strcmp(cp, "-auto-add-overlay") == 0) { bundle.setAutoAddOverlay(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++; Loading tools/aapt/Resource.cpp +186 −12 Original line number Diff line number Diff line Loading @@ -1821,6 +1821,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, Loading Loading @@ -1848,7 +1952,6 @@ static status_t writeSymbolClass( continue; } String16 name(sym.name); String8 realName(name); if (fixupSymbol(&name) != NO_ERROR) { return UNKNOWN_ERROR; } Loading Loading @@ -1960,6 +2063,51 @@ static status_t writeSymbolClass( 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) { Loading @@ -1967,11 +2115,15 @@ status_t writeResourceSymbols(Bundle* bundle, const sp<AaptAssets>& 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<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(); Loading Loading @@ -2019,14 +2171,37 @@ status_t writeResourceSymbols(Bundle* bundle, const sp<AaptAssets>& 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); } Loading @@ -2036,7 +2211,6 @@ status_t writeResourceSymbols(Bundle* bundle, const sp<AaptAssets>& assets, } class ProguardKeepSet { public: Loading Loading
tools/aapt/Bundle.h +5 −1 Original line number Diff line number Diff line Loading @@ -62,7 +62,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), mArgc(0), mArgv(NULL) mUseCrunchCache(false), mOutputTextSymbols(NULL), mArgc(0), mArgv(NULL) {} ~Bundle(void) {} Loading Loading @@ -174,6 +175,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. Loading Loading @@ -280,6 +283,7 @@ private: bool mNonConstantId; const char* mProduct; bool mUseCrunchCache; const char* mOutputTextSymbols; /* file specification */ int mArgc; Loading
tools/aapt/Main.cpp +14 −1 Original line number Diff line number Diff line Loading @@ -70,7 +70,8 @@ void usage(void) " [--product product1,product2,...] \\\n" " [-c CONFIGS] [--preferred-configurations CONFIGS] \\\n" " [-o] \\\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" Loading Loading @@ -179,6 +180,9 @@ void usage(void) " Make the resources ID non constant. This is required to make an R java class\n" " that does not contain the final value but is used to make reusable compiled\n" " libraries that need to access resources.\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", Loading Loading @@ -547,6 +551,15 @@ int main(int argc, char* const argv[]) bundle.setInstrumentationPackageNameOverride(argv[0]); } else if (strcmp(cp, "-auto-add-overlay") == 0) { bundle.setAutoAddOverlay(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++; Loading
tools/aapt/Resource.cpp +186 −12 Original line number Diff line number Diff line Loading @@ -1821,6 +1821,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, Loading Loading @@ -1848,7 +1952,6 @@ static status_t writeSymbolClass( continue; } String16 name(sym.name); String8 realName(name); if (fixupSymbol(&name) != NO_ERROR) { return UNKNOWN_ERROR; } Loading Loading @@ -1960,6 +2063,51 @@ static status_t writeSymbolClass( 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) { Loading @@ -1967,11 +2115,15 @@ status_t writeResourceSymbols(Bundle* bundle, const sp<AaptAssets>& 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<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(); Loading Loading @@ -2019,14 +2171,37 @@ status_t writeResourceSymbols(Bundle* bundle, const sp<AaptAssets>& 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); } Loading @@ -2036,7 +2211,6 @@ status_t writeResourceSymbols(Bundle* bundle, const sp<AaptAssets>& assets, } class ProguardKeepSet { public: Loading