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

Commit ae7cf391 authored by Winson's avatar Winson
Browse files

Force PMS snapshots

Removes the ability to disable PackageManagerService snapshots. The
new PackageState and related APIs rely on never taking PMS#mLock, so
a snapshot Computer must always be available.

To keep changes small, this does not migrate existing
executeWithConsistentComputer calls, but that can be done in a simple
follow-up to save on lambda allocation costs.

Bug: 202291547

Change-Id: I243988b0c48938a8701842a9de5cfc465c1d38d8
parent 56f4967e
Loading
Loading
Loading
Loading
+2 −14
Original line number Diff line number Diff line
@@ -901,32 +901,20 @@ public abstract class PackageManagerInternal implements PackageSettingsSnapshotP

    /**
     * Perform the given action for each package.
     *
     * @param locked whether to hold the packages lock. If the lock is not held, the objects will
     *               be iterated using a temporary data structure. In the vast majority of cases,
     *               the lock should not have to be held. This is exposed to mirror the
     *               functionality of the other forEach methods, for eventual migration.
     * @param action action to be performed
     */
    public abstract void forEachPackageState(boolean locked, Consumer<PackageStateInternal> action);
    public abstract void forEachPackageState(Consumer<PackageStateInternal> action);

    /**
     * {@link #forEachPackageState(boolean, Consumer)} but filtered to only states with packages
     * {@link #forEachPackageState(Consumer)} but filtered to only states with packages
     * on device where {@link PackageStateInternal#getPkg()} is not null.
     */
    public abstract void forEachPackage(Consumer<AndroidPackage> action);

    /**
     * Perform the given action for each installed package for a user.
     * Note that packages lock will be held while performing the actions.
     */
    public abstract void forEachInstalledPackage(
            @NonNull Consumer<AndroidPackage> actionLocked, @UserIdInt int userId);

    /**
     * Perform the given action for each installed package for a user.
     */
    public abstract void forEachInstalledPackage(boolean locked,
            @NonNull Consumer<AndroidPackage> action, @UserIdInt int userId);

    /** Returns the list of enabled components */
+1 −1
Original line number Diff line number Diff line
@@ -1143,7 +1143,7 @@ public final class OverlayManagerService extends SystemService {
        public ArrayMap<String, AndroidPackage> initializeForUser(final int userId) {
            if (!mInitializedUsers.contains(userId)) {
                mInitializedUsers.add(userId);
                mPackageManagerInternal.forEachInstalledPackage(false /*locked*/,
                mPackageManagerInternal.forEachInstalledPackage(
                        (pkg) -> addPackageUser(pkg, userId), userId);
            }

+37 −52
Original line number Diff line number Diff line
@@ -67,26 +67,11 @@ public final class ComputerTracker implements Computer {
    // a snapshot computer.
    private final AtomicInteger mReusedSnapshot = new AtomicInteger(0);

    // The number of times a thread reused a computer in its stack instead of fetching
    // a live computer.
    private final AtomicInteger mReusedLive = new AtomicInteger(0);

    private final PackageManagerService mService;
    ComputerTracker(PackageManagerService s) {
        mService = s;
    }

    private ThreadComputer live() {
        ThreadComputer current = PackageManagerService.sThreadComputer.get();
        if (current.mRefCount > 0) {
            current.acquire();
            mReusedLive.incrementAndGet();
        } else {
            current.acquire(mService.liveComputer());
        }
        return current;
    }

    private ThreadComputer snapshot() {
        ThreadComputer current = PackageManagerService.sThreadComputer.get();
        if (current.mRefCount > 0) {
@@ -137,7 +122,7 @@ public final class ComputerTracker implements Computer {
            Intent intent, String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags,
            int filterCallingUid, int userId, boolean resolveForStart, boolean allowDynamicSplits,
            String pkgName, String instantAppPkgName) {
        ThreadComputer current = live();
        ThreadComputer current = snapshot();
        try {
            return current.mComputer.queryIntentActivitiesInternalBody(intent, resolvedType,
                    flags, filterCallingUid, userId, resolveForStart, allowDynamicSplits,
@@ -158,7 +143,7 @@ public final class ComputerTracker implements Computer {
    public ActivityInfo getActivityInfoInternal(ComponentName component,
            @PackageManager.ComponentInfoFlagsBits long flags,
            int filterCallingUid, int userId) {
        ThreadComputer current = live();
        ThreadComputer current = snapshot();
        try {
            return current.mComputer.getActivityInfoInternal(component, flags, filterCallingUid,
                    userId);
@@ -184,7 +169,7 @@ public final class ComputerTracker implements Computer {
    }
    public ApplicationInfo generateApplicationInfoFromSettings(String packageName,
            long flags, int filterCallingUid, int userId) {
        ThreadComputer current = live();
        ThreadComputer current = snapshot();
        try {
            return current.mComputer.generateApplicationInfoFromSettings(packageName, flags,
                    filterCallingUid, userId);
@@ -203,7 +188,7 @@ public final class ComputerTracker implements Computer {
    }
    public ApplicationInfo getApplicationInfoInternal(String packageName,
            @PackageManager.ApplicationInfoFlagsBits long flags, int filterCallingUid, int userId) {
        ThreadComputer current = live();
        ThreadComputer current = snapshot();
        try {
            return current.mComputer.getApplicationInfoInternal(packageName, flags,
                    filterCallingUid, userId);
@@ -212,7 +197,7 @@ public final class ComputerTracker implements Computer {
        }
    }
    public ComponentName getDefaultHomeActivity(int userId) {
        ThreadComputer current = live();
        ThreadComputer current = snapshot();
        try {
            return current.mComputer.getDefaultHomeActivity(userId);
        } finally {
@@ -221,7 +206,7 @@ public final class ComputerTracker implements Computer {
    }
    public ComponentName getHomeActivitiesAsUser(List<ResolveInfo> allHomeCandidates,
            int userId) {
        ThreadComputer current = live();
        ThreadComputer current = snapshot();
        try {
            return current.mComputer.getHomeActivitiesAsUser(allHomeCandidates, userId);
        } finally {
@@ -231,7 +216,7 @@ public final class ComputerTracker implements Computer {
    public CrossProfileDomainInfo getCrossProfileDomainPreferredLpr(Intent intent,
            String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags, int sourceUserId,
            int parentUserId) {
        ThreadComputer current = live();
        ThreadComputer current = snapshot();
        try {
            return current.mComputer.getCrossProfileDomainPreferredLpr(intent, resolvedType,
                    flags, sourceUserId, parentUserId);
@@ -240,7 +225,7 @@ public final class ComputerTracker implements Computer {
        }
    }
    public Intent getHomeIntent() {
        ThreadComputer current = live();
        ThreadComputer current = snapshot();
        try {
            return current.mComputer.getHomeIntent();
        } finally {
@@ -249,7 +234,7 @@ public final class ComputerTracker implements Computer {
    }
    public List<CrossProfileIntentFilter> getMatchingCrossProfileIntentFilters(
            Intent intent, String resolvedType, int userId) {
        ThreadComputer current = live();
        ThreadComputer current = snapshot();
        try {
            return current.mComputer.getMatchingCrossProfileIntentFilters(intent, resolvedType,
                    userId);
@@ -261,7 +246,7 @@ public final class ComputerTracker implements Computer {
            @NonNull List<ResolveInfo> resolveInfos,
            String ephemeralPkgName, boolean allowDynamicSplits, int filterCallingUid,
            boolean resolveForStart, int userId, Intent intent) {
        ThreadComputer current = live();
        ThreadComputer current = snapshot();
        try {
            return current.mComputer.applyPostResolutionFilter(resolveInfos, ephemeralPkgName,
                    allowDynamicSplits, filterCallingUid, resolveForStart, userId, intent);
@@ -271,7 +256,7 @@ public final class ComputerTracker implements Computer {
    }
    public PackageInfo generatePackageInfo(PackageStateInternal ps,
            @PackageManager.PackageInfoFlagsBits long flags, int userId) {
        ThreadComputer current = live();
        ThreadComputer current = snapshot();
        try {
            return current.mComputer.generatePackageInfo(ps, flags, userId);
        } finally {
@@ -289,7 +274,7 @@ public final class ComputerTracker implements Computer {
    }
    public PackageInfo getPackageInfoInternal(String packageName, long versionCode,
            long flags, int filterCallingUid, int userId) {
        ThreadComputer current = live();
        ThreadComputer current = snapshot();
        try {
            return current.mComputer.getPackageInfoInternal(packageName, versionCode, flags,
                    filterCallingUid, userId);
@@ -306,7 +291,7 @@ public final class ComputerTracker implements Computer {
        }
    }
    public PackageStateInternal getPackageStateInternal(String packageName, int callingUid) {
        ThreadComputer current = live();
        ThreadComputer current = snapshot();
        try {
            return current.mComputer.getPackageStateInternal(packageName, callingUid);
        } finally {
@@ -316,7 +301,7 @@ public final class ComputerTracker implements Computer {

    @Nullable
    public PackageState getPackageStateCopied(@NonNull String packageName) {
        ThreadComputer current = live();
        ThreadComputer current = snapshot();
        try {
            return current.mComputer.getPackageStateCopied(packageName);
        } finally {
@@ -334,7 +319,7 @@ public final class ComputerTracker implements Computer {
    }
    public ResolveInfo createForwardingResolveInfoUnchecked(WatchedIntentFilter filter,
            int sourceUserId, int targetUserId) {
        ThreadComputer current = live();
        ThreadComputer current = snapshot();
        try {
            return current.mComputer.createForwardingResolveInfoUnchecked(filter, sourceUserId,
                    targetUserId);
@@ -344,7 +329,7 @@ public final class ComputerTracker implements Computer {
    }
    public ServiceInfo getServiceInfo(ComponentName component,
            @PackageManager.ComponentInfoFlagsBits long flags, int userId) {
        ThreadComputer current = live();
        ThreadComputer current = snapshot();
        try {
            return current.mComputer.getServiceInfo(component, flags, userId);
        } finally {
@@ -384,7 +369,7 @@ public final class ComputerTracker implements Computer {
        }
    }
    public String resolveExternalPackageName(AndroidPackage pkg) {
        ThreadComputer current = live();
        ThreadComputer current = snapshot();
        try {
            return current.mComputer.resolveExternalPackageName(pkg);
        } finally {
@@ -408,7 +393,7 @@ public final class ComputerTracker implements Computer {
        }
    }
    public UserInfo getProfileParent(int userId) {
        ThreadComputer current = live();
        ThreadComputer current = snapshot();
        try {
            return current.mComputer.getProfileParent(userId);
        } finally {
@@ -416,7 +401,7 @@ public final class ComputerTracker implements Computer {
        }
    }
    public boolean canViewInstantApps(int callingUid, int userId) {
        ThreadComputer current = live();
        ThreadComputer current = snapshot();
        try {
            return current.mComputer.canViewInstantApps(callingUid, userId);
        } finally {
@@ -449,7 +434,7 @@ public final class ComputerTracker implements Computer {
    }
    public boolean filterSharedLibPackage(@Nullable PackageStateInternal ps, int uid,
            int userId, @PackageManager.ComponentInfoFlagsBits long flags) {
        ThreadComputer current = live();
        ThreadComputer current = snapshot();
        try {
            return current.mComputer.filterSharedLibPackage(ps, uid, userId, flags);
        } finally {
@@ -457,7 +442,7 @@ public final class ComputerTracker implements Computer {
        }
    }
    public boolean isCallerSameApp(String packageName, int uid) {
        ThreadComputer current = live();
        ThreadComputer current = snapshot();
        try {
            return current.mComputer.isCallerSameApp(packageName, uid);
        } finally {
@@ -465,7 +450,7 @@ public final class ComputerTracker implements Computer {
        }
    }
    public boolean isComponentVisibleToInstantApp(@Nullable ComponentName component) {
        ThreadComputer current = live();
        ThreadComputer current = snapshot();
        try {
            return current.mComputer.isComponentVisibleToInstantApp(component);
        } finally {
@@ -474,7 +459,7 @@ public final class ComputerTracker implements Computer {
    }
    public boolean isComponentVisibleToInstantApp(@Nullable ComponentName component,
            @PackageManager.ComponentType int type) {
        ThreadComputer current = live();
        ThreadComputer current = snapshot();
        try {
            return current.mComputer.isComponentVisibleToInstantApp(component, type);
        } finally {
@@ -483,7 +468,7 @@ public final class ComputerTracker implements Computer {
    }
    public boolean isImplicitImageCaptureIntentAndNotSetByDpcLocked(Intent intent,
            int userId, String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags) {
        ThreadComputer current = live();
        ThreadComputer current = snapshot();
        try {
            return current.mComputer.isImplicitImageCaptureIntentAndNotSetByDpcLocked(intent,
                    userId, resolvedType, flags);
@@ -510,7 +495,7 @@ public final class ComputerTracker implements Computer {
    }
    public boolean isSameProfileGroup(@UserIdInt int callerUserId,
            @UserIdInt int userId) {
        ThreadComputer current = live();
        ThreadComputer current = snapshot();
        try {
            return current.mComputer.isSameProfileGroup(callerUserId, userId);
        } finally {
@@ -519,7 +504,7 @@ public final class ComputerTracker implements Computer {
    }
    public boolean shouldFilterApplication(@NonNull SharedUserSetting sus,
            int callingUid, int userId) {
        ThreadComputer current = live();
        ThreadComputer current = snapshot();
        try {
            return current.mComputer.shouldFilterApplication(sus, callingUid, userId);
        } finally {
@@ -556,7 +541,7 @@ public final class ComputerTracker implements Computer {
    }
    public int getPackageUidInternal(String packageName,
            @PackageManager.PackageInfoFlagsBits long flags, int userId, int callingUid) {
        ThreadComputer current = live();
        ThreadComputer current = snapshot();
        try {
            return current.mComputer.getPackageUidInternal(packageName, flags, userId,
                    callingUid);
@@ -565,7 +550,7 @@ public final class ComputerTracker implements Computer {
        }
    }
    public long updateFlagsForApplication(long flags, int userId) {
        ThreadComputer current = live();
        ThreadComputer current = snapshot();
        try {
            return current.mComputer.updateFlagsForApplication(flags, userId);
        } finally {
@@ -573,7 +558,7 @@ public final class ComputerTracker implements Computer {
        }
    }
    public long updateFlagsForComponent(long flags, int userId) {
        ThreadComputer current = live();
        ThreadComputer current = snapshot();
        try {
            return current.mComputer.updateFlagsForComponent(flags, userId);
        } finally {
@@ -581,7 +566,7 @@ public final class ComputerTracker implements Computer {
        }
    }
    public long updateFlagsForPackage(long flags, int userId) {
        ThreadComputer current = live();
        ThreadComputer current = snapshot();
        try {
            return current.mComputer.updateFlagsForPackage(flags, userId);
        } finally {
@@ -601,7 +586,7 @@ public final class ComputerTracker implements Computer {
    public long updateFlagsForResolve(long flags, int userId, int callingUid,
            boolean wantInstantApps, boolean onlyExposedExplicitly,
            boolean isImplicitImageCaptureIntentAndNotSetByDpc) {
        ThreadComputer current = live();
        ThreadComputer current = snapshot();
        try {
            return current.mComputer.updateFlagsForResolve(flags, userId, callingUid,
                    wantInstantApps, onlyExposedExplicitly,
@@ -611,7 +596,7 @@ public final class ComputerTracker implements Computer {
        }
    }
    public void dump(int type, FileDescriptor fd, PrintWriter pw, DumpState dumpState) {
        ThreadComputer current = live();
        ThreadComputer current = snapshot();
        try {
            current.mComputer.dump(type, fd, pw, dumpState);
        } finally {
@@ -620,7 +605,7 @@ public final class ComputerTracker implements Computer {
    }
    public void enforceCrossUserOrProfilePermission(int callingUid, @UserIdInt int userId,
            boolean requireFullPermission, boolean checkShell, String message) {
        ThreadComputer current = live();
        ThreadComputer current = snapshot();
        try {
            current.mComputer.enforceCrossUserOrProfilePermission(callingUid, userId,
                    requireFullPermission, checkShell, message);
@@ -630,7 +615,7 @@ public final class ComputerTracker implements Computer {
    }
    public void enforceCrossUserPermission(int callingUid, @UserIdInt int userId,
            boolean requireFullPermission, boolean checkShell, String message) {
        ThreadComputer current = live();
        ThreadComputer current = snapshot();
        try {
            current.mComputer.enforceCrossUserPermission(callingUid, userId,
                    requireFullPermission, checkShell, message);
@@ -641,7 +626,7 @@ public final class ComputerTracker implements Computer {
    public void enforceCrossUserPermission(int callingUid, @UserIdInt int userId,
            boolean requireFullPermission, boolean checkShell,
            boolean requirePermissionWhenSameUser, String message) {
        ThreadComputer current = live();
        ThreadComputer current = snapshot();
        try {
            current.mComputer.enforceCrossUserPermission(callingUid, userId,
                    requireFullPermission, checkShell, requirePermissionWhenSameUser, message);
@@ -653,7 +638,7 @@ public final class ComputerTracker implements Computer {
            Intent intent, String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags,
            List<ResolveInfo> query, boolean always, boolean removeMatches, boolean debug,
            int userId, boolean queryMayBeFiltered) {
        ThreadComputer current = live();
        ThreadComputer current = snapshot();
        try {
            return current.mComputer.findPreferredActivityInternal(intent, resolvedType, flags,
                    query, always, removeMatches, debug, userId, queryMayBeFiltered);
@@ -664,7 +649,7 @@ public final class ComputerTracker implements Computer {
    public ResolveInfo findPersistentPreferredActivityLP(Intent intent,
            String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags,
            List<ResolveInfo> query, boolean debug, int userId) {
        ThreadComputer current = live();
        ThreadComputer current = snapshot();
        try {
            return current.mComputer.findPersistentPreferredActivityLP(intent, resolvedType,
                    flags, query, debug, userId);
+1 −1
Original line number Diff line number Diff line
@@ -292,7 +292,7 @@ final class DexOptHelper {

    public ArraySet<String> getOptimizablePackages() {
        ArraySet<String> pkgs = new ArraySet<>();
        mPm.forEachPackageState(false /*locked*/, packageState -> {
        mPm.forEachPackageState(packageState -> {
            if (mPm.mPackageDexOptimizer.canOptimizePackage(packageState.getPkg())) {
                pkgs.add(packageState.getPackageName());
            }
+1 −1
Original line number Diff line number Diff line
@@ -94,7 +94,7 @@ import java.util.function.Predicate;
 * pruning installed instant apps and meta-data for uninstalled instant apps
 * when free space is needed.
 */
class InstantAppRegistry implements Watchable, Snappable {
public class InstantAppRegistry implements Watchable, Snappable {
    private static final boolean DEBUG = false;

    private static final String LOG_TAG = "InstantAppRegistry";
Loading