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

Commit 33ee9ac3 authored by Winson's avatar Winson
Browse files

Remove some mutation mLock usages

Uses previously added package state mutation commit APIs which enforce
a read -> diff -> commit cycle for editing package state.

Migrates several usages of mLock for this write mutation.

Bug: 202291547

Test: presubmit, too general of a change for specific test

Change-Id: Icf20dc74b92e79f874daeddadde88093aa4dca4e
parent c83914f9
Loading
Loading
Loading
Loading
+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(
                mPackageManagerInternal.forEachInstalledPackage(false /*locked*/,
                        (pkg) -> addPackageUser(pkg, userId), userId);
            }

+14 −4
Original line number Diff line number Diff line
@@ -49,6 +49,8 @@ import com.android.internal.annotations.VisibleForTesting;
import com.android.server.pm.parsing.pkg.AndroidPackage;
import com.android.server.pm.pkg.PackageState;
import com.android.server.pm.pkg.PackageStateInternal;
import com.android.server.utils.WatchedArrayMap;
import com.android.server.utils.WatchedLongSparseArray;

import java.io.FileDescriptor;
import java.io.PrintWriter;
@@ -214,7 +216,7 @@ public interface Computer {
    @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
    String resolveExternalPackageName(AndroidPackage pkg);
    @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
    String resolveInternalPackageNameLPr(String packageName, long versionCode);
    String resolveInternalPackageName(String packageName, long versionCode);
    @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
    String[] getPackagesForUid(int uid);
    @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
@@ -381,11 +383,12 @@ public interface Computer {
    String[] getSystemSharedLibraryNames();

    /**
     * @return if the given package has a state and isn't filtered by visibility. Provides no
     * guarantee that the package is in any usable state.
     * @return the state if the given package has a state and isn't filtered by visibility.
     * Provides no guarantee that the package is in any usable state.
     */
    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
    boolean isPackageStateAvailableAndVisible(@NonNull String packageName, int callingUid,
    @Nullable
    PackageStateInternal getPackageStateFiltered(@NonNull String packageName, int callingUid,
            @UserIdInt int userId);

    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
@@ -623,4 +626,11 @@ public interface Computer {
    @Nullable
    ArrayMap<String, ProcessInfo> getProcessesForUid(int uid);
    // End block

    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
    boolean getBlockUninstall(@UserIdInt int userId, @NonNull String packageName);

    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
    @NonNull
    WatchedArrayMap<String, WatchedLongSparseArray<SharedLibraryInfo>> getSharedLibraries();
}
+28 −19
Original line number Diff line number Diff line
@@ -298,11 +298,6 @@ public class ComputerEngine implements Computer {
        public Collection<SharedUserSetting> getAllSharedUsers() {
            return mSettings.getAllSharedUsersLPw();
        }

        @Nullable
        public String getHarmfulAppWarning(@NonNull String packageName, @UserIdInt int userId) {
            return mSettings.getHarmfulAppWarningLPr(packageName, userId);
        }
    }

    private static final Comparator<ProviderInfo> sProviderInitOrderSorter = (p1, p2) -> {
@@ -829,7 +824,7 @@ public class ComputerEngine implements Computer {
    }

    public AndroidPackage getPackage(String packageName) {
        packageName = resolveInternalPackageNameLPr(
        packageName = resolveInternalPackageName(
                packageName, PackageManager.VERSION_CODE_HIGHEST);
        return mPackages.get(packageName);
    }
@@ -903,7 +898,7 @@ public class ComputerEngine implements Computer {
            int filterCallingUid, int userId) {
        // writer
        // Normalize package name to handle renamed packages and static libs
        packageName = resolveInternalPackageNameLPr(packageName,
        packageName = resolveInternalPackageName(packageName,
                PackageManager.VERSION_CODE_HIGHEST);

        AndroidPackage p = mPackages.get(packageName);
@@ -1627,7 +1622,7 @@ public class ComputerEngine implements Computer {
            long flags, int filterCallingUid, int userId) {
        // reader
        // Normalize package name to handle renamed packages and static libs
        packageName = resolveInternalPackageNameLPr(packageName, versionCode);
        packageName = resolveInternalPackageName(packageName, versionCode);

        final boolean matchFactoryOnly = (flags & MATCH_FACTORY_ONLY) != 0;
        if (matchFactoryOnly) {
@@ -2111,7 +2106,7 @@ public class ComputerEngine implements Computer {
        return packageName;
    }

    public final String resolveInternalPackageNameLPr(String packageName, long versionCode) {
    public final String resolveInternalPackageName(String packageName, long versionCode) {
        final int callingUid = Binder.getCallingUid();
        return resolveInternalPackageNameInternalLocked(packageName, versionCode,
                callingUid);
@@ -3489,7 +3484,9 @@ public class ComputerEngine implements Computer {
        return mSettings.getRenamedPackageLPr(packageName);
    }

    private WatchedArrayMap<String, WatchedLongSparseArray<SharedLibraryInfo>>
    @NonNull
    @Override
    public WatchedArrayMap<String, WatchedLongSparseArray<SharedLibraryInfo>>
            getSharedLibraries() {
        return mSharedLibraries.getAll();
    }
@@ -4070,10 +4067,13 @@ public class ComputerEngine implements Computer {
    }

    @Override
    public boolean isPackageStateAvailableAndVisible(@NonNull String packageName, int callingUid,
    public PackageStateInternal getPackageStateFiltered(@NonNull String packageName, int callingUid,
            @UserIdInt int userId) {
        final PackageStateInternal ps = getPackageStateInternal(packageName);
        return ps != null && !shouldFilterApplication(ps, callingUid, userId);
        final PackageStateInternal packageState = getPackageStateInternal(packageName);
        if (packageState == null || shouldFilterApplication(packageState, callingUid, userId)) {
            return null;
        }
        return packageState;
    }

    @Override
@@ -4576,9 +4576,9 @@ public class ComputerEngine implements Computer {
            }
        } else {
            list = new ArrayList<>(mPackages.size());
            for (AndroidPackage p : mPackages.values()) {
                final PackageStateInternal packageState = packageStates.get(p.getPackageName());
                if (packageState == null) {
            for (PackageStateInternal packageState : packageStates.values()) {
                final AndroidPackage pkg = packageState.getPkg();
                if (pkg == null) {
                    continue;
                }
                if (filterSharedLibPackage(packageState, Binder.getCallingUid(), userId, flags)) {
@@ -4587,10 +4587,10 @@ public class ComputerEngine implements Computer {
                if (shouldFilterApplication(packageState, callingUid, userId)) {
                    continue;
                }
                ApplicationInfo ai = PackageInfoUtils.generateApplicationInfo(p, flags,
                ApplicationInfo ai = PackageInfoUtils.generateApplicationInfo(pkg, flags,
                        packageState.getUserStateOrDefault(userId), userId, packageState);
                if (ai != null) {
                    ai.packageName = resolveExternalPackageName(p);
                    ai.packageName = resolveExternalPackageName(pkg);
                    list.add(ai);
                }
            }
@@ -5476,7 +5476,11 @@ public class ComputerEngine implements Computer {
                    + SET_HARMFUL_APP_WARNINGS + " permission.");
        }

        return mSettings.getHarmfulAppWarning(packageName, userId);
        final PackageStateInternal packageState = getPackageStateInternal(packageName);
        if (packageState == null) {
            throw new IllegalArgumentException("Unknown package: " + packageName);
        }
        return packageState.getUserStateOrDefault(userId).getHarmfulAppWarning();
    }

    /**
@@ -5571,4 +5575,9 @@ public class ComputerEngine implements Computer {
        }
        return null;
    }

    @Override
    public boolean getBlockUninstall(@UserIdInt int userId, @NonNull String packageName) {
        return mSettings.getBlockUninstall(userId, packageName);
    }
}
+25 −8
Original line number Diff line number Diff line
@@ -46,6 +46,8 @@ import com.android.internal.annotations.VisibleForTesting;
import com.android.server.pm.parsing.pkg.AndroidPackage;
import com.android.server.pm.pkg.PackageState;
import com.android.server.pm.pkg.PackageStateInternal;
import com.android.server.utils.WatchedArrayMap;
import com.android.server.utils.WatchedLongSparseArray;

import java.io.FileDescriptor;
import java.io.PrintWriter;
@@ -389,14 +391,6 @@ public final class ComputerLocked extends ComputerEngine {
        }
    }

    @Override
    public boolean isPackageStateAvailableAndVisible(@NonNull String packageName, int callingUid,
            @UserIdInt int userId) {
        synchronized (mLock) {
            return super.isPackageStateAvailableAndVisible(packageName, callingUid, userId);
        }
    }

    @Override
    public int checkSignatures(@NonNull String pkg1,
            @NonNull String pkg2) {
@@ -825,4 +819,27 @@ public final class ComputerLocked extends ComputerEngine {
            return super.getProcessesForUid(uid);
        }
    }

    @Override
    public PackageStateInternal getPackageStateFiltered(@NonNull String packageName, int callingUid,
            @UserIdInt int userId) {
        synchronized (mLock) {
            return super.getPackageStateFiltered(packageName, callingUid, userId);
        }
    }

    @Override
    public boolean getBlockUninstall(@UserIdInt int userId, @NonNull String packageName) {
        synchronized (mLock) {
            return super.getBlockUninstall(userId, packageName);
        }
    }

    @NonNull
    @Override
    public WatchedArrayMap<String, WatchedLongSparseArray<SharedLibraryInfo>> getSharedLibraries() {
        synchronized (mLock) {
            return super.getSharedLibraries();
        }
    }
}
+31 −15
Original line number Diff line number Diff line
@@ -47,6 +47,8 @@ import android.util.SparseArray;
import com.android.server.pm.parsing.pkg.AndroidPackage;
import com.android.server.pm.pkg.PackageState;
import com.android.server.pm.pkg.PackageStateInternal;
import com.android.server.utils.WatchedArrayMap;
import com.android.server.utils.WatchedLongSparseArray;

import java.io.FileDescriptor;
import java.io.PrintWriter;
@@ -387,10 +389,10 @@ public final class ComputerTracker implements Computer {
            current.release();
        }
    }
    public String resolveInternalPackageNameLPr(String packageName, long versionCode) {
        ThreadComputer current = live();
    public String resolveInternalPackageName(String packageName, long versionCode) {
        ThreadComputer current = snapshot();
        try {
            return current.mComputer.resolveInternalPackageNameLPr(packageName, versionCode);
            return current.mComputer.resolveInternalPackageName(packageName, versionCode);
        } finally {
            current.release();
        }
@@ -497,7 +499,7 @@ public final class ComputerTracker implements Computer {
    }
    public boolean isInstantAppInternal(String packageName, @UserIdInt int userId,
            int callingUid) {
        ThreadComputer current = live();
        ThreadComputer current = snapshot();
        try {
            return current.mComputer.isInstantAppInternal(packageName, userId, callingUid);
        } finally {
@@ -525,7 +527,7 @@ public final class ComputerTracker implements Computer {
    public boolean shouldFilterApplication(@Nullable PackageStateInternal ps,
            int callingUid, @Nullable ComponentName component,
            @PackageManager.ComponentType int componentType, int userId) {
        ThreadComputer current = live();
        ThreadComputer current = snapshot();
        try {
            return current.mComputer.shouldFilterApplication(ps, callingUid, component,
                    componentType, userId);
@@ -535,7 +537,7 @@ public final class ComputerTracker implements Computer {
    }
    public boolean shouldFilterApplication(@Nullable PackageStateInternal ps,
            int callingUid, int userId) {
        ThreadComputer current = live();
        ThreadComputer current = snapshot();
        try {
            return current.mComputer.shouldFilterApplication(ps, callingUid, userId);
        } finally {
@@ -833,15 +835,6 @@ public final class ComputerTracker implements Computer {
        }
    }

    @Override
    public boolean isPackageStateAvailableAndVisible(@NonNull String packageName, int callingUid,
            @UserIdInt int userId) {
        try (ThreadComputer current = snapshot()) {
            return current.mComputer.isPackageStateAvailableAndVisible(packageName, callingUid,
                    userId);
        }
    }

    @Override
    public int checkSignatures(@NonNull String pkg1,
            @NonNull String pkg2) {
@@ -1272,4 +1265,27 @@ public final class ComputerTracker implements Computer {
            return current.mComputer.getProcessesForUid(uid);
        }
    }

    @Override
    public PackageStateInternal getPackageStateFiltered(@NonNull String packageName, int callingUid,
            @UserIdInt int userId) {
        try (ThreadComputer current = snapshot()) {
            return current.mComputer.getPackageStateFiltered(packageName, callingUid, userId);
        }
    }

    @Override
    public boolean getBlockUninstall(@UserIdInt int userId, @NonNull String packageName) {
        try (ThreadComputer current = snapshot()) {
            return current.mComputer.getBlockUninstall(userId, packageName);
        }
    }

    @NonNull
    @Override
    public WatchedArrayMap<String, WatchedLongSparseArray<SharedLibraryInfo>> getSharedLibraries() {
        try (ThreadComputer current = snapshot()) {
            return current.mComputer.getSharedLibraries();
        }
    }
}
Loading