Loading services/core/java/com/android/server/om/OverlayManagerService.java +49 −31 Original line number Diff line number Diff line Loading @@ -1143,9 +1143,10 @@ public final class OverlayManagerService extends SystemService { }; private static final class PackageManagerHelperImpl implements PackageManagerHelper { private static class PackageStateUsers { private static final class PackageStateUsers { private PackageState mPackageState; private final Set<Integer> mInstalledUsers = new ArraySet<>(); private Boolean mDefinesOverlayable = null; private final ArraySet<Integer> mInstalledUsers = new ArraySet<>(); private PackageStateUsers(@NonNull PackageState packageState) { this.mPackageState = packageState; } Loading Loading @@ -1195,13 +1196,11 @@ public final class OverlayManagerService extends SystemService { return userPackages; } @Override @Nullable public PackageState getPackageStateForUser(@NonNull final String packageName, private PackageStateUsers getRawPackageStateForUser(@NonNull final String packageName, final int userId) { final PackageStateUsers pkg = mCache.get(packageName); if (pkg != null && pkg.mInstalledUsers.contains(userId)) { return pkg.mPackageState; return pkg; } try { if (!mPackageManager.isPackageAvailable(packageName, userId)) { Loading @@ -1215,8 +1214,14 @@ public final class OverlayManagerService extends SystemService { return addPackageUser(packageName, userId); } @NonNull private PackageState addPackageUser(@NonNull final String packageName, @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, final int user) { final PackageState pkg = mPackageManagerInternal.getPackageStateInternal(packageName); if (pkg == null) { Loading @@ -1228,20 +1233,20 @@ public final class OverlayManagerService extends SystemService { } @NonNull private PackageState addPackageUser(@NonNull final PackageState pkg, private PackageStateUsers 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 { } else if (pkgUsers.mPackageState != pkg) { pkgUsers.mPackageState = pkg; pkgUsers.mDefinesOverlayable = null; } pkgUsers.mInstalledUsers.add(user); return pkgUsers.mPackageState; return pkgUsers; } @NonNull private void removePackageUser(@NonNull final String packageName, final int user) { final PackageStateUsers pkgUsers = mCache.get(packageName); Loading @@ -1259,15 +1264,15 @@ public final class OverlayManagerService extends SystemService { } } @Nullable public PackageState onPackageAdded(@NonNull final String packageName, final int userId) { return addPackageUser(packageName, userId); final var pu = addPackageUser(packageName, userId); return pu != null ? pu.mPackageState : null; } @Nullable public PackageState onPackageUpdated(@NonNull final String packageName, final int userId) { return addPackageUser(packageName, userId); final var pu = addPackageUser(packageName, userId); return pu != null ? pu.mPackageState : null; } public void onPackageRemoved(@NonNull final String packageName, final int userId) { Loading Loading @@ -1307,22 +1312,30 @@ 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 { var packageState = getPackageStateForUser(packageName, userId); var pkg = packageState == null ? null : packageState.getAndroidPackage(); final var psu = getRawPackageStateForUser(packageName, userId); final var pkg = (psu == null || psu.mPackageState == null) ? null : psu.mPackageState.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); return apkAssets.getOverlayableInfo(targetOverlayableName); if (psu.mDefinesOverlayable == null) { psu.mDefinesOverlayable = apkAssets.definesOverlayable(); } return Boolean.FALSE.equals(psu.mDefinesOverlayable) ? null : apkAssets.getOverlayableInfo(targetOverlayableName); } finally { if (apkAssets != null) { try { Loading @@ -1336,16 +1349,19 @@ public final class OverlayManagerService extends SystemService { @Override public boolean doesTargetDefineOverlayable(String targetPackageName, int userId) throws IOException { var packageState = getPackageStateForUser(targetPackageName, userId); var pkg = packageState == null ? null : packageState.getAndroidPackage(); final var psu = getRawPackageStateForUser(targetPackageName, userId); var pkg = (psu == null || psu.mPackageState == null) ? null : psu.mPackageState.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()); return apkAssets.definesOverlayable(); apkAssets = ApkAssets.loadFromPath(pkg.getSplits().get(0).getPath(), ApkAssets.PROPERTY_ONLY_OVERLAYABLES); psu.mDefinesOverlayable = apkAssets.definesOverlayable(); } finally { if (apkAssets != null) { try { Loading @@ -1355,6 +1371,8 @@ public final class OverlayManagerService extends SystemService { } } } return psu.mDefinesOverlayable; } @Override public void enforcePermission(String permission, String message) throws SecurityException { Loading Loading
services/core/java/com/android/server/om/OverlayManagerService.java +49 −31 Original line number Diff line number Diff line Loading @@ -1143,9 +1143,10 @@ public final class OverlayManagerService extends SystemService { }; private static final class PackageManagerHelperImpl implements PackageManagerHelper { private static class PackageStateUsers { private static final class PackageStateUsers { private PackageState mPackageState; private final Set<Integer> mInstalledUsers = new ArraySet<>(); private Boolean mDefinesOverlayable = null; private final ArraySet<Integer> mInstalledUsers = new ArraySet<>(); private PackageStateUsers(@NonNull PackageState packageState) { this.mPackageState = packageState; } Loading Loading @@ -1195,13 +1196,11 @@ public final class OverlayManagerService extends SystemService { return userPackages; } @Override @Nullable public PackageState getPackageStateForUser(@NonNull final String packageName, private PackageStateUsers getRawPackageStateForUser(@NonNull final String packageName, final int userId) { final PackageStateUsers pkg = mCache.get(packageName); if (pkg != null && pkg.mInstalledUsers.contains(userId)) { return pkg.mPackageState; return pkg; } try { if (!mPackageManager.isPackageAvailable(packageName, userId)) { Loading @@ -1215,8 +1214,14 @@ public final class OverlayManagerService extends SystemService { return addPackageUser(packageName, userId); } @NonNull private PackageState addPackageUser(@NonNull final String packageName, @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, final int user) { final PackageState pkg = mPackageManagerInternal.getPackageStateInternal(packageName); if (pkg == null) { Loading @@ -1228,20 +1233,20 @@ public final class OverlayManagerService extends SystemService { } @NonNull private PackageState addPackageUser(@NonNull final PackageState pkg, private PackageStateUsers 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 { } else if (pkgUsers.mPackageState != pkg) { pkgUsers.mPackageState = pkg; pkgUsers.mDefinesOverlayable = null; } pkgUsers.mInstalledUsers.add(user); return pkgUsers.mPackageState; return pkgUsers; } @NonNull private void removePackageUser(@NonNull final String packageName, final int user) { final PackageStateUsers pkgUsers = mCache.get(packageName); Loading @@ -1259,15 +1264,15 @@ public final class OverlayManagerService extends SystemService { } } @Nullable public PackageState onPackageAdded(@NonNull final String packageName, final int userId) { return addPackageUser(packageName, userId); final var pu = addPackageUser(packageName, userId); return pu != null ? pu.mPackageState : null; } @Nullable public PackageState onPackageUpdated(@NonNull final String packageName, final int userId) { return addPackageUser(packageName, userId); final var pu = addPackageUser(packageName, userId); return pu != null ? pu.mPackageState : null; } public void onPackageRemoved(@NonNull final String packageName, final int userId) { Loading Loading @@ -1307,22 +1312,30 @@ 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 { var packageState = getPackageStateForUser(packageName, userId); var pkg = packageState == null ? null : packageState.getAndroidPackage(); final var psu = getRawPackageStateForUser(packageName, userId); final var pkg = (psu == null || psu.mPackageState == null) ? null : psu.mPackageState.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); return apkAssets.getOverlayableInfo(targetOverlayableName); if (psu.mDefinesOverlayable == null) { psu.mDefinesOverlayable = apkAssets.definesOverlayable(); } return Boolean.FALSE.equals(psu.mDefinesOverlayable) ? null : apkAssets.getOverlayableInfo(targetOverlayableName); } finally { if (apkAssets != null) { try { Loading @@ -1336,16 +1349,19 @@ public final class OverlayManagerService extends SystemService { @Override public boolean doesTargetDefineOverlayable(String targetPackageName, int userId) throws IOException { var packageState = getPackageStateForUser(targetPackageName, userId); var pkg = packageState == null ? null : packageState.getAndroidPackage(); final var psu = getRawPackageStateForUser(targetPackageName, userId); var pkg = (psu == null || psu.mPackageState == null) ? null : psu.mPackageState.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()); return apkAssets.definesOverlayable(); apkAssets = ApkAssets.loadFromPath(pkg.getSplits().get(0).getPath(), ApkAssets.PROPERTY_ONLY_OVERLAYABLES); psu.mDefinesOverlayable = apkAssets.definesOverlayable(); } finally { if (apkAssets != null) { try { Loading @@ -1355,6 +1371,8 @@ public final class OverlayManagerService extends SystemService { } } } return psu.mDefinesOverlayable; } @Override public void enforcePermission(String permission, String message) throws SecurityException { Loading