From: Robert Greenwalt Date: Mon, 31 Aug 2009 21:48:20 +0000 (-0700) Subject: Fix replacement-after-add of resource files in overlay. X-Git-Url: https://git.saurik.com/android/aapt.git/commitdiff_plain/21c5c61adf6057d794d60b3623af4506bcc182e6 Fix replacement-after-add of resource files in overlay. Aapt was adding/removing elements from a list an continuing to use a stale copy for future indexes. This could cause incorrect subsequent processing. Add an en resource and modify an es, for example. Adding the en would cause the base fileset's es version to be moved in the list. Using the old index we'd then attempt to remove the old es version with the wrong index and then add the new es version generating a "duplicate file" error. bug: 2090015 --- diff --git a/Resource.cpp b/Resource.cpp index 4c9853d..1084992 100644 --- a/Resource.cpp +++ b/Resource.cpp @@ -428,10 +428,15 @@ static void checkForIds(const String8& path, ResXMLParser& parser) } } -static bool applyFileOverlay(const sp& assets, +static bool applyFileOverlay(Bundle *bundle, + const sp& assets, const sp& baseSet, const char *resType) { + if (bundle->getVerbose()) { + printf("applyFileOverlay for %s\n", resType); + } + // Replace any base level files in this category with any found from the overlay // Also add any found only in the overlay. sp overlay = assets->getOverlay(); @@ -450,6 +455,9 @@ static bool applyFileOverlay(const sp& assets, // non-overlay "baseset". size_t overlayCount = overlaySet->size(); for (size_t overlayIndex=0; overlayIndexgetVerbose()) { + printf("trying overlaySet Key=%s\n",overlaySet->keyAt(overlayIndex).string()); + } size_t baseIndex = baseSet->indexOfKey(overlaySet->keyAt(overlayIndex)); if (baseIndex < UNKNOWN_ERROR) { // look for same flavor. For a given file (strings.xml, for example) @@ -457,18 +465,36 @@ static bool applyFileOverlay(const sp& assets, // the same flavor. sp overlayGroup = overlaySet->valueAt(overlayIndex); sp baseGroup = baseSet->valueAt(baseIndex); - - DefaultKeyedVector > baseFiles = - baseGroup->getFiles(); - DefaultKeyedVector > overlayFiles = + + DefaultKeyedVector > overlayFiles = overlayGroup->getFiles(); + if (bundle->getVerbose()) { + DefaultKeyedVector > baseFiles = + baseGroup->getFiles(); + for (size_t i=0; i < baseFiles.size(); i++) { + printf("baseFile %d has flavor %s\n", i, + baseFiles.keyAt(i).toString().string()); + } + for (size_t i=0; i < overlayFiles.size(); i++) { + printf("overlayFile %d has flavor %s\n", i, + overlayFiles.keyAt(i).toString().string()); + } + } + size_t overlayGroupSize = overlayFiles.size(); - for (size_t overlayGroupIndex = 0; - overlayGroupIndexgetFiles().indexOfKey(overlayFiles. + keyAt(overlayGroupIndex)); if(baseFileIndex < UNKNOWN_ERROR) { + if (bundle->getVerbose()) { + printf("found a match (%d) for overlay file %s, for flavor %s\n", + baseFileIndex, + overlayGroup->getLeaf().string(), + overlayFiles.keyAt(overlayGroupIndex).toString().string()); + } baseGroup->removeFile(baseFileIndex); } else { // didn't find a match fall through and add it.. @@ -482,11 +508,11 @@ static bool applyFileOverlay(const sp& assets, overlaySet->valueAt(overlayIndex)); // make sure all flavors are defined in the resources. sp overlayGroup = overlaySet->valueAt(overlayIndex); - DefaultKeyedVector > overlayFiles = + DefaultKeyedVector > overlayFiles = overlayGroup->getFiles(); size_t overlayGroupSize = overlayFiles.size(); - for (size_t overlayGroupIndex = 0; - overlayGroupIndexaddGroupEntry(overlayFiles.keyAt(overlayGroupIndex)); } @@ -623,13 +649,13 @@ status_t buildResources(Bundle* bundle, const sp& assets) current = current->getOverlay(); } // apply the overlay files to the base set - 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")) { + if (!applyFileOverlay(bundle, assets, drawables, "drawable") || + !applyFileOverlay(bundle, assets, layouts, "layout") || + !applyFileOverlay(bundle, assets, anims, "anim") || + !applyFileOverlay(bundle, assets, xmls, "xml") || + !applyFileOverlay(bundle, assets, raws, "raw") || + !applyFileOverlay(bundle, assets, colors, "color") || + !applyFileOverlay(bundle, assets, menus, "menu")) { return UNKNOWN_ERROR; }