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

Commit 01de4efc authored by Rhed Jao's avatar Rhed Jao
Browse files

Log metrics for package manager Snapshot and AppsFilter

Bug: 247671650
Bug: 253416514
Test: atest AppsFilterImplTest
Change-Id: I6be39dfc3207a7d9d6d4db4188e031190a3cd070
parent 1bfc06ed
Loading
Loading
Loading
Loading
+78 −8
Original line number Diff line number Diff line
@@ -22,6 +22,15 @@ import static android.os.UserHandle.USER_NULL;
import static android.provider.DeviceConfig.NAMESPACE_PACKAGE_MANAGER_SERVICE;

import static com.android.internal.annotations.VisibleForTesting.Visibility.PRIVATE;
import static com.android.internal.util.FrameworkStatsLog.PACKAGE_MANAGER_APPS_FILTER_CACHE_BUILD_REPORTED;
import static com.android.internal.util.FrameworkStatsLog.PACKAGE_MANAGER_APPS_FILTER_CACHE_BUILD_REPORTED__EVENT_TYPE__BOOT;
import static com.android.internal.util.FrameworkStatsLog.PACKAGE_MANAGER_APPS_FILTER_CACHE_BUILD_REPORTED__EVENT_TYPE__USER_CREATED;
import static com.android.internal.util.FrameworkStatsLog.PACKAGE_MANAGER_APPS_FILTER_CACHE_BUILD_REPORTED__EVENT_TYPE__USER_DELETED;
import static com.android.internal.util.FrameworkStatsLog.PACKAGE_MANAGER_APPS_FILTER_CACHE_UPDATE_REPORTED;
import static com.android.internal.util.FrameworkStatsLog.PACKAGE_MANAGER_APPS_FILTER_CACHE_UPDATE_REPORTED__EVENT_TYPE__COMPAT_CHANGED;
import static com.android.internal.util.FrameworkStatsLog.PACKAGE_MANAGER_APPS_FILTER_CACHE_UPDATE_REPORTED__EVENT_TYPE__PACKAGE_ADDED;
import static com.android.internal.util.FrameworkStatsLog.PACKAGE_MANAGER_APPS_FILTER_CACHE_UPDATE_REPORTED__EVENT_TYPE__PACKAGE_DELETED;
import static com.android.internal.util.FrameworkStatsLog.PACKAGE_MANAGER_APPS_FILTER_CACHE_UPDATE_REPORTED__EVENT_TYPE__PACKAGE_REPLACED;
import static com.android.server.pm.AppsFilterUtils.canQueryAsInstaller;
import static com.android.server.pm.AppsFilterUtils.canQueryViaComponents;
import static com.android.server.pm.AppsFilterUtils.canQueryViaPackage;
@@ -36,6 +45,7 @@ import android.content.pm.PackageManagerInternal;
import android.content.pm.SigningDetails;
import android.content.pm.UserInfo;
import android.os.Handler;
import android.os.SystemClock;
import android.os.SystemProperties;
import android.os.Trace;
import android.os.UserHandle;
@@ -49,6 +59,7 @@ import com.android.internal.R;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.ArrayUtils;
import com.android.internal.util.FrameworkStatsLog;
import com.android.server.FgThread;
import com.android.server.compat.CompatChange;
import com.android.server.om.OverlayReferenceMapper;
@@ -351,8 +362,15 @@ public final class AppsFilterImpl extends AppsFilterLocked implements Watchable,
            if (pkg == null) {
                return;
            }
            final long currentTimeUs = SystemClock.currentTimeMicro();
            updateEnabledState(pkg);
            mAppsFilter.updateShouldFilterCacheForPackage(snapshot, packageName);
            mAppsFilter.logCacheUpdated(
                    PACKAGE_MANAGER_APPS_FILTER_CACHE_UPDATE_REPORTED__EVENT_TYPE__COMPAT_CHANGED,
                    SystemClock.currentTimeMicro() - currentTimeUs,
                    snapshot.getUserInfos().length,
                    snapshot.getPackageStates().size(),
                    pkg.getUid());
        }

        private void updateEnabledState(@NonNull AndroidPackage pkg) {
@@ -465,7 +483,8 @@ public final class AppsFilterImpl extends AppsFilterLocked implements Watchable,
        mOverlayReferenceMapper.rebuildIfDeferred();
        mFeatureConfig.onSystemReady();

        updateEntireShouldFilterCacheAsync(pmInternal);
        updateEntireShouldFilterCacheAsync(pmInternal,
                PACKAGE_MANAGER_APPS_FILTER_CACHE_BUILD_REPORTED__EVENT_TYPE__BOOT);
    }

    /**
@@ -476,13 +495,17 @@ public final class AppsFilterImpl extends AppsFilterLocked implements Watchable,
     */
    public void addPackage(Computer snapshot, PackageStateInternal newPkgSetting,
            boolean isReplace) {
        final long currentTimeUs = SystemClock.currentTimeMicro();
        final int logType = isReplace
                ? PACKAGE_MANAGER_APPS_FILTER_CACHE_UPDATE_REPORTED__EVENT_TYPE__PACKAGE_REPLACED
                : PACKAGE_MANAGER_APPS_FILTER_CACHE_UPDATE_REPORTED__EVENT_TYPE__PACKAGE_ADDED;
        if (DEBUG_TRACING) {
            Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "filter.addPackage");
        }
        try {
            if (isReplace) {
                // let's first remove any prior rules for this package
                removePackage(snapshot, newPkgSetting, true /*isReplace*/);
                removePackageInternal(snapshot, newPkgSetting, true /*isReplace*/);
            }
            final ArrayMap<String, ? extends PackageStateInternal> settings =
                    snapshot.getPackageStates();
@@ -508,6 +531,8 @@ public final class AppsFilterImpl extends AppsFilterLocked implements Watchable,
                        }
                    }
                }
                logCacheUpdated(logType, SystemClock.currentTimeMicro() - currentTimeUs,
                        users.length, settings.size(), newPkgSetting.getAppId());
            } else {
                invalidateCache("addPackage: " + newPkgSetting.getPackageName());
            }
@@ -757,18 +782,19 @@ public final class AppsFilterImpl extends AppsFilterLocked implements Watchable,
        }
    }

    private void updateEntireShouldFilterCacheAsync(PackageManagerInternal pmInternal) {
        updateEntireShouldFilterCacheAsync(pmInternal, CACHE_REBUILD_DELAY_MIN_MS);
    private void updateEntireShouldFilterCacheAsync(PackageManagerInternal pmInternal, int reason) {
        updateEntireShouldFilterCacheAsync(pmInternal, CACHE_REBUILD_DELAY_MIN_MS, reason);
    }

    private void updateEntireShouldFilterCacheAsync(PackageManagerInternal pmInternal,
            long delayMs) {
            long delayMs, int reason) {
        mBackgroundHandler.postDelayed(() -> {
            if (!mCacheValid.compareAndSet(CACHE_INVALID, CACHE_VALID)) {
                // Cache is already valid.
                return;
            }

            final long currentTimeUs = SystemClock.currentTimeMicro();
            final ArrayMap<String, AndroidPackage> packagesCache = new ArrayMap<>();
            final UserInfo[][] usersRef = new UserInfo[1][];
            final Computer snapshot = (Computer) pmInternal.snapshot();
@@ -787,11 +813,13 @@ public final class AppsFilterImpl extends AppsFilterLocked implements Watchable,

            updateEntireShouldFilterCacheInner(snapshot, settings, usersRef[0], USER_ALL);
            onChanged();
            logCacheRebuilt(reason, SystemClock.currentTimeMicro() - currentTimeUs,
                    users.length, settings.size());

            if (!mCacheValid.compareAndSet(CACHE_VALID, CACHE_VALID)) {
                Slog.i(TAG, "Cache invalidated while building, retrying.");
                updateEntireShouldFilterCacheAsync(pmInternal,
                        Math.min(delayMs * 2, CACHE_REBUILD_DELAY_MAX_MS));
                        Math.min(delayMs * 2, CACHE_REBUILD_DELAY_MAX_MS), reason);
                return;
            }

@@ -803,15 +831,27 @@ public final class AppsFilterImpl extends AppsFilterLocked implements Watchable,
        if (!mCacheReady) {
            return;
        }
        final long currentTimeUs = SystemClock.currentTimeMicro();
        updateEntireShouldFilterCache(snapshot, newUserId);
        logCacheRebuilt(
                PACKAGE_MANAGER_APPS_FILTER_CACHE_BUILD_REPORTED__EVENT_TYPE__USER_CREATED,
                SystemClock.currentTimeMicro() - currentTimeUs,
                snapshot.getUserInfos().length,
                snapshot.getPackageStates().size());
    }

    public void onUserDeleted(@UserIdInt int userId) {
    public void onUserDeleted(Computer snapshot, @UserIdInt int userId) {
        if (!mCacheReady) {
            return;
        }
        final long currentTimeUs = SystemClock.currentTimeMicro();
        removeShouldFilterCacheForUser(userId);
        onChanged();
        logCacheRebuilt(
                PACKAGE_MANAGER_APPS_FILTER_CACHE_BUILD_REPORTED__EVENT_TYPE__USER_DELETED,
                SystemClock.currentTimeMicro() - currentTimeUs,
                snapshot.getUserInfos().length,
                snapshot.getPackageStates().size());
    }

    private void updateShouldFilterCacheForPackage(Computer snapshot,
@@ -985,13 +1025,29 @@ public final class AppsFilterImpl extends AppsFilterLocked implements Watchable,
        addPackage(snapshot, newPkgSetting, false /* isReplace */);
    }

    /**
     * Removes a package for consideration when filtering visibility between apps.
     *
     * @param setting the setting of the package being removed.
     */
    public void removePackage(Computer snapshot, PackageStateInternal setting) {
        final long currentTimeUs = SystemClock.currentTimeMicro();
        removePackageInternal(snapshot, setting, false /* isReplace */);
        logCacheUpdated(
                PACKAGE_MANAGER_APPS_FILTER_CACHE_UPDATE_REPORTED__EVENT_TYPE__PACKAGE_DELETED,
                SystemClock.currentTimeMicro() - currentTimeUs,
                snapshot.getUserInfos().length,
                snapshot.getPackageStates().size(),
                setting.getAppId());
    }

    /**
     * Removes a package for consideration when filtering visibility between apps.
     *
     * @param setting   the setting of the package being removed.
     * @param isReplace if the package is being replaced.
     */
    public void removePackage(Computer snapshot, PackageStateInternal setting,
    private void removePackageInternal(Computer snapshot, PackageStateInternal setting,
            boolean isReplace) {
        final ArraySet<String> additionalChangedPackages;
        final ArrayMap<String, ? extends PackageStateInternal> settings =
@@ -1174,4 +1230,18 @@ public final class AppsFilterImpl extends AppsFilterLocked implements Watchable,
            }
        }
    }

    private void logCacheRebuilt(int eventId, long latency, int userCount, int packageCount) {
        FrameworkStatsLog.write(PACKAGE_MANAGER_APPS_FILTER_CACHE_BUILD_REPORTED,
                eventId, latency, userCount, packageCount, mShouldFilterCache.size());
    }

    private void logCacheUpdated(int eventId, long latency, int userCount, int packageCount,
            int appId) {
        if (!mCacheReady) {
            return;
        }
        FrameworkStatsLog.write(PACKAGE_MANAGER_APPS_FILTER_CACHE_UPDATE_REPORTED,
                eventId, appId, latency, userCount, packageCount, mShouldFilterCache.size());
    }
}
+2 −2
Original line number Diff line number Diff line
@@ -1147,7 +1147,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService
        var done = SystemClock.currentTimeMicro();

        if (mSnapshotStatistics != null) {
            mSnapshotStatistics.rebuild(now, done, hits);
            mSnapshotStatistics.rebuild(now, done, hits, newSnapshot.getPackageStates().size());
        }
        return newSnapshot;
    }
@@ -4220,7 +4220,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService
            mSettings.removeUserLPw(userId);
            mPendingBroadcasts.remove(userId);
            mDeletePackageHelper.removeUnusedPackagesLPw(userManager, userId);
            mAppsFilter.onUserDeleted(userId);
            mAppsFilter.onUserDeleted(snapshotComputer(), userId);
        }
        mInstantAppRegistry.onUserRemoved(userId);
    }
+1 −1
Original line number Diff line number Diff line
@@ -308,7 +308,7 @@ final class RemovePackageHelper {
                mPm.mSettings.getKeySetManagerService().removeAppKeySetDataLPw(packageName);
                final Computer snapshot = mPm.snapshotComputer();
                mPm.mAppsFilter.removePackage(snapshot,
                        snapshot.getPackageStateInternal(packageName), false /* isReplace */);
                        snapshot.getPackageStateInternal(packageName));
                removedAppId = mPm.mSettings.removePackageLPw(packageName);
                if (outInfo != null) {
                    outInfo.mRemovedAppId = removedAppId;
+79 −38
Original line number Diff line number Diff line
@@ -24,11 +24,13 @@ import android.os.SystemClock;
import android.text.TextUtils;

import com.android.internal.annotations.GuardedBy;
import com.android.internal.util.FrameworkStatsLog;
import com.android.server.EventLogTags;

import java.io.PrintWriter;
import java.util.Arrays;
import java.util.Locale;
import java.util.concurrent.TimeUnit;

/**
 * This class records statistics about PackageManagerService snapshots.  It maintains two sets of
@@ -59,9 +61,9 @@ public class SnapshotStatistics {
    public static final int SNAPSHOT_TICK_INTERVAL_MS = 60 * 1000;

    /**
     * The number of ticks for long statistics.  This is one week.
     * The interval of the snapshot statistics logging.
     */
    public static final int SNAPSHOT_LONG_TICKS = 7 * 24 * 60;
    private static final long SNAPSHOT_LOG_INTERVAL_US = TimeUnit.DAYS.toMicros(1);

    /**
     * The number snapshot event logs that can be generated in a single logging interval.
@@ -92,6 +94,28 @@ public class SnapshotStatistics {
     */
    public static final int SNAPSHOT_SHORT_LIFETIME = 5;

    /**
     *  Buckets to represent a range of the rebuild latency for the histogram of
     *  snapshot rebuild latency.
     */
    private static final int REBUILD_LATENCY_BUCKET_LESS_THAN_1_MILLIS = 1;
    private static final int REBUILD_LATENCY_BUCKET_LESS_THAN_2_MILLIS = 2;
    private static final int REBUILD_LATENCY_BUCKET_LESS_THAN_5_MILLIS = 5;
    private static final int REBUILD_LATENCY_BUCKET_LESS_THAN_10_MILLIS = 10;
    private static final int REBUILD_LATENCY_BUCKET_LESS_THAN_20_MILLIS = 20;
    private static final int REBUILD_LATENCY_BUCKET_LESS_THAN_50_MILLIS = 50;
    private static final int REBUILD_LATENCY_BUCKET_LESS_THAN_100_MILLIS = 100;

    /**
     *  Buckets to represent a range of the reuse count for the histogram of
     *  snapshot reuse counts.
     */
    private static final int REUSE_COUNT_BUCKET_LESS_THAN_1 = 1;
    private static final int REUSE_COUNT_BUCKET_LESS_THAN_10 = 10;
    private static final int REUSE_COUNT_BUCKET_LESS_THAN_100 = 100;
    private static final int REUSE_COUNT_BUCKET_LESS_THAN_1000 = 1000;
    private static final int REUSE_COUNT_BUCKET_LESS_THAN_10000 = 10000;

    /**
     * The lock to control access to this object.
     */
@@ -112,11 +136,6 @@ public class SnapshotStatistics {
     */
    private int mEventsReported = 0;

    /**
     * The tick counter.  At the default tick interval, this wraps every 4000 years or so.
     */
    private int mTicks = 0;

    /**
     * The handler used for the periodic ticks.
     */
@@ -139,8 +158,6 @@ public class SnapshotStatistics {

        // The number of bins
        private int mCount;
        // The mapping of low integers to bins
        private int[] mBinMap;
        // The maximum mapped value.  Values at or above this are mapped to the
        // top bin.
        private int mMaxBin;
@@ -158,16 +175,6 @@ public class SnapshotStatistics {
            mCount = mUserKey.length + 1;
            // The maximum value is one more than the last one in the map.
            mMaxBin = mUserKey[mUserKey.length - 1] + 1;
            mBinMap = new int[mMaxBin + 1];

            int j = 0;
            for (int i = 0; i < mUserKey.length; i++) {
                while (j <= mUserKey[i]) {
                    mBinMap[j] = i;
                    j++;
                }
            }
            mBinMap[mMaxBin] = mUserKey.length;
        }

        /**
@@ -175,9 +182,14 @@ public class SnapshotStatistics {
         */
        public int getBin(int x) {
            if (x >= 0 && x < mMaxBin) {
                return mBinMap[x];
                for (int i = 0; i < mUserKey.length; i++) {
                    if (x <= mUserKey[i]) {
                        return i;
                    }
                }
                return 0; // should not happen
            } else if (x >= mMaxBin) {
                return mBinMap[mMaxBin];
                return mUserKey.length;
            } else {
                // x is negative.  The bin will not be used.
                return 0;
@@ -262,6 +274,11 @@ public class SnapshotStatistics {
         */
        public int mMaxBuildTimeUs = 0;

        /**
         * The maximum used count since the last log.
         */
        public int mMaxUsedCount = 0;

        /**
         * Record the rebuild.  The parameters are the length of time it took to build the
         * latest snapshot, and the number of times the _previous_ snapshot was used.  A
@@ -279,7 +296,6 @@ public class SnapshotStatistics {
            }

            mTotalTimeUs += duration;
            boolean reportIt = false;

            if (big) {
                mBigBuilds++;
@@ -290,6 +306,9 @@ public class SnapshotStatistics {
            if (mMaxBuildTimeUs < duration) {
                mMaxBuildTimeUs = duration;
            }
            if (mMaxUsedCount < used) {
                mMaxUsedCount = used;
            }
        }

        private Stats(long now) {
@@ -313,6 +332,7 @@ public class SnapshotStatistics {
            mShortLived = orig.mShortLived;
            mTotalTimeUs = orig.mTotalTimeUs;
            mMaxBuildTimeUs = orig.mMaxBuildTimeUs;
            mMaxUsedCount = orig.mMaxUsedCount;
        }

        /**
@@ -443,18 +463,19 @@ public class SnapshotStatistics {
        }

        /**
         * Report the object via an event.  Presumably the record indicates an anomalous
         * incident.
         * Report the snapshot statistics to FrameworkStatsLog.
         */
        private void report() {
            EventLogTags.writePmSnapshotStats(
                    mTotalBuilds, mTotalUsed, mBigBuilds, mShortLived,
                    mMaxBuildTimeUs / US_IN_MS, mTotalTimeUs / US_IN_MS);
        private void logSnapshotStatistics(int packageCount) {
            final long avgLatencyUs = (mTotalBuilds == 0 ? 0 : mTotalTimeUs / mTotalBuilds);
            final int avgUsedCount = (mTotalBuilds == 0 ? 0 : mTotalUsed / mTotalBuilds);
            FrameworkStatsLog.write(
                    FrameworkStatsLog.PACKAGE_MANAGER_SNAPSHOT_REPORTED, mTimes, mUsed,
                    mMaxBuildTimeUs, mMaxUsedCount, avgLatencyUs, avgUsedCount, packageCount);
        }
    }

    /**
     * Long statistics.  These roll over approximately every week.
     * Long statistics.  These roll over approximately one day.
     */
    private Stats[] mLong;

@@ -464,10 +485,14 @@ public class SnapshotStatistics {
    private Stats[] mShort;

    /**
     * The time of the last build.  This can be used to compute the length of time a
     * snapshot existed before being replaced.
     * The time of last logging to the FrameworkStatsLog.
     */
    private long mLastLogTimeUs;

    /**
     * The number of packages on the device.
     */
    private long mLastBuildTime = 0;
    private int mPackageCount;

    /**
     * Create a snapshot object.  Initialize the bin levels.  The last bin catches
@@ -475,8 +500,20 @@ public class SnapshotStatistics {
     */
    public SnapshotStatistics() {
        // Create the bin thresholds.  The time bins are in units of us.
        mTimeBins = new BinMap(new int[] { 1, 2, 5, 10, 20, 50, 100 });
        mUseBins = new BinMap(new int[] { 1, 2, 5, 10, 20, 50, 100 });
        mTimeBins = new BinMap(new int[] {
                REBUILD_LATENCY_BUCKET_LESS_THAN_1_MILLIS,
                REBUILD_LATENCY_BUCKET_LESS_THAN_2_MILLIS,
                REBUILD_LATENCY_BUCKET_LESS_THAN_5_MILLIS,
                REBUILD_LATENCY_BUCKET_LESS_THAN_10_MILLIS,
                REBUILD_LATENCY_BUCKET_LESS_THAN_20_MILLIS,
                REBUILD_LATENCY_BUCKET_LESS_THAN_50_MILLIS,
                REBUILD_LATENCY_BUCKET_LESS_THAN_100_MILLIS });
        mUseBins = new BinMap(new int[] {
                REUSE_COUNT_BUCKET_LESS_THAN_1,
                REUSE_COUNT_BUCKET_LESS_THAN_10,
                REUSE_COUNT_BUCKET_LESS_THAN_100,
                REUSE_COUNT_BUCKET_LESS_THAN_1000,
                REUSE_COUNT_BUCKET_LESS_THAN_10000 });

        // Create the raw statistics
        final long now = SystemClock.currentTimeMicro();
@@ -484,6 +521,7 @@ public class SnapshotStatistics {
        mLong[0] = new Stats(now);
        mShort = new Stats[10];
        mShort[0] = new Stats(now);
        mLastLogTimeUs = now;

        // Create the message handler for ticks and start the ticker.
        mHandler = new Handler(Looper.getMainLooper()) {
@@ -516,13 +554,14 @@ public class SnapshotStatistics {
     * @param now The time at which the snapshot rebuild began, in ns.
     * @param done The time at which the snapshot rebuild completed, in ns.
     * @param hits The number of times the previous snapshot was used.
     * @param packageCount The number of packages on the device.
     */
    public final void rebuild(long now, long done, int hits) {
    public final void rebuild(long now, long done, int hits, int packageCount) {
        // The duration has a span of about 2000s
        final int duration = (int) (done - now);
        boolean reportEvent = false;
        synchronized (mLock) {
            mLastBuildTime = now;
            mPackageCount = packageCount;

            final int timeBin = mTimeBins.getBin(duration / 1000);
            final int useBin = mUseBins.getBin(hits);
@@ -570,10 +609,12 @@ public class SnapshotStatistics {
    private void tick() {
        synchronized (mLock) {
            long now = SystemClock.currentTimeMicro();
            mTicks++;
            if (mTicks % SNAPSHOT_LONG_TICKS == 0) {
            if (now - mLastLogTimeUs > SNAPSHOT_LOG_INTERVAL_US) {
                shift(mLong, now);
                mLastLogTimeUs = now;
                mLong[mLong.length - 1].logSnapshotStatistics(mPackageCount);
            }

            shift(mShort, now);
            mEventsReported = 0;
        }
+4 −4
Original line number Diff line number Diff line
@@ -387,7 +387,7 @@ public class AppsFilterImplTest {

        // delete user
        when(mSnapshot.getUserInfos()).thenReturn(USER_INFO_LIST);
        appsFilter.onUserDeleted(ADDED_USER);
        appsFilter.onUserDeleted(mSnapshot, ADDED_USER);

        for (int subjectUserId : USER_ARRAY) {
            for (int otherUserId : USER_ARRAY) {
@@ -925,7 +925,7 @@ public class AppsFilterImplTest {
        assertTrue(appsFilter.shouldFilterApplication(mSnapshot, DUMMY_OVERLAY_APPID,
                overlaySetting, actorSetting, SYSTEM_USER));

        appsFilter.removePackage(mSnapshot, targetSetting, false /* isReplace */);
        appsFilter.removePackage(mSnapshot, targetSetting);

        // Actor loses visibility to the overlay via removal of the target
        assertTrue(appsFilter.shouldFilterApplication(mSnapshot, DUMMY_ACTOR_APPID, actorSetting,
@@ -1267,7 +1267,7 @@ public class AppsFilterImplTest {
        watcher.verifyNoChangeReported("get");

        // remove a package
        appsFilter.removePackage(mSnapshot, seesNothing, false /* isReplace */);
        appsFilter.removePackage(mSnapshot, seesNothing);
        watcher.verifyChangeReported("removePackage");
    }

@@ -1337,7 +1337,7 @@ public class AppsFilterImplTest {
                target.getPackageName()));

        // New changes don't affect the snapshot
        appsFilter.removePackage(mSnapshot, target, false);
        appsFilter.removePackage(mSnapshot, target);
        assertTrue(
                appsFilter.shouldFilterApplication(mSnapshot, DUMMY_CALLING_APPID, instrumentation,
                        target,