Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 16e8c4f7 authored by Adam Lesinski's avatar Adam Lesinski Committed by Android Git Automerger
Browse files

am 7d292145: Merge "Prune unneeded density resources from APK" into klp-dev

* commit '7d292145':
  Prune unneeded density resources from APK
parents 0acad1de 7d292145
Loading
Loading
Loading
Loading
+38 −1
Original line number Diff line number Diff line
@@ -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--;
                        }
                    }
                }
            }