diff options
author | Adam Lesinski <adamlesinski@google.com> | 2013-10-15 17:18:51 -0700 |
---|---|---|
committer | Adam Lesinski <adamlesinski@google.com> | 2013-10-15 17:18:51 -0700 |
commit | 9438c2df133710ea2364e817cfd237f7a3d69ab1 (patch) | |
tree | 19d1315592338138a75361b10345479d41faf026 | |
parent | 7d91cc97d788aae9f3a6ac5540580cc95591e356 (diff) | |
download | frameworks_base-9438c2df133710ea2364e817cfd237f7a3d69ab1.zip frameworks_base-9438c2df133710ea2364e817cfd237f7a3d69ab1.tar.gz frameworks_base-9438c2df133710ea2364e817cfd237f7a3d69ab1.tar.bz2 |
Prune unneeded density resources from APK
When a preferred density is specified, prune all but the
closest matching density when the exact density resource does not
exist.
If a preferred density resource does not exist and a higher density
resource exists, prune all but the resource with the next highest
density relative to the preferred density.
If a preferred density resource does not exist and there is no
higher density resource, prune all but the resource with the next
lowest density relative to the preferred density.
bug:11224465
Change-Id: I99b3950fe3d8116a5625968ed383442315ae8526
-rw-r--r-- | tools/aapt/AaptAssets.cpp | 39 |
1 files changed, 38 insertions, 1 deletions
diff --git a/tools/aapt/AaptAssets.cpp b/tools/aapt/AaptAssets.cpp index 3797b49..d8e113a 100644 --- a/tools/aapt/AaptAssets.cpp +++ b/tools/aapt/AaptAssets.cpp @@ -2487,6 +2487,15 @@ status_t AaptAssets::filter(Bundle* bundle) continue; } + // Get the preferred density if there is one. We do not match exactly for density. + // If our preferred density is hdpi but we only have mdpi and xhdpi resources, we + // pick xhdpi. + uint32_t preferredDensity = 0; + const SortedVector<uint32_t>* preferredConfigs = prefFilter.configsForAxis(AXIS_DENSITY); + if (preferredConfigs != NULL && preferredConfigs->size() > 0) { + preferredDensity = (*preferredConfigs)[0]; + } + // Now deal with preferred configurations. for (int axis=AXIS_START; axis<=AXIS_END; axis++) { for (size_t k=0; k<grp->getFiles().size(); k++) { @@ -2512,12 +2521,30 @@ status_t AaptAssets::filter(Bundle* bundle) // This is a resource we would prefer not to have. Check // to see if have a similar variation that we would like // to have and, if so, we can drop it. + + uint32_t bestDensity = config.density; + for (size_t m=0; m<grp->getFiles().size(); m++) { if (m == k) continue; sp<AaptFile> mfile = grp->getFiles().valueAt(m); const ResTable_config& mconfig(mfile->getGroupEntry().toParams()); if (AaptGroupEntry::configSameExcept(config, mconfig, axis)) { - if (prefFilter.match(axis, mconfig)) { + if (axis == AXIS_DENSITY && preferredDensity > 0) { + // See if there is a better density resource + if (mconfig.density < bestDensity && + mconfig.density > preferredDensity && + bestDensity > preferredDensity) { + // This density is between our best density and + // the preferred density, therefore it is better. + bestDensity = mconfig.density; + } else if (mconfig.density > bestDensity && + bestDensity < preferredDensity) { + // This density is better than our best density and + // our best density was smaller than our preferred + // density, so it is better. + bestDensity = mconfig.density; + } + } else if (prefFilter.match(axis, mconfig)) { if (bundle->getVerbose()) { printf("Pruning unneeded resource: %s\n", file->getPrintableSource().string()); @@ -2528,6 +2555,16 @@ status_t AaptAssets::filter(Bundle* bundle) } } } + + if (axis == AXIS_DENSITY && preferredDensity > 0 && + bestDensity != config.density) { + if (bundle->getVerbose()) { + printf("Pruning unneeded resource: %s\n", + file->getPrintableSource().string()); + } + grp->removeFile(k); + k--; + } } } } |