Loading services/core/java/android/content/pm/PackageManagerInternal.java +11 −6 Original line number Diff line number Diff line Loading @@ -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. Loading services/core/java/com/android/server/om/OverlayManagerService.java +8 −6 Original line number Diff line number Diff line Loading @@ -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 = Loading @@ -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=[" Loading @@ -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); Loading services/core/java/com/android/server/pm/PackageManagerService.java +99 −64 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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) { Loading @@ -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; } Loading @@ -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); Loading @@ -6531,12 +6567,11 @@ public class PackageManagerService implements PackageSender, TestUtilityService .setOverlayPathsForLibrary(libName, newOverlayPaths); } } } }); } invalidatePackageInfoCache(); return true; } private void enforceAdjustRuntimePermissionsPolicyOrUpgradeRuntimePermissions( Loading Loading
services/core/java/android/content/pm/PackageManagerInternal.java +11 −6 Original line number Diff line number Diff line Loading @@ -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. Loading
services/core/java/com/android/server/om/OverlayManagerService.java +8 −6 Original line number Diff line number Diff line Loading @@ -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 = Loading @@ -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=[" Loading @@ -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); Loading
services/core/java/com/android/server/pm/PackageManagerService.java +99 −64 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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) { Loading @@ -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; } Loading @@ -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); Loading @@ -6531,12 +6567,11 @@ public class PackageManagerService implements PackageSender, TestUtilityService .setOverlayPathsForLibrary(libName, newOverlayPaths); } } } }); } invalidatePackageInfoCache(); return true; } private void enforceAdjustRuntimePermissionsPolicyOrUpgradeRuntimePermissions( Loading