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

Commit 633a8c6d authored by Felka Chang's avatar Felka Chang Committed by Android (Google) Code Review
Browse files

Merge "Remove snapshot flood by update all overlays in one commitment"

parents 1a74f185 655a3f42
Loading
Loading
Loading
Loading
+11 −6
Original line number Diff line number Diff line
@@ -552,18 +552,23 @@ public abstract class PackageManagerInternal {
    /**
     * Set which overlay to use for a package.
     * @param userId The user for which to update the overlays.
     * @param targetPackageName The package name of the package for which to update the overlays.
     * @param overlayPaths  The complete list of overlay paths that should be enabled for
     * @param pendingChanges is a map to describe all overlay targets and their related overlay
     *                      paths. Its key is the overlay target package and its value is the
     *                      complete list of overlay paths that should be enabled for
     *                      the target. Previously enabled overlays not specified in the list
     *                      will be disabled. Pass in null or empty paths to disable all overlays.
     *                      The order of the items is significant if several overlays modify the
     *                      same resource.
     *                      same resource. To pass the concrete ArrayMap type is to reduce the
     *                      overheads of system server.
     * @param outUpdatedPackageNames An output list that contains the package names of packages
     *                               affected by the update of enabled overlays.
     * @return true if all packages names were known by the package manager, false otherwise
     * @param outInvalidPackageNames An output list that contains the package names of packages
     *                               are not valid.
     */
    public abstract boolean setEnabledOverlayPackages(int userId, String targetPackageName,
            @Nullable OverlayPaths overlayPaths, Set<String> outUpdatedPackageNames);
    public abstract void setEnabledOverlayPackages(int userId,
            @NonNull ArrayMap<String, OverlayPaths> pendingChanges,
            @NonNull Set<String> outUpdatedPackageNames,
            @NonNull Set<String> outInvalidPackageNames);

    /**
     * Resolves an activity intent, allowing instant apps to be resolved.
+8 −6
Original line number Diff line number Diff line
@@ -1477,7 +1477,7 @@ public final class OverlayManagerService extends SystemService {
                targetPackageNames = pm.getTargetPackageNames(userId);
            }

            final Map<String, OverlayPaths> pendingChanges =
            final ArrayMap<String, OverlayPaths> pendingChanges =
                    new ArrayMap<>(targetPackageNames.size());
            synchronized (mLock) {
                final OverlayPaths frameworkOverlays =
@@ -1493,6 +1493,9 @@ public final class OverlayManagerService extends SystemService {
            }

            final HashSet<String> updatedPackages = new HashSet<>();
            final HashSet<String> invalidPackages = new HashSet<>();
            pm.setEnabledOverlayPackages(userId, pendingChanges, updatedPackages, invalidPackages);

            for (final String targetPackageName : targetPackageNames) {
                if (DEBUG) {
                    Slog.d(TAG, "-> Updating overlay: target=" + targetPackageName + " overlays=["
@@ -1500,11 +1503,10 @@ public final class OverlayManagerService extends SystemService {
                            + "] userId=" + userId);
                }

                if (!pm.setEnabledOverlayPackages(
                        userId, targetPackageName, pendingChanges.get(targetPackageName),
                        updatedPackages)) {
                    Slog.e(TAG, String.format("Failed to change enabled overlays for %s user %d",
                            targetPackageName, userId));
                if (invalidPackages.contains(targetPackageName)) {
                    Slog.e(TAG, TextUtils.formatSimple(
                            "Failed to change enabled overlays for %s user %d", targetPackageName,
                            userId));
                }
            }
            return new ArrayList<>(updatedPackages);
+99 −64
Original line number Diff line number Diff line
@@ -6246,11 +6246,12 @@ public class PackageManagerService implements PackageSender, TestUtilityService
        }

        @Override
        public boolean setEnabledOverlayPackages(int userId, @NonNull String targetPackageName,
                @Nullable OverlayPaths overlayPaths,
                @NonNull Set<String> outUpdatedPackageNames) {
            return PackageManagerService.this.setEnabledOverlayPackages(userId, targetPackageName,
                    overlayPaths, outUpdatedPackageNames);
        public void setEnabledOverlayPackages(int userId,
                @NonNull ArrayMap<String, OverlayPaths> pendingChanges,
                @NonNull Set<String> outUpdatedPackageNames,
                @NonNull Set<String> outInvalidPackageNames) {
            PackageManagerService.this.setEnabledOverlayPackages(userId,
                    pendingChanges, outUpdatedPackageNames, outInvalidPackageNames);
        }

        @Override
@@ -6458,23 +6459,32 @@ public class PackageManagerService implements PackageSender, TestUtilityService
        }
    }

    private boolean setEnabledOverlayPackages(@UserIdInt int userId,
            @NonNull String targetPackageName, @Nullable OverlayPaths newOverlayPaths,
            @NonNull Set<String> outUpdatedPackageNames) {
    private void setEnabledOverlayPackages(@UserIdInt int userId,
            @NonNull ArrayMap<String, OverlayPaths> pendingChanges,
            @NonNull Set<String> outUpdatedPackageNames,
            @NonNull Set<String> outInvalidPackageNames) {
        final ArrayMap<String, ArrayMap<String, ArraySet<String>>>
                targetPkgToLibNameToModifiedDependents = new ArrayMap<>();
        final int numberOfPendingChanges = pendingChanges.size();

        synchronized (mOverlayPathsLock) {
            final ArrayMap<String, ArraySet<String>> libNameToModifiedDependents = new ArrayMap<>();
            Computer computer = snapshotComputer();
            for (int i = 0; i < numberOfPendingChanges; i++) {
                final String targetPackageName = pendingChanges.keyAt(i);
                final OverlayPaths newOverlayPaths = pendingChanges.valueAt(i);
                final PackageStateInternal packageState = computer.getPackageStateInternal(
                        targetPackageName);
            final AndroidPackage targetPkg = packageState == null ? null : packageState.getPkg();
                final AndroidPackage targetPkg =
                        packageState == null ? null : packageState.getPkg();
                if (targetPackageName == null || targetPkg == null) {
                    Slog.e(TAG, "failed to find package " + targetPackageName);
                return false;
                    outInvalidPackageNames.add(targetPackageName);
                    continue;
                }

                if (Objects.equals(packageState.getUserStateOrDefault(userId).getOverlayPaths(),
                        newOverlayPaths)) {
                return true;
                    continue;
                }

                if (targetPkg.getLibraryNames() != null) {
@@ -6487,8 +6497,9 @@ public class PackageManagerService implements PackageSender, TestUtilityService
                        if (info == null) {
                            continue;
                        }
                    final List<VersionedPackage> dependents = computer
                            .getPackagesUsingSharedLibrary(info, 0, Process.SYSTEM_UID, userId);
                        final List<VersionedPackage> dependents =
                                computer.getPackagesUsingSharedLibrary(info, 0, Process.SYSTEM_UID,
                                        userId);
                        if (dependents == null) {
                            continue;
                        }
@@ -6509,19 +6520,44 @@ public class PackageManagerService implements PackageSender, TestUtilityService
                        }

                        if (modifiedDependents != null) {
                            ArrayMap<String, ArraySet<String>> libNameToModifiedDependents =
                                    targetPkgToLibNameToModifiedDependents.get(
                                            targetPackageName);
                            if (libNameToModifiedDependents == null) {
                                libNameToModifiedDependents = new ArrayMap<>();
                                targetPkgToLibNameToModifiedDependents.put(targetPackageName,
                                        libNameToModifiedDependents);
                            }
                            libNameToModifiedDependents.put(libName, modifiedDependents);
                        }
                    }
                }

                outUpdatedPackageNames.add(targetPackageName);
            }

            commitPackageStateMutation(null, mutator -> {
                for (int i = 0; i < numberOfPendingChanges; i++) {
                    final String targetPackageName = pendingChanges.keyAt(i);
                    final OverlayPaths newOverlayPaths = pendingChanges.valueAt(i);

                    if (!outUpdatedPackageNames.contains(targetPackageName)) {
                        continue;
                    }

                    mutator.forPackage(targetPackageName)
                            .userState(userId)
                            .setOverlayPaths(newOverlayPaths);

                for (int mapIndex = 0; mapIndex < libNameToModifiedDependents.size(); mapIndex++) {
                    final ArrayMap<String, ArraySet<String>> libNameToModifiedDependents =
                            targetPkgToLibNameToModifiedDependents.get(
                                    targetPackageName);
                    if (libNameToModifiedDependents == null) {
                        continue;
                    }

                    for (int mapIndex = 0; mapIndex < libNameToModifiedDependents.size();
                            mapIndex++) {
                        String libName = libNameToModifiedDependents.keyAt(mapIndex);
                        ArraySet<String> modifiedDependents =
                                libNameToModifiedDependents.valueAt(mapIndex);
@@ -6531,12 +6567,11 @@ public class PackageManagerService implements PackageSender, TestUtilityService
                                    .setOverlayPathsForLibrary(libName, newOverlayPaths);
                        }
                    }
                }
            });
        }

        invalidatePackageInfoCache();

        return true;
    }

    private void enforceAdjustRuntimePermissionsPolicyOrUpgradeRuntimePermissions(