From: Robert Greenwalt Date: Sat, 6 Jun 2009 01:53:26 +0000 (-0700) Subject: Catch when a file resource (non values) added in an overlay. X-Git-Url: https://git.saurik.com/android/aapt.git/commitdiff_plain/dd854d4c9322204ea873c2de498d6693b271952a?hp=eca7446ff64d08be71464cef5ea990ca0ef03251 Catch when a file resource (non values) added in an overlay. File resources are assigned resource id's and if an overlay adds one it renumbers things and breaks compatability. Used to segfault if you tried before, but now catches it and lets you know what file caused the problem. --- diff --git a/Resource.cpp b/Resource.cpp index 49ccf71..027e3ab 100644 --- a/Resource.cpp +++ b/Resource.cpp @@ -433,7 +433,7 @@ static void checkForIds(const String8& path, ResXMLParser& parser) } } -static void applyFileOverlay(const sp& assets, +static bool applyFileOverlay(const sp& assets, const sp& baseSet, const char *resType) { @@ -441,7 +441,7 @@ static void applyFileOverlay(const sp& assets, // Also add any found only in the overlay. sp overlay = assets->getOverlay(); String8 resTypeString(resType); - + // work through the linked list of overlays while (overlay.get()) { KeyedVector >* overlayRes = overlay->getResources(); @@ -456,7 +456,7 @@ static void applyFileOverlay(const sp& assets, size_t overlayCount = overlaySet->size(); for (size_t overlayIndex=0; overlayIndexindexOfKey(overlaySet->keyAt(overlayIndex)); - if (baseIndex != UNKNOWN_ERROR) { + if (baseIndex < UNKNOWN_ERROR) { // look for same flavor. For a given file (strings.xml, for example) // there may be a locale specific or other flavors - we want to match // the same flavor. @@ -482,9 +482,10 @@ static void applyFileOverlay(const sp& assets, } } else { // this group doesn't exist (a file that's only in the overlay) - // add it - baseSet->add(overlaySet->keyAt(overlayIndex), - overlaySet->valueAt(overlayIndex)); + fprintf(stderr, "aapt: error: " + "*** Resource file '%s' exists only in an overlay\n", + overlaySet->keyAt(overlayIndex).string()); + return false; } } // this overlay didn't have resources for this type @@ -492,7 +493,7 @@ static void applyFileOverlay(const sp& assets, // try next overlay overlay = overlay->getOverlay(); } - return; + return true; } void addTagAttribute(const sp& node, const char* ns8, @@ -618,13 +619,15 @@ status_t buildResources(Bundle* bundle, const sp& assets) current = current->getOverlay(); } // apply the overlay files to the base set - applyFileOverlay(assets, drawables, "drawable"); - applyFileOverlay(assets, layouts, "layout"); - applyFileOverlay(assets, anims, "anim"); - applyFileOverlay(assets, xmls, "xml"); - applyFileOverlay(assets, raws, "raw"); - applyFileOverlay(assets, colors, "color"); - applyFileOverlay(assets, menus, "menu"); + if (!applyFileOverlay(assets, drawables, "drawable") || + !applyFileOverlay(assets, layouts, "layout") || + !applyFileOverlay(assets, anims, "anim") || + !applyFileOverlay(assets, xmls, "xml") || + !applyFileOverlay(assets, raws, "raw") || + !applyFileOverlay(assets, colors, "color") || + !applyFileOverlay(assets, menus, "menu")) { + return UNKNOWN_ERROR; + } bool hasErrors = false;