Loading core/java/android/content/pm/overlay/OverlayPaths.java +0 −7 Original line number Diff line number Diff line Loading @@ -49,13 +49,6 @@ public class OverlayPaths { public static class Builder { final OverlayPaths mPaths = new OverlayPaths(); public Builder() {} public Builder(@NonNull OverlayPaths base) { mPaths.mResourceDirs.addAll(base.getResourceDirs()); mPaths.mOverlayPaths.addAll(base.getOverlayPaths()); } /** * Adds a non-APK path to the contents of {@link OverlayPaths#getOverlayPaths()}. */ Loading services/core/java/com/android/server/om/IdmapManager.java +1 −1 Original line number Diff line number Diff line Loading @@ -257,7 +257,7 @@ final class IdmapManager { private boolean matchesActorSignature(@NonNull AndroidPackage targetPackage, @NonNull AndroidPackage overlayPackage, int userId) { String targetOverlayableName = overlayPackage.getOverlayTargetOverlayableName(); if (targetOverlayableName != null && !mPackageManager.getNamedActors().isEmpty()) { if (targetOverlayableName != null) { try { OverlayableInfo overlayableInfo = mPackageManager.getOverlayableForTarget( targetPackage.getPackageName(), targetOverlayableName, userId); Loading services/core/java/com/android/server/om/OverlayManagerService.java +47 −68 Original line number Diff line number Diff line Loading @@ -32,7 +32,6 @@ import static android.os.Process.INVALID_UID; import static android.os.Trace.TRACE_TAG_RRO; import static android.os.Trace.traceBegin; import static android.os.Trace.traceEnd; import static com.android.server.om.OverlayManagerServiceImpl.OperationFailedException; import android.annotation.NonNull; Loading Loading @@ -363,7 +362,7 @@ public final class OverlayManagerService extends SystemService { defaultPackages.add(packageName); } } return defaultPackages.toArray(new String[0]); return defaultPackages.toArray(new String[defaultPackages.size()]); } private final class OverlayManagerPackageMonitor extends PackageMonitor { Loading Loading @@ -1144,10 +1143,9 @@ public final class OverlayManagerService extends SystemService { }; private static final class PackageManagerHelperImpl implements PackageManagerHelper { private static final class PackageStateUsers { private static class PackageStateUsers { private PackageState mPackageState; private Boolean mDefinesOverlayable = null; private final ArraySet<Integer> mInstalledUsers = new ArraySet<>(); private final Set<Integer> mInstalledUsers = new ArraySet<>(); private PackageStateUsers(@NonNull PackageState packageState) { this.mPackageState = packageState; } Loading @@ -1162,7 +1160,7 @@ public final class OverlayManagerService extends SystemService { // state may lead to contradictions within OMS. Better then to lag // behind until all pending intents have been processed. private final ArrayMap<String, PackageStateUsers> mCache = new ArrayMap<>(); private final ArraySet<Integer> mInitializedUsers = new ArraySet<>(); private final Set<Integer> mInitializedUsers = new ArraySet<>(); PackageManagerHelperImpl(Context context) { mContext = context; Loading @@ -1178,7 +1176,8 @@ public final class OverlayManagerService extends SystemService { */ @NonNull public ArrayMap<String, PackageState> initializeForUser(final int userId) { if (mInitializedUsers.add(userId)) { if (!mInitializedUsers.contains(userId)) { mInitializedUsers.add(userId); mPackageManagerInternal.forEachPackageState((packageState -> { if (packageState.getPkg() != null && packageState.getUserStateOrDefault(userId).isInstalled()) { Loading @@ -1197,11 +1196,13 @@ public final class OverlayManagerService extends SystemService { return userPackages; } private PackageStateUsers getRawPackageStateForUser(@NonNull final String packageName, @Override @Nullable public PackageState getPackageStateForUser(@NonNull final String packageName, final int userId) { final PackageStateUsers pkg = mCache.get(packageName); if (pkg != null && pkg.mInstalledUsers.contains(userId)) { return pkg; return pkg.mPackageState; } try { if (!mPackageManager.isPackageAvailable(packageName, userId)) { Loading @@ -1215,14 +1216,8 @@ public final class OverlayManagerService extends SystemService { return addPackageUser(packageName, userId); } @Override public PackageState getPackageStateForUser(@NonNull final String packageName, final int userId) { final PackageStateUsers pkg = getRawPackageStateForUser(packageName, userId); return pkg != null ? pkg.mPackageState : null; } private PackageStateUsers addPackageUser(@NonNull final String packageName, @NonNull private PackageState addPackageUser(@NonNull final String packageName, final int user) { final PackageState pkg = mPackageManagerInternal.getPackageStateInternal(packageName); if (pkg == null) { Loading @@ -1234,20 +1229,20 @@ public final class OverlayManagerService extends SystemService { } @NonNull private PackageStateUsers addPackageUser(@NonNull final PackageState pkg, private PackageState addPackageUser(@NonNull final PackageState pkg, final int user) { PackageStateUsers pkgUsers = mCache.get(pkg.getPackageName()); if (pkgUsers == null) { pkgUsers = new PackageStateUsers(pkg); mCache.put(pkg.getPackageName(), pkgUsers); } else if (pkgUsers.mPackageState != pkg) { } else { pkgUsers.mPackageState = pkg; pkgUsers.mDefinesOverlayable = null; } pkgUsers.mInstalledUsers.add(user); return pkgUsers; return pkgUsers.mPackageState; } @NonNull private void removePackageUser(@NonNull final String packageName, final int user) { final PackageStateUsers pkgUsers = mCache.get(packageName); Loading @@ -1265,15 +1260,15 @@ public final class OverlayManagerService extends SystemService { } } @Nullable public PackageState onPackageAdded(@NonNull final String packageName, final int userId) { final var pu = addPackageUser(packageName, userId); return pu != null ? pu.mPackageState : null; return addPackageUser(packageName, userId); } @Nullable public PackageState onPackageUpdated(@NonNull final String packageName, final int userId) { final var pu = addPackageUser(packageName, userId); return pu != null ? pu.mPackageState : null; return addPackageUser(packageName, userId); } public void onPackageRemoved(@NonNull final String packageName, final int userId) { Loading Loading @@ -1313,30 +1308,22 @@ public final class OverlayManagerService extends SystemService { return (pkgs.length == 0) ? null : pkgs[0]; } @Nullable @Override public OverlayableInfo getOverlayableForTarget(@NonNull String packageName, @NonNull String targetOverlayableName, int userId) throws IOException { final var psu = getRawPackageStateForUser(packageName, userId); final var pkg = (psu == null || psu.mPackageState == null) ? null : psu.mPackageState.getAndroidPackage(); var packageState = getPackageStateForUser(packageName, userId); var pkg = packageState == null ? null : packageState.getAndroidPackage(); if (pkg == null) { throw new IOException("Unable to get target package"); } if (Boolean.FALSE.equals(psu.mDefinesOverlayable)) { return null; } ApkAssets apkAssets = null; try { apkAssets = ApkAssets.loadFromPath(pkg.getSplits().get(0).getPath(), ApkAssets.PROPERTY_ONLY_OVERLAYABLES); if (psu.mDefinesOverlayable == null) { psu.mDefinesOverlayable = apkAssets.definesOverlayable(); } return Boolean.FALSE.equals(psu.mDefinesOverlayable) ? null : apkAssets.getOverlayableInfo(targetOverlayableName); return apkAssets.getOverlayableInfo(targetOverlayableName); } finally { if (apkAssets != null) { try { Loading @@ -1350,19 +1337,16 @@ public final class OverlayManagerService extends SystemService { @Override public boolean doesTargetDefineOverlayable(String targetPackageName, int userId) throws IOException { final var psu = getRawPackageStateForUser(targetPackageName, userId); var pkg = (psu == null || psu.mPackageState == null) ? null : psu.mPackageState.getAndroidPackage(); var packageState = getPackageStateForUser(targetPackageName, userId); var pkg = packageState == null ? null : packageState.getAndroidPackage(); if (pkg == null) { throw new IOException("Unable to get target package"); } if (psu.mDefinesOverlayable == null) { ApkAssets apkAssets = null; try { apkAssets = ApkAssets.loadFromPath(pkg.getSplits().get(0).getPath(), ApkAssets.PROPERTY_ONLY_OVERLAYABLES); psu.mDefinesOverlayable = apkAssets.definesOverlayable(); apkAssets = ApkAssets.loadFromPath(pkg.getSplits().get(0).getPath()); return apkAssets.definesOverlayable(); } finally { if (apkAssets != null) { try { Loading @@ -1372,8 +1356,6 @@ public final class OverlayManagerService extends SystemService { } } } return psu.mDefinesOverlayable; } @Override public void enforcePermission(String permission, String message) throws SecurityException { Loading Loading @@ -1563,7 +1545,8 @@ public final class OverlayManagerService extends SystemService { final OverlayPaths frameworkOverlays = mImpl.getEnabledOverlayPaths("android", userId, false); for (final String targetPackageName : targetPackageNames) { final var list = new OverlayPaths.Builder(frameworkOverlays); final OverlayPaths.Builder list = new OverlayPaths.Builder(); list.addAll(frameworkOverlays); if (!"android".equals(targetPackageName)) { list.addAll(mImpl.getEnabledOverlayPaths(targetPackageName, userId, true)); } Loading @@ -1575,23 +1558,19 @@ public final class OverlayManagerService extends SystemService { final HashSet<String> invalidPackages = new HashSet<>(); pm.setEnabledOverlayPackages(userId, pendingChanges, updatedPackages, invalidPackages); if (DEBUG || !invalidPackages.isEmpty()) { for (final String targetPackageName : targetPackageNames) { if (DEBUG) { Slog.d(TAG, "-> Updating overlay: target=" + targetPackageName + " overlays=[" Slog.d(TAG, "-> Updating overlay: target=" + targetPackageName + " overlays=[" + pendingChanges.get(targetPackageName) + "] userId=" + userId); } if (invalidPackages.contains(targetPackageName)) { Slog.e(TAG, TextUtils.formatSimple( "Failed to change enabled overlays for %s user %d", targetPackageName, "Failed to change enabled overlays for %s user %d", targetPackageName, userId)); } } } return new ArrayList<>(updatedPackages); } finally { traceEnd(TRACE_TAG_RRO); Loading services/core/java/com/android/server/om/OverlayManagerServiceImpl.java +9 −5 Original line number Diff line number Diff line Loading @@ -772,20 +772,24 @@ final class OverlayManagerServiceImpl { OverlayPaths getEnabledOverlayPaths(@NonNull final String targetPackageName, final int userId, boolean includeImmutableOverlays) { final var paths = new OverlayPaths.Builder(); mSettings.forEachMatching(userId, null, targetPackageName, oi -> { final List<OverlayInfo> overlays = mSettings.getOverlaysForTarget(targetPackageName, userId); final OverlayPaths.Builder paths = new OverlayPaths.Builder(); final int n = overlays.size(); for (int i = 0; i < n; i++) { final OverlayInfo oi = overlays.get(i); if (!oi.isEnabled()) { return; continue; } if (!includeImmutableOverlays && !oi.isMutable) { return; continue; } if (oi.isFabricated()) { paths.addNonApkPath(oi.baseCodePath); } else { paths.addApkPath(oi.baseCodePath); } }); } return paths.build(); } Loading services/core/java/com/android/server/om/OverlayManagerSettings.java +0 −18 Original line number Diff line number Diff line Loading @@ -47,7 +47,6 @@ import java.util.ArrayList; import java.util.List; import java.util.Objects; import java.util.Set; import java.util.function.Consumer; import java.util.function.Predicate; import java.util.stream.Stream; Loading Loading @@ -183,23 +182,6 @@ final class OverlayManagerSettings { return CollectionUtils.map(items, SettingsItem::getOverlayInfo); } void forEachMatching(int userId, String overlayName, String targetPackageName, @NonNull Consumer<OverlayInfo> consumer) { for (int i = 0, n = mItems.size(); i < n; i++) { final SettingsItem item = mItems.get(i); if (item.getUserId() != userId) { continue; } if (overlayName != null && !item.mOverlay.getPackageName().equals(overlayName)) { continue; } if (targetPackageName != null && !item.mTargetPackageName.equals(targetPackageName)) { continue; } consumer.accept(item.getOverlayInfo()); } } ArrayMap<String, List<OverlayInfo>> getOverlaysForUser(final int userId) { final List<SettingsItem> items = selectWhereUser(userId); Loading Loading
core/java/android/content/pm/overlay/OverlayPaths.java +0 −7 Original line number Diff line number Diff line Loading @@ -49,13 +49,6 @@ public class OverlayPaths { public static class Builder { final OverlayPaths mPaths = new OverlayPaths(); public Builder() {} public Builder(@NonNull OverlayPaths base) { mPaths.mResourceDirs.addAll(base.getResourceDirs()); mPaths.mOverlayPaths.addAll(base.getOverlayPaths()); } /** * Adds a non-APK path to the contents of {@link OverlayPaths#getOverlayPaths()}. */ Loading
services/core/java/com/android/server/om/IdmapManager.java +1 −1 Original line number Diff line number Diff line Loading @@ -257,7 +257,7 @@ final class IdmapManager { private boolean matchesActorSignature(@NonNull AndroidPackage targetPackage, @NonNull AndroidPackage overlayPackage, int userId) { String targetOverlayableName = overlayPackage.getOverlayTargetOverlayableName(); if (targetOverlayableName != null && !mPackageManager.getNamedActors().isEmpty()) { if (targetOverlayableName != null) { try { OverlayableInfo overlayableInfo = mPackageManager.getOverlayableForTarget( targetPackage.getPackageName(), targetOverlayableName, userId); Loading
services/core/java/com/android/server/om/OverlayManagerService.java +47 −68 Original line number Diff line number Diff line Loading @@ -32,7 +32,6 @@ import static android.os.Process.INVALID_UID; import static android.os.Trace.TRACE_TAG_RRO; import static android.os.Trace.traceBegin; import static android.os.Trace.traceEnd; import static com.android.server.om.OverlayManagerServiceImpl.OperationFailedException; import android.annotation.NonNull; Loading Loading @@ -363,7 +362,7 @@ public final class OverlayManagerService extends SystemService { defaultPackages.add(packageName); } } return defaultPackages.toArray(new String[0]); return defaultPackages.toArray(new String[defaultPackages.size()]); } private final class OverlayManagerPackageMonitor extends PackageMonitor { Loading Loading @@ -1144,10 +1143,9 @@ public final class OverlayManagerService extends SystemService { }; private static final class PackageManagerHelperImpl implements PackageManagerHelper { private static final class PackageStateUsers { private static class PackageStateUsers { private PackageState mPackageState; private Boolean mDefinesOverlayable = null; private final ArraySet<Integer> mInstalledUsers = new ArraySet<>(); private final Set<Integer> mInstalledUsers = new ArraySet<>(); private PackageStateUsers(@NonNull PackageState packageState) { this.mPackageState = packageState; } Loading @@ -1162,7 +1160,7 @@ public final class OverlayManagerService extends SystemService { // state may lead to contradictions within OMS. Better then to lag // behind until all pending intents have been processed. private final ArrayMap<String, PackageStateUsers> mCache = new ArrayMap<>(); private final ArraySet<Integer> mInitializedUsers = new ArraySet<>(); private final Set<Integer> mInitializedUsers = new ArraySet<>(); PackageManagerHelperImpl(Context context) { mContext = context; Loading @@ -1178,7 +1176,8 @@ public final class OverlayManagerService extends SystemService { */ @NonNull public ArrayMap<String, PackageState> initializeForUser(final int userId) { if (mInitializedUsers.add(userId)) { if (!mInitializedUsers.contains(userId)) { mInitializedUsers.add(userId); mPackageManagerInternal.forEachPackageState((packageState -> { if (packageState.getPkg() != null && packageState.getUserStateOrDefault(userId).isInstalled()) { Loading @@ -1197,11 +1196,13 @@ public final class OverlayManagerService extends SystemService { return userPackages; } private PackageStateUsers getRawPackageStateForUser(@NonNull final String packageName, @Override @Nullable public PackageState getPackageStateForUser(@NonNull final String packageName, final int userId) { final PackageStateUsers pkg = mCache.get(packageName); if (pkg != null && pkg.mInstalledUsers.contains(userId)) { return pkg; return pkg.mPackageState; } try { if (!mPackageManager.isPackageAvailable(packageName, userId)) { Loading @@ -1215,14 +1216,8 @@ public final class OverlayManagerService extends SystemService { return addPackageUser(packageName, userId); } @Override public PackageState getPackageStateForUser(@NonNull final String packageName, final int userId) { final PackageStateUsers pkg = getRawPackageStateForUser(packageName, userId); return pkg != null ? pkg.mPackageState : null; } private PackageStateUsers addPackageUser(@NonNull final String packageName, @NonNull private PackageState addPackageUser(@NonNull final String packageName, final int user) { final PackageState pkg = mPackageManagerInternal.getPackageStateInternal(packageName); if (pkg == null) { Loading @@ -1234,20 +1229,20 @@ public final class OverlayManagerService extends SystemService { } @NonNull private PackageStateUsers addPackageUser(@NonNull final PackageState pkg, private PackageState addPackageUser(@NonNull final PackageState pkg, final int user) { PackageStateUsers pkgUsers = mCache.get(pkg.getPackageName()); if (pkgUsers == null) { pkgUsers = new PackageStateUsers(pkg); mCache.put(pkg.getPackageName(), pkgUsers); } else if (pkgUsers.mPackageState != pkg) { } else { pkgUsers.mPackageState = pkg; pkgUsers.mDefinesOverlayable = null; } pkgUsers.mInstalledUsers.add(user); return pkgUsers; return pkgUsers.mPackageState; } @NonNull private void removePackageUser(@NonNull final String packageName, final int user) { final PackageStateUsers pkgUsers = mCache.get(packageName); Loading @@ -1265,15 +1260,15 @@ public final class OverlayManagerService extends SystemService { } } @Nullable public PackageState onPackageAdded(@NonNull final String packageName, final int userId) { final var pu = addPackageUser(packageName, userId); return pu != null ? pu.mPackageState : null; return addPackageUser(packageName, userId); } @Nullable public PackageState onPackageUpdated(@NonNull final String packageName, final int userId) { final var pu = addPackageUser(packageName, userId); return pu != null ? pu.mPackageState : null; return addPackageUser(packageName, userId); } public void onPackageRemoved(@NonNull final String packageName, final int userId) { Loading Loading @@ -1313,30 +1308,22 @@ public final class OverlayManagerService extends SystemService { return (pkgs.length == 0) ? null : pkgs[0]; } @Nullable @Override public OverlayableInfo getOverlayableForTarget(@NonNull String packageName, @NonNull String targetOverlayableName, int userId) throws IOException { final var psu = getRawPackageStateForUser(packageName, userId); final var pkg = (psu == null || psu.mPackageState == null) ? null : psu.mPackageState.getAndroidPackage(); var packageState = getPackageStateForUser(packageName, userId); var pkg = packageState == null ? null : packageState.getAndroidPackage(); if (pkg == null) { throw new IOException("Unable to get target package"); } if (Boolean.FALSE.equals(psu.mDefinesOverlayable)) { return null; } ApkAssets apkAssets = null; try { apkAssets = ApkAssets.loadFromPath(pkg.getSplits().get(0).getPath(), ApkAssets.PROPERTY_ONLY_OVERLAYABLES); if (psu.mDefinesOverlayable == null) { psu.mDefinesOverlayable = apkAssets.definesOverlayable(); } return Boolean.FALSE.equals(psu.mDefinesOverlayable) ? null : apkAssets.getOverlayableInfo(targetOverlayableName); return apkAssets.getOverlayableInfo(targetOverlayableName); } finally { if (apkAssets != null) { try { Loading @@ -1350,19 +1337,16 @@ public final class OverlayManagerService extends SystemService { @Override public boolean doesTargetDefineOverlayable(String targetPackageName, int userId) throws IOException { final var psu = getRawPackageStateForUser(targetPackageName, userId); var pkg = (psu == null || psu.mPackageState == null) ? null : psu.mPackageState.getAndroidPackage(); var packageState = getPackageStateForUser(targetPackageName, userId); var pkg = packageState == null ? null : packageState.getAndroidPackage(); if (pkg == null) { throw new IOException("Unable to get target package"); } if (psu.mDefinesOverlayable == null) { ApkAssets apkAssets = null; try { apkAssets = ApkAssets.loadFromPath(pkg.getSplits().get(0).getPath(), ApkAssets.PROPERTY_ONLY_OVERLAYABLES); psu.mDefinesOverlayable = apkAssets.definesOverlayable(); apkAssets = ApkAssets.loadFromPath(pkg.getSplits().get(0).getPath()); return apkAssets.definesOverlayable(); } finally { if (apkAssets != null) { try { Loading @@ -1372,8 +1356,6 @@ public final class OverlayManagerService extends SystemService { } } } return psu.mDefinesOverlayable; } @Override public void enforcePermission(String permission, String message) throws SecurityException { Loading Loading @@ -1563,7 +1545,8 @@ public final class OverlayManagerService extends SystemService { final OverlayPaths frameworkOverlays = mImpl.getEnabledOverlayPaths("android", userId, false); for (final String targetPackageName : targetPackageNames) { final var list = new OverlayPaths.Builder(frameworkOverlays); final OverlayPaths.Builder list = new OverlayPaths.Builder(); list.addAll(frameworkOverlays); if (!"android".equals(targetPackageName)) { list.addAll(mImpl.getEnabledOverlayPaths(targetPackageName, userId, true)); } Loading @@ -1575,23 +1558,19 @@ public final class OverlayManagerService extends SystemService { final HashSet<String> invalidPackages = new HashSet<>(); pm.setEnabledOverlayPackages(userId, pendingChanges, updatedPackages, invalidPackages); if (DEBUG || !invalidPackages.isEmpty()) { for (final String targetPackageName : targetPackageNames) { if (DEBUG) { Slog.d(TAG, "-> Updating overlay: target=" + targetPackageName + " overlays=[" Slog.d(TAG, "-> Updating overlay: target=" + targetPackageName + " overlays=[" + pendingChanges.get(targetPackageName) + "] userId=" + userId); } if (invalidPackages.contains(targetPackageName)) { Slog.e(TAG, TextUtils.formatSimple( "Failed to change enabled overlays for %s user %d", targetPackageName, "Failed to change enabled overlays for %s user %d", targetPackageName, userId)); } } } return new ArrayList<>(updatedPackages); } finally { traceEnd(TRACE_TAG_RRO); Loading
services/core/java/com/android/server/om/OverlayManagerServiceImpl.java +9 −5 Original line number Diff line number Diff line Loading @@ -772,20 +772,24 @@ final class OverlayManagerServiceImpl { OverlayPaths getEnabledOverlayPaths(@NonNull final String targetPackageName, final int userId, boolean includeImmutableOverlays) { final var paths = new OverlayPaths.Builder(); mSettings.forEachMatching(userId, null, targetPackageName, oi -> { final List<OverlayInfo> overlays = mSettings.getOverlaysForTarget(targetPackageName, userId); final OverlayPaths.Builder paths = new OverlayPaths.Builder(); final int n = overlays.size(); for (int i = 0; i < n; i++) { final OverlayInfo oi = overlays.get(i); if (!oi.isEnabled()) { return; continue; } if (!includeImmutableOverlays && !oi.isMutable) { return; continue; } if (oi.isFabricated()) { paths.addNonApkPath(oi.baseCodePath); } else { paths.addApkPath(oi.baseCodePath); } }); } return paths.build(); } Loading
services/core/java/com/android/server/om/OverlayManagerSettings.java +0 −18 Original line number Diff line number Diff line Loading @@ -47,7 +47,6 @@ import java.util.ArrayList; import java.util.List; import java.util.Objects; import java.util.Set; import java.util.function.Consumer; import java.util.function.Predicate; import java.util.stream.Stream; Loading Loading @@ -183,23 +182,6 @@ final class OverlayManagerSettings { return CollectionUtils.map(items, SettingsItem::getOverlayInfo); } void forEachMatching(int userId, String overlayName, String targetPackageName, @NonNull Consumer<OverlayInfo> consumer) { for (int i = 0, n = mItems.size(); i < n; i++) { final SettingsItem item = mItems.get(i); if (item.getUserId() != userId) { continue; } if (overlayName != null && !item.mOverlay.getPackageName().equals(overlayName)) { continue; } if (targetPackageName != null && !item.mTargetPackageName.equals(targetPackageName)) { continue; } consumer.accept(item.getOverlayInfo()); } } ArrayMap<String, List<OverlayInfo>> getOverlaysForUser(final int userId) { final List<SettingsItem> items = selectWhereUser(userId); Loading