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

Commit a495123f authored by Makoto Onuki's avatar Makoto Onuki Committed by android-build-merger
Browse files

Merge \"ShortcutManager: Optimize package scanning\" into nyc-mr1-dev

am: 3e27d125

Change-Id: Ib12942df9e948be7f7b3af704c7aef82d1b9f77f
parents 9e0a9bcc 3e27d125
Loading
Loading
Loading
Loading
+26 −12
Original line number Diff line number Diff line
@@ -113,6 +113,7 @@ import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicLong;
import java.util.function.Consumer;
import java.util.function.Predicate;
@@ -316,7 +317,7 @@ public class ShortcutService extends IShortcutService.Stub {
        int LAUNCHER_PERMISSION_CHECK = 4;
        int CLEANUP_DANGLING_BITMAPS = 5;
        int GET_ACTIVITIES_WITH_METADATA = 6;
        int GET_INSTALLED_APPLICATIONS = 7;
        int GET_INSTALLED_PACKAGES = 7;
        int CHECK_PACKAGE_CHANGES = 8;

        int COUNT = CHECK_PACKAGE_CHANGES + 1;
@@ -2282,11 +2283,17 @@ public class ShortcutService extends IShortcutService.Stub {
                        cleanUpPackageLocked(pu.packageName, ownerUserId, pu.userId);
                    }
                }
                final long now = injectCurrentTimeMillis();

                // Then for each installed app, publish manifest shortcuts when needed.
                forInstalledApplications(ownerUserId, ai -> {
                forUpdatedPackages(ownerUserId, user.getLastAppScanTime(), ai -> {
                    user.handlePackageAddedOrUpdated(ai.packageName);
                });

                // Write the time just before the scan, because there may be apps that have just
                // been updated, and we want to catch them in the next time.
                user.setLastAppScanTime(now);
                scheduleSaveUser(ownerUserId);
            }
        } finally {
            logDurationStat(Stats.CHECK_PACKAGE_CHANGES, start);
@@ -2424,12 +2431,12 @@ public class ShortcutService extends IShortcutService.Stub {

    @Nullable
    @VisibleForTesting
    List<ApplicationInfo> injectInstalledApplications(@UserIdInt int userId) {
    List<PackageInfo> injectInstalledPackages(@UserIdInt int userId) {
        final long start = injectElapsedRealtime();
        final long token = injectClearCallingIdentity();
        try {
            final ParceledListSlice<ApplicationInfo> parceledList =
                    mIPackageManager.getInstalledApplications(PACKAGE_MATCH_FLAGS, userId);
            final ParceledListSlice<PackageInfo> parceledList =
                    mIPackageManager.getInstalledPackages(PACKAGE_MATCH_FLAGS, userId);
            if (parceledList == null) {
                return Collections.emptyList();
            }
@@ -2441,18 +2448,25 @@ public class ShortcutService extends IShortcutService.Stub {
        } finally {
            injectRestoreCallingIdentity(token);

            logDurationStat(Stats.GET_INSTALLED_APPLICATIONS, start);
            logDurationStat(Stats.GET_INSTALLED_PACKAGES, start);
        }
    }

    private void forInstalledApplications(@UserIdInt int userId,
    private void forUpdatedPackages(@UserIdInt int userId, long lastScanTime,
            Consumer<ApplicationInfo> callback) {
        final List<ApplicationInfo> list = injectInstalledApplications(userId);
        if (DEBUG) {
            Slog.d(TAG, "forUpdatedPackages for user " + userId + ", lastScanTime=" + lastScanTime);
        }
        final List<PackageInfo> list = injectInstalledPackages(userId);
        for (int i = list.size() - 1; i >= 0; i--) {
            final ApplicationInfo ai = list.get(i);
            final PackageInfo pi = list.get(i);

            if ((ai.flags & ApplicationInfo.FLAG_INSTALLED) != 0) {
                callback.accept(ai);
            if (((pi.applicationInfo.flags & ApplicationInfo.FLAG_INSTALLED) != 0)
                    && (pi.lastUpdateTime >= lastScanTime)) {
                if (DEBUG) {
                    Slog.d(TAG, "Found updated package " + pi.packageName);
                }
                callback.accept(pi.applicationInfo);
            }
        }
    }
@@ -2612,7 +2626,7 @@ public class ShortcutService extends IShortcutService.Stub {
                dumpStatLS(pw, p, Stats.GET_APPLICATION_INFO, "getApplicationInfo");
                dumpStatLS(pw, p, Stats.CLEANUP_DANGLING_BITMAPS, "cleanupDanglingBitmaps");
                dumpStatLS(pw, p, Stats.GET_ACTIVITIES_WITH_METADATA, "getActivities+metadata");
                dumpStatLS(pw, p, Stats.GET_INSTALLED_APPLICATIONS, "getInstalledApplications");
                dumpStatLS(pw, p, Stats.GET_INSTALLED_PACKAGES, "getInstalledPackages");
                dumpStatLS(pw, p, Stats.CHECK_PACKAGE_CHANGES, "checkPackageChanges");
            }

+22 −0
Original line number Diff line number Diff line
@@ -52,6 +52,7 @@ class ShortcutUser {

    private static final String ATTR_VALUE = "value";
    private static final String ATTR_KNOWN_LOCALE_CHANGE_SEQUENCE_NUMBER = "locale-seq-no";
    private static final String ATTR_LAST_APP_SCAN_TIME = "last-app-scan-time";

    static final class PackageWithUser {
        final int userId;
@@ -107,6 +108,8 @@ class ShortcutUser {

    private long mKnownLocaleChangeSequenceNumber;

    private long mLastAppScanTime;

    public ShortcutUser(ShortcutService service, int userId) {
        mService = service;
        mUserId = userId;
@@ -116,6 +119,14 @@ class ShortcutUser {
        return mUserId;
    }

    public long getLastAppScanTime() {
        return mLastAppScanTime;
    }

    public void setLastAppScanTime(long lastAppScanTime) {
        mLastAppScanTime = lastAppScanTime;
    }

    // We don't expose this directly to non-test code because only ShortcutUser should add to/
    // remove from it.
    @VisibleForTesting
@@ -258,6 +269,8 @@ class ShortcutUser {

        ShortcutService.writeAttr(out, ATTR_KNOWN_LOCALE_CHANGE_SEQUENCE_NUMBER,
                mKnownLocaleChangeSequenceNumber);
        ShortcutService.writeAttr(out, ATTR_LAST_APP_SCAN_TIME,
                mLastAppScanTime);

        ShortcutService.writeTagValue(out, TAG_LAUNCHER,
                mDefaultLauncherComponent);
@@ -299,6 +312,13 @@ class ShortcutUser {
        ret.mKnownLocaleChangeSequenceNumber = ShortcutService.parseLongAttribute(parser,
                ATTR_KNOWN_LOCALE_CHANGE_SEQUENCE_NUMBER);

        // If lastAppScanTime is in the future, that means the clock went backwards.
        // Just scan all apps again.
        final long lastAppScanTime = ShortcutService.parseLongAttribute(parser,
                ATTR_LAST_APP_SCAN_TIME);
        final long currentTime = s.injectCurrentTimeMillis();
        ret.mLastAppScanTime = lastAppScanTime < currentTime ? lastAppScanTime : 0;

        final int outerDepth = parser.getDepth();
        int type;
        while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
@@ -361,6 +381,8 @@ class ShortcutUser {
        pw.print(mUserId);
        pw.print("  Known locale seq#: ");
        pw.print(mKnownLocaleChangeSequenceNumber);
        pw.print("  Last app scan: ");
        pw.print(mLastAppScanTime);
        pw.println();

        prefix += prefix + "  ";
+23 −2
Original line number Diff line number Diff line
@@ -302,8 +302,8 @@ public abstract class BaseShortcutManagerTest extends InstrumentationTestCase {
        }

        @Override
        List<ApplicationInfo> injectInstalledApplications(@UserIdInt int userId) {
            return getInstalledApplications(userId);
        List<PackageInfo> injectInstalledPackages(@UserIdInt int userId) {
            return getInstalledPackages(userId);
        }

        @Override
@@ -793,6 +793,27 @@ public abstract class BaseShortcutManagerTest extends InstrumentationTestCase {
        return ret;
    }

    private void addPackageInfo(PackageInfo pi, List<PackageInfo> list) {
        if (pi != null) {
            list.add(pi);
        }
    }

    private List<PackageInfo> getInstalledPackages(int userId) {
        final ArrayList<PackageInfo> ret = new ArrayList<>();

        addPackageInfo(getInjectedPackageInfo(CALLING_PACKAGE_1, userId, false), ret);
        addPackageInfo(getInjectedPackageInfo(CALLING_PACKAGE_2, userId, false), ret);
        addPackageInfo(getInjectedPackageInfo(CALLING_PACKAGE_3, userId, false), ret);
        addPackageInfo(getInjectedPackageInfo(CALLING_PACKAGE_4, userId, false), ret);
        addPackageInfo(getInjectedPackageInfo(LAUNCHER_1, userId, false), ret);
        addPackageInfo(getInjectedPackageInfo(LAUNCHER_2, userId, false), ret);
        addPackageInfo(getInjectedPackageInfo(LAUNCHER_3, userId, false), ret);
        addPackageInfo(getInjectedPackageInfo(LAUNCHER_4, userId, false), ret);

        return ret;
    }

    protected void addManifestShortcutResource(ComponentName activity, int resId) {
        final String packageName = activity.getPackageName();
        LinkedHashMap<ComponentName, Integer> map = mActivityMetadataResId.get(packageName);