diff options
author | Robert Greenwalt <robdroid@android.com> | 2009-08-31 14:48:20 -0700 |
---|---|---|
committer | Robert Greenwalt <robdroid@android.com> | 2009-08-31 14:56:28 -0700 |
commit | 832528f92c8d6995318777ead009da20963bcf7a (patch) | |
tree | 1751ed0ae2812c818ec20ea28229665efd66bdf2 /tools | |
parent | 3e59cf7ede6d6c66cbb0b1e1f345cf132972a713 (diff) | |
download | frameworks_base-832528f92c8d6995318777ead009da20963bcf7a.zip frameworks_base-832528f92c8d6995318777ead009da20963bcf7a.tar.gz frameworks_base-832528f92c8d6995318777ead009da20963bcf7a.tar.bz2 |
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
Diffstat (limited to 'tools')
-rw-r--r-- | tools/aapt/Resource.cpp | 64 |
1 files changed, 45 insertions, 19 deletions
diff --git a/tools/aapt/Resource.cpp b/tools/aapt/Resource.cpp index 4c9853d..10849921 100644 --- a/tools/aapt/Resource.cpp +++ b/tools/aapt/Resource.cpp @@ -428,10 +428,15 @@ static void checkForIds(const String8& path, ResXMLParser& parser) } } -static bool applyFileOverlay(const sp<AaptAssets>& assets, +static bool applyFileOverlay(Bundle *bundle, + const sp<AaptAssets>& assets, const sp<ResourceTypeSet>& 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<AaptAssets> overlay = assets->getOverlay(); @@ -450,6 +455,9 @@ static bool applyFileOverlay(const sp<AaptAssets>& assets, // non-overlay "baseset". size_t overlayCount = overlaySet->size(); for (size_t overlayIndex=0; overlayIndex<overlayCount; overlayIndex++) { + if (bundle->getVerbose()) { + 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<AaptAssets>& assets, // the same flavor. sp<AaptGroup> overlayGroup = overlaySet->valueAt(overlayIndex); sp<AaptGroup> baseGroup = baseSet->valueAt(baseIndex); - - DefaultKeyedVector<AaptGroupEntry, sp<AaptFile> > baseFiles = - baseGroup->getFiles(); - DefaultKeyedVector<AaptGroupEntry, sp<AaptFile> > overlayFiles = + + DefaultKeyedVector<AaptGroupEntry, sp<AaptFile> > overlayFiles = overlayGroup->getFiles(); + if (bundle->getVerbose()) { + DefaultKeyedVector<AaptGroupEntry, sp<AaptFile> > 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; - overlayGroupIndex<overlayGroupSize; + for (size_t overlayGroupIndex = 0; + overlayGroupIndex<overlayGroupSize; overlayGroupIndex++) { - size_t baseFileIndex = - baseFiles.indexOfKey(overlayFiles.keyAt(overlayGroupIndex)); + size_t baseFileIndex = + baseGroup->getFiles().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<AaptAssets>& assets, overlaySet->valueAt(overlayIndex)); // make sure all flavors are defined in the resources. sp<AaptGroup> overlayGroup = overlaySet->valueAt(overlayIndex); - DefaultKeyedVector<AaptGroupEntry, sp<AaptFile> > overlayFiles = + DefaultKeyedVector<AaptGroupEntry, sp<AaptFile> > overlayFiles = overlayGroup->getFiles(); size_t overlayGroupSize = overlayFiles.size(); - for (size_t overlayGroupIndex = 0; - overlayGroupIndex<overlayGroupSize; + for (size_t overlayGroupIndex = 0; + overlayGroupIndex<overlayGroupSize; overlayGroupIndex++) { assets->addGroupEntry(overlayFiles.keyAt(overlayGroupIndex)); } @@ -623,13 +649,13 @@ status_t buildResources(Bundle* bundle, const sp<AaptAssets>& 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; } |