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

Commit 26899cdf authored by Rhed Jao's avatar Rhed Jao
Browse files

Add frozen counts support in PackageFreezer

This CL supports a frozen count to allow multiple freeze reasons
in PackageFreezer.

Bug: 209584888
Test: atest PackageFreezerTest
Change-Id: I81ab0606176fcd961283c04bd9d6c4c0315514a3
parent b77d15fc
Loading
Loading
Loading
Loading
+2 −3
Original line number Diff line number Diff line
@@ -146,7 +146,6 @@ import com.android.server.pm.verify.domain.DomainVerificationManagerInternal;
import com.android.server.pm.verify.domain.DomainVerificationUtils;
import com.android.server.uri.UriGrantsManagerInternal;
import com.android.server.utils.WatchedArrayMap;
import com.android.server.utils.WatchedArraySet;
import com.android.server.utils.WatchedLongSparseArray;
import com.android.server.utils.WatchedSparseBooleanArray;
import com.android.server.utils.WatchedSparseIntArray;
@@ -333,7 +332,7 @@ public class ComputerEngine implements Computer {
    private final InstantAppRegistry mInstantAppRegistry;
    private final ApplicationInfo mLocalAndroidApplication;
    private final AppsFilter mAppsFilter;
    private final WatchedArraySet<String> mFrozenPackages;
    private final WatchedArrayMap<String, Integer> mFrozenPackages;

    // Immutable service attribute
    private final String mAppPredictionServicePackage;
@@ -3580,7 +3579,7 @@ public class ComputerEngine implements Computer {
            return PackageManagerService.PACKAGE_STARTABILITY_NOT_SYSTEM;
        }

        if (mFrozenPackages.contains(packageName)) {
        if (mFrozenPackages.containsKey(packageName)) {
            return PackageManagerService.PACKAGE_STARTABILITY_FROZEN;
        }

+3 −0
Original line number Diff line number Diff line
@@ -504,6 +504,9 @@ final class DumpHelper {
                    ipw.println("(none)");
                } else {
                    for (int i = 0; i < mPm.mFrozenPackages.size(); i++) {
                        ipw.print("package=");
                        ipw.print(mPm.mFrozenPackages.keyAt(i));
                        ipw.print(", refCounts=");
                        ipw.println(mPm.mFrozenPackages.valueAt(i));
                    }
                }
+3 −1
Original line number Diff line number Diff line
@@ -130,7 +130,7 @@ public final class MovePackageHelper {
                        "Device admin cannot be moved");
            }

            if (mPm.mFrozenPackages.contains(packageName)) {
            if (mPm.mFrozenPackages.containsKey(packageName)) {
                throw new PackageManagerException(MOVE_FAILED_OPERATION_PENDING,
                        "Failed to move already frozen package");
            }
@@ -188,6 +188,7 @@ public final class MovePackageHelper {
            for (int userId : installedUserIds) {
                if (StorageManager.isFileEncryptedNativeOrEmulated()
                        && !StorageManager.isUserKeyUnlocked(userId)) {
                    freezer.close();
                    throw new PackageManagerException(MOVE_FAILED_LOCKED_USER,
                            "User " + userId + " must be unlocked");
                }
@@ -230,6 +231,7 @@ public final class MovePackageHelper {
        final IPackageInstallObserver2 installObserver = new IPackageInstallObserver2.Stub() {
            @Override
            public void onUserActionRequired(Intent intent) throws RemoteException {
                freezer.close();
                throw new IllegalStateException();
            }

+9 −5
Original line number Diff line number Diff line
@@ -31,8 +31,6 @@ import java.util.concurrent.atomic.AtomicBoolean;
final class PackageFreezer implements AutoCloseable {
    private final String mPackageName;

    private final boolean mWeFroze;

    private final AtomicBoolean mClosed = new AtomicBoolean();
    private final CloseGuard mCloseGuard = CloseGuard.get();

@@ -48,7 +46,7 @@ final class PackageFreezer implements AutoCloseable {
    PackageFreezer(PackageManagerService pm) {
        mPm = pm;
        mPackageName = null;
        mWeFroze = false;
        mClosed.set(true);
        mCloseGuard.open("close");
    }

@@ -58,7 +56,9 @@ final class PackageFreezer implements AutoCloseable {
        mPackageName = packageName;
        final PackageSetting ps;
        synchronized (mPm.mLock) {
            mWeFroze = mPm.mFrozenPackages.add(mPackageName);
            final int refCounts = mPm.mFrozenPackages
                    .getOrDefault(mPackageName, 0 /* defaultValue */) + 1;
            mPm.mFrozenPackages.put(mPackageName, refCounts);
            ps = mPm.mSettings.getPackageLPr(mPackageName);
        }
        if (ps != null) {
@@ -82,7 +82,11 @@ final class PackageFreezer implements AutoCloseable {
        mCloseGuard.close();
        if (mClosed.compareAndSet(false, true)) {
            synchronized (mPm.mLock) {
                if (mWeFroze) {
                final int refCounts = mPm.mFrozenPackages
                        .getOrDefault(mPackageName, 0 /* defaultValue */) - 1;
                if (refCounts > 0) {
                    mPm.mFrozenPackages.put(mPackageName, refCounts);
                } else {
                    mPm.mFrozenPackages.remove(mPackageName);
                }
            }
+8 −8
Original line number Diff line number Diff line
@@ -248,7 +248,6 @@ import com.android.server.utils.TimingsTraceAndSlog;
import com.android.server.utils.Watchable;
import com.android.server.utils.Watched;
import com.android.server.utils.WatchedArrayMap;
import com.android.server.utils.WatchedArraySet;
import com.android.server.utils.WatchedLongSparseArray;
import com.android.server.utils.WatchedSparseBooleanArray;
import com.android.server.utils.WatchedSparseIntArray;
@@ -652,15 +651,16 @@ public class PackageManagerService extends IPackageManager.Stub
    final Settings mSettings;

    /**
     * Set of package names that are currently "frozen", which means active
     * surgery is being done on the code/data for that package. The platform
     * will refuse to launch frozen packages to avoid race conditions.
     * Map of package names to frozen counts that are currently "frozen",
     * which means active surgery is being done on the code/data for that
     * package. The platform will refuse to launch frozen packages to avoid
     * race conditions.
     *
     * @see PackageFreezer
     */
    @GuardedBy("mLock")
    final WatchedArraySet<String> mFrozenPackages = new WatchedArraySet<>();
    private final SnapshotCache<WatchedArraySet<String>> mFrozenPackagesSnapshot =
    final WatchedArrayMap<String, Integer> mFrozenPackages = new WatchedArrayMap<>();
    private final SnapshotCache<WatchedArrayMap<String, Integer>> mFrozenPackagesSnapshot =
            new SnapshotCache.Auto(mFrozenPackages, mFrozenPackages,
                    "PackageManagerService.mFrozenPackages");

@@ -1021,7 +1021,7 @@ public class PackageManagerService extends IPackageManager.Stub
        public final AppsFilter appsFilter;
        public final ComponentResolver componentResolver;
        public final PackageManagerService service;
        public final WatchedArraySet<String> frozenPackages;
        public final WatchedArrayMap<String, Integer> frozenPackages;

        Snapshot(int type) {
            if (type == Snapshot.SNAPPED) {
@@ -7285,7 +7285,7 @@ public class PackageManagerService extends IPackageManager.Stub
     */
    void checkPackageFrozen(String packageName) {
        synchronized (mLock) {
            if (!mFrozenPackages.contains(packageName)) {
            if (!mFrozenPackages.containsKey(packageName)) {
                Slog.wtf(TAG, "Expected " + packageName + " to be frozen!", new Throwable());
            }
        }
Loading