summaryrefslogtreecommitdiffstats
path: root/tools/aapt/ResourceTable.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tools/aapt/ResourceTable.cpp')
-rw-r--r--tools/aapt/ResourceTable.cpp46
1 files changed, 42 insertions, 4 deletions
diff --git a/tools/aapt/ResourceTable.cpp b/tools/aapt/ResourceTable.cpp
index a2f085a..a84492d 100644
--- a/tools/aapt/ResourceTable.cpp
+++ b/tools/aapt/ResourceTable.cpp
@@ -12,6 +12,8 @@
#include <utils/ResourceTypes.h>
#include <stdarg.h>
+#include <set>
+
#define NOISY(x) //x
status_t compileXmlFile(const sp<AaptAssets>& assets,
@@ -2516,6 +2518,34 @@ ResourceFilter::match(const ResTable_config& config)
return true;
}
+class entry_sort_t {
+public:
+ sp<ResourceTable::Package> p;
+ sp<ResourceTable::Type> t;
+ sp<ResourceTable::ConfigList> c;
+ ResourceTable::ConfigDescription config;
+ sp<ResourceTable::Entry> e;
+
+ entry_sort_t() { }
+ entry_sort_t(
+ sp<ResourceTable::Package> p,
+ sp<ResourceTable::Type> t,
+ sp<ResourceTable::ConfigList> c,
+ const ResourceTable::ConfigDescription &config,
+ sp<ResourceTable::Entry> e)
+ : p(p), t(t), c(c), config(config), e(e) { }
+
+ bool operator < (const entry_sort_t &o) const {
+ int cmp;
+ if ((cmp = compare_type(config, o.config))) return cmp < 0;
+ if ((cmp = compare_type(t, o.t))) return cmp < 0;
+ if ((cmp = compare_type(e, o.e))) return cmp < 0;
+ if ((cmp = compare_type(c, o.c))) return cmp < 0;
+ if ((cmp = compare_type(p, o.p))) return cmp < 0;
+ return false;
+ }
+};
+
status_t ResourceTable::flatten(Bundle* bundle, const sp<AaptFile>& dest)
{
ResourceFilter filter;
@@ -2528,6 +2558,7 @@ status_t ResourceTable::flatten(Bundle* bundle, const sp<AaptFile>& dest)
size_t pi;
bool useUTF8 = !bundle->getWantUTF16() && bundle->isMinSdkAtLeast(SDK_FROYO);
+ std::set< entry_sort_t > sortedEntries;
// Iterate through all data, collecting all values (strings,
// references, etc).
@@ -2568,10 +2599,7 @@ status_t ResourceTable::flatten(Bundle* bundle, const sp<AaptFile>& dest)
continue;
}
e->setNameIndex(keyStrings.add(e->getName(), true));
- status_t err = e->prepareFlatten(&valueStrings, this);
- if (err != NO_ERROR) {
- return err;
- }
+ sortedEntries.insert(entry_sort_t(p, t, c, config, e));
}
}
}
@@ -2580,6 +2608,16 @@ status_t ResourceTable::flatten(Bundle* bundle, const sp<AaptFile>& dest)
p->setKeyStrings(keyStrings.createStringBlock());
}
+ for (std::set< entry_sort_t >::iterator ei=sortedEntries.begin(); ei!=sortedEntries.end(); ++ei) {
+ sp<Entry> e = ei->e;
+ status_t err = e->prepareFlatten(&valueStrings, this);
+ if (err != NO_ERROR) {
+ return err;
+ }
+ }
+
+ sortedEntries.clear();
+
ssize_t strAmt = 0;
// Now build the array of package chunks.