Loading core/java/android/content/pm/PackageParser.java +4 −1 Original line number Diff line number Diff line Loading @@ -6852,7 +6852,7 @@ public class PackageParser { ai.category = FallbackCategoryProvider.getFallbackCategory(ai.packageName); } ai.seInfoUser = SELinuxUtil.assignSeinfoUser(state); ai.resourceDirs = state.resourceDirs; ai.resourceDirs = state.overlayPaths; } public static ApplicationInfo generateApplicationInfo(Package p, int flags, Loading Loading @@ -7000,6 +7000,7 @@ public class PackageParser { return null; } if (!copyNeeded(flags, a.owner, state, a.metaData, userId)) { updateApplicationInfo(a.info.applicationInfo, flags, state); return a.info; } // Make shallow copies so we can store the metadata safely Loading Loading @@ -7088,6 +7089,7 @@ public class PackageParser { return null; } if (!copyNeeded(flags, s.owner, state, s.metaData, userId)) { updateApplicationInfo(s.info.applicationInfo, flags, state); return s.info; } // Make shallow copies so we can store the metadata safely Loading Loading @@ -7183,6 +7185,7 @@ public class PackageParser { if (!copyNeeded(flags, p.owner, state, p.metaData, userId) && ((flags & PackageManager.GET_URI_PERMISSION_PATTERNS) != 0 || p.info.uriPermissionPatterns == null)) { updateApplicationInfo(p.info.applicationInfo, flags, state); return p.info; } // Make shallow copies so we can store the metadata safely Loading core/java/android/content/pm/PackageUserState.java +3 −3 Original line number Diff line number Diff line Loading @@ -55,7 +55,7 @@ public class PackageUserState { public ArraySet<String> disabledComponents; public ArraySet<String> enabledComponents; public String[] resourceDirs; public String[] overlayPaths; public PackageUserState() { installed = true; Loading Loading @@ -83,8 +83,8 @@ public class PackageUserState { installReason = o.installReason; disabledComponents = ArrayUtils.cloneOrNull(o.disabledComponents); enabledComponents = ArrayUtils.cloneOrNull(o.enabledComponents); resourceDirs = o.resourceDirs == null ? null : Arrays.copyOf(o.resourceDirs, o.resourceDirs.length); overlayPaths = o.overlayPaths == null ? null : Arrays.copyOf(o.overlayPaths, o.overlayPaths.length); } /** Loading services/core/java/com/android/server/pm/PackageManagerService.java +22 −107 Original line number Diff line number Diff line Loading @@ -676,13 +676,6 @@ public class PackageManagerService extends IPackageManager.Stub @GuardedBy("mPackages") final SparseIntArray mIsolatedOwners = new SparseIntArray(); // List of APK paths to load for each user and package. This data is never // persisted by the package manager. Instead, the overlay manager will // ensure the data is up-to-date in runtime. @GuardedBy("mPackages") final SparseArray<ArrayMap<String, ArrayList<String>>> mEnabledOverlayPaths = new SparseArray<ArrayMap<String, ArrayList<String>>>(); /** * Tracks new system packages [received in an OTA] that we expect to * find updated user-installed versions. Keys are package name, values Loading Loading @@ -3584,8 +3577,6 @@ public class PackageManagerService extends IPackageManager.Stub return null; } rebaseEnabledOverlays(packageInfo.applicationInfo, userId); packageInfo.packageName = packageInfo.applicationInfo.packageName = resolveExternalPackageNameLPr(p); Loading Loading @@ -4097,7 +4088,6 @@ public class PackageManagerService extends IPackageManager.Stub ApplicationInfo ai = PackageParser.generateApplicationInfo(ps.pkg, flags, ps.readUserState(userId), userId); if (ai != null) { rebaseEnabledOverlays(ai, userId); ai.packageName = resolveExternalPackageNameLPr(ps.pkg); } return ai; Loading Loading @@ -4146,7 +4136,6 @@ public class PackageManagerService extends IPackageManager.Stub ApplicationInfo ai = PackageParser.generateApplicationInfo( p, flags, ps.readUserState(userId), userId); if (ai != null) { rebaseEnabledOverlays(ai, userId); ai.packageName = resolveExternalPackageNameLPr(p); } return ai; Loading @@ -4163,26 +4152,6 @@ public class PackageManagerService extends IPackageManager.Stub return null; } private void rebaseEnabledOverlays(@NonNull ApplicationInfo ai, int userId) { List<String> paths = new ArrayList<>(); ArrayMap<String, ArrayList<String>> userSpecificOverlays = mEnabledOverlayPaths.get(userId); if (userSpecificOverlays != null) { if (!"android".equals(ai.packageName)) { ArrayList<String> frameworkOverlays = userSpecificOverlays.get("android"); if (frameworkOverlays != null) { paths.addAll(frameworkOverlays); } } ArrayList<String> appOverlays = userSpecificOverlays.get(ai.packageName); if (appOverlays != null) { paths.addAll(appOverlays); } } ai.resourceDirs = paths.size() > 0 ? paths.toArray(new String[paths.size()]) : null; } private String normalizePackageNameLPr(String packageName) { String normalizedPackageName = mSettings.getRenamedPackageLPr(packageName); return normalizedPackageName != null ? normalizedPackageName : packageName; Loading Loading @@ -4567,24 +4536,6 @@ public class PackageManagerService extends IPackageManager.Stub return updateFlagsForComponent(flags, userId, intent /*cookie*/); } private ActivityInfo generateActivityInfo(ActivityInfo ai, int flags, PackageUserState state, int userId) { ActivityInfo ret = PackageParser.generateActivityInfo(ai, flags, state, userId); if (ret != null) { rebaseEnabledOverlays(ret.applicationInfo, userId); } return ret; } private ActivityInfo generateActivityInfo(PackageParser.Activity a, int flags, PackageUserState state, int userId) { ActivityInfo ai = PackageParser.generateActivityInfo(a, flags, state, userId); if (ai != null) { rebaseEnabledOverlays(ai.applicationInfo, userId); } return ai; } @Override public ActivityInfo getActivityInfo(ComponentName component, int flags, int userId) { return getActivityInfoInternal(component, flags, Binder.getCallingUid(), userId); Loading Loading @@ -4612,11 +4563,12 @@ public class PackageManagerService extends IPackageManager.Stub if (filterAppAccessLPr(ps, filterCallingUid, component, TYPE_ACTIVITY, userId)) { return null; } return generateActivityInfo(a, flags, ps.readUserState(userId), userId); return PackageParser.generateActivityInfo( a, flags, ps.readUserState(userId), userId); } if (mResolveComponentName.equals(component)) { return generateActivityInfo(mResolveActivity, flags, new PackageUserState(), userId); return PackageParser.generateActivityInfo( mResolveActivity, flags, new PackageUserState(), userId); } } return null; Loading Loading @@ -4670,7 +4622,8 @@ public class PackageManagerService extends IPackageManager.Stub if (filterAppAccessLPr(ps, callingUid, component, TYPE_RECEIVER, userId)) { return null; } return generateActivityInfo(a, flags, ps.readUserState(userId), userId); return PackageParser.generateActivityInfo( a, flags, ps.readUserState(userId), userId); } } return null; Loading Loading @@ -4806,12 +4759,8 @@ public class PackageManagerService extends IPackageManager.Stub if (filterAppAccessLPr(ps, callingUid, component, TYPE_SERVICE, userId)) { return null; } ServiceInfo si = PackageParser.generateServiceInfo(s, flags, ps.readUserState(userId), userId); if (si != null) { rebaseEnabledOverlays(si.applicationInfo, userId); } return si; return PackageParser.generateServiceInfo( s, flags, ps.readUserState(userId), userId); } } return null; Loading @@ -4834,12 +4783,8 @@ public class PackageManagerService extends IPackageManager.Stub if (filterAppAccessLPr(ps, callingUid, component, TYPE_PROVIDER, userId)) { return null; } ProviderInfo pi = PackageParser.generateProviderInfo(p, flags, ps.readUserState(userId), userId); if (pi != null) { rebaseEnabledOverlays(pi.applicationInfo, userId); } return pi; return PackageParser.generateProviderInfo( p, flags, ps.readUserState(userId), userId); } } return null; Loading Loading @@ -8265,7 +8210,6 @@ public class PackageManagerService extends IPackageManager.Stub ai = PackageParser.generateApplicationInfo(ps.pkg, effectiveFlags, ps.readUserState(userId), userId); if (ai != null) { rebaseEnabledOverlays(ai, userId); ai.packageName = resolveExternalPackageNameLPr(ps.pkg); } } else { Loading @@ -8292,7 +8236,6 @@ public class PackageManagerService extends IPackageManager.Stub ApplicationInfo ai = PackageParser.generateApplicationInfo(p, flags, ps.readUserState(userId), userId); if (ai != null) { rebaseEnabledOverlays(ai, userId); ai.packageName = resolveExternalPackageNameLPr(p); list.add(ai); } Loading Loading @@ -8446,7 +8389,6 @@ public class PackageManagerService extends IPackageManager.Stub ApplicationInfo ai = PackageParser.generateApplicationInfo(p, flags, ps.readUserState(userId), userId); if (ai != null) { rebaseEnabledOverlays(ai, userId); finalList.add(ai); } } Loading Loading @@ -13309,7 +13251,8 @@ public class PackageManagerService extends IPackageManager.Stub return null; } final PackageUserState userState = ps.readUserState(userId); ActivityInfo ai = generateActivityInfo(activity, mFlags, userState, userId); ActivityInfo ai = PackageParser.generateActivityInfo(activity, mFlags, userState, userId); if (ai == null) { return null; } Loading Loading @@ -22279,11 +22222,6 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName()); dumpCompilerStatsLPr(pw, packageName); } if (!checkin && dumpState.isDumping(DumpState.DUMP_ENABLED_OVERLAYS)) { if (dumpState.onTitlePrinted()) pw.println(); dumpEnabledOverlaysLPr(pw); } if (!checkin && dumpState.isDumping(DumpState.DUMP_MESSAGES) && packageName == null) { if (dumpState.onTitlePrinted()) pw.println(); mSettings.dumpReadMessagesLPr(pw, dumpState); Loading Loading @@ -22480,23 +22418,6 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName()); } } private void dumpEnabledOverlaysLPr(PrintWriter pw) { pw.println("Enabled overlay paths:"); final int N = mEnabledOverlayPaths.size(); for (int i = 0; i < N; i++) { final int userId = mEnabledOverlayPaths.keyAt(i); pw.println(String.format(" User %d:", userId)); final ArrayMap<String, ArrayList<String>> userSpecificOverlays = mEnabledOverlayPaths.valueAt(i); final int M = userSpecificOverlays.size(); for (int j = 0; j < M; j++) { final String targetPackageName = userSpecificOverlays.keyAt(j); final ArrayList<String> overlayPackagePaths = userSpecificOverlays.valueAt(j); pw.println(String.format(" %s: %s", targetPackageName, overlayPackagePaths)); } } } private String dumpDomainString(String packageName) { List<IntentFilterVerificationInfo> iviList = getIntentFilterVerifications(packageName) .getList(); Loading Loading @@ -24671,11 +24592,10 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName()); Slog.e(TAG, "failed to find package " + targetPackageName); return false; } ArrayList<String> paths = null; if (overlayPackageNames != null) { ArrayList<String> overlayPaths = null; if (overlayPackageNames != null && overlayPackageNames.size() > 0) { final int N = overlayPackageNames.size(); paths = new ArrayList<>(N); overlayPaths = new ArrayList<>(N); for (int i = 0; i < N; i++) { final String packageName = overlayPackageNames.get(i); final PackageParser.Package pkg = mPackages.get(packageName); Loading @@ -24683,22 +24603,17 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName()); Slog.e(TAG, "failed to find package " + packageName); return false; } paths.add(pkg.baseCodePath); overlayPaths.add(pkg.baseCodePath); } } ArrayMap<String, ArrayList<String>> userSpecificOverlays = mEnabledOverlayPaths.get(userId); if (userSpecificOverlays == null) { userSpecificOverlays = new ArrayMap<>(); mEnabledOverlayPaths.put(userId, userSpecificOverlays); } if (paths != null && paths.size() > 0) { userSpecificOverlays.put(targetPackageName, paths); } else { userSpecificOverlays.remove(targetPackageName); final PackageSetting ps = mSettings.mPackages.get(targetPackageName); String[] frameworkOverlayPaths = null; if (!"android".equals(targetPackageName)) { frameworkOverlayPaths = mSettings.mPackages.get("android").getOverlayPaths(userId); } ps.setOverlayPaths(overlayPaths, frameworkOverlayPaths, userId); return true; } } services/core/java/com/android/server/pm/PackageSettingBase.java +22 −0 Original line number Diff line number Diff line Loading @@ -31,6 +31,7 @@ import android.util.SparseArray; import android.util.proto.ProtoOutputStream; import com.android.internal.annotations.VisibleForTesting; import com.google.android.collect.Lists; import java.io.File; import java.util.ArrayList; Loading Loading @@ -329,6 +330,27 @@ abstract class PackageSettingBase extends SettingBase { modifyUserState(userId).installReason = installReason; } void setOverlayPaths(List<String> overlayPaths, String[] frameworkOverlayPaths, int userId) { if (overlayPaths == null && frameworkOverlayPaths == null) { modifyUserState(userId).overlayPaths = null; return; } final List<String> paths; if (frameworkOverlayPaths == null) { paths = overlayPaths; } else { paths = Lists.newArrayList(frameworkOverlayPaths); if (overlayPaths != null) { paths.addAll(overlayPaths); } } modifyUserState(userId).overlayPaths = paths.toArray(new String[paths.size()]); } String[] getOverlayPaths(int userId) { return readUserState(userId).overlayPaths; } /** Only use for testing. Do NOT use in production code. */ @VisibleForTesting SparseArray<PackageUserState> getUserState() { Loading services/core/java/com/android/server/pm/Settings.java +9 −0 Original line number Diff line number Diff line Loading @@ -4858,6 +4858,15 @@ final class Settings { pw.print(ps.getEnabled(user.id)); pw.print(" instant="); pw.println(ps.getInstantApp(user.id)); String[] overlayPaths = ps.getOverlayPaths(user.id); if (overlayPaths != null && overlayPaths.length > 0) { pw.println("Overlay paths:"); for (String path : overlayPaths) { pw.println(path); } } String lastDisabledAppCaller = ps.getLastDisabledAppCaller(user.id); if (lastDisabledAppCaller != null) { pw.print(prefix); pw.print(" lastDisabledCaller: "); Loading Loading
core/java/android/content/pm/PackageParser.java +4 −1 Original line number Diff line number Diff line Loading @@ -6852,7 +6852,7 @@ public class PackageParser { ai.category = FallbackCategoryProvider.getFallbackCategory(ai.packageName); } ai.seInfoUser = SELinuxUtil.assignSeinfoUser(state); ai.resourceDirs = state.resourceDirs; ai.resourceDirs = state.overlayPaths; } public static ApplicationInfo generateApplicationInfo(Package p, int flags, Loading Loading @@ -7000,6 +7000,7 @@ public class PackageParser { return null; } if (!copyNeeded(flags, a.owner, state, a.metaData, userId)) { updateApplicationInfo(a.info.applicationInfo, flags, state); return a.info; } // Make shallow copies so we can store the metadata safely Loading Loading @@ -7088,6 +7089,7 @@ public class PackageParser { return null; } if (!copyNeeded(flags, s.owner, state, s.metaData, userId)) { updateApplicationInfo(s.info.applicationInfo, flags, state); return s.info; } // Make shallow copies so we can store the metadata safely Loading Loading @@ -7183,6 +7185,7 @@ public class PackageParser { if (!copyNeeded(flags, p.owner, state, p.metaData, userId) && ((flags & PackageManager.GET_URI_PERMISSION_PATTERNS) != 0 || p.info.uriPermissionPatterns == null)) { updateApplicationInfo(p.info.applicationInfo, flags, state); return p.info; } // Make shallow copies so we can store the metadata safely Loading
core/java/android/content/pm/PackageUserState.java +3 −3 Original line number Diff line number Diff line Loading @@ -55,7 +55,7 @@ public class PackageUserState { public ArraySet<String> disabledComponents; public ArraySet<String> enabledComponents; public String[] resourceDirs; public String[] overlayPaths; public PackageUserState() { installed = true; Loading Loading @@ -83,8 +83,8 @@ public class PackageUserState { installReason = o.installReason; disabledComponents = ArrayUtils.cloneOrNull(o.disabledComponents); enabledComponents = ArrayUtils.cloneOrNull(o.enabledComponents); resourceDirs = o.resourceDirs == null ? null : Arrays.copyOf(o.resourceDirs, o.resourceDirs.length); overlayPaths = o.overlayPaths == null ? null : Arrays.copyOf(o.overlayPaths, o.overlayPaths.length); } /** Loading
services/core/java/com/android/server/pm/PackageManagerService.java +22 −107 Original line number Diff line number Diff line Loading @@ -676,13 +676,6 @@ public class PackageManagerService extends IPackageManager.Stub @GuardedBy("mPackages") final SparseIntArray mIsolatedOwners = new SparseIntArray(); // List of APK paths to load for each user and package. This data is never // persisted by the package manager. Instead, the overlay manager will // ensure the data is up-to-date in runtime. @GuardedBy("mPackages") final SparseArray<ArrayMap<String, ArrayList<String>>> mEnabledOverlayPaths = new SparseArray<ArrayMap<String, ArrayList<String>>>(); /** * Tracks new system packages [received in an OTA] that we expect to * find updated user-installed versions. Keys are package name, values Loading Loading @@ -3584,8 +3577,6 @@ public class PackageManagerService extends IPackageManager.Stub return null; } rebaseEnabledOverlays(packageInfo.applicationInfo, userId); packageInfo.packageName = packageInfo.applicationInfo.packageName = resolveExternalPackageNameLPr(p); Loading Loading @@ -4097,7 +4088,6 @@ public class PackageManagerService extends IPackageManager.Stub ApplicationInfo ai = PackageParser.generateApplicationInfo(ps.pkg, flags, ps.readUserState(userId), userId); if (ai != null) { rebaseEnabledOverlays(ai, userId); ai.packageName = resolveExternalPackageNameLPr(ps.pkg); } return ai; Loading Loading @@ -4146,7 +4136,6 @@ public class PackageManagerService extends IPackageManager.Stub ApplicationInfo ai = PackageParser.generateApplicationInfo( p, flags, ps.readUserState(userId), userId); if (ai != null) { rebaseEnabledOverlays(ai, userId); ai.packageName = resolveExternalPackageNameLPr(p); } return ai; Loading @@ -4163,26 +4152,6 @@ public class PackageManagerService extends IPackageManager.Stub return null; } private void rebaseEnabledOverlays(@NonNull ApplicationInfo ai, int userId) { List<String> paths = new ArrayList<>(); ArrayMap<String, ArrayList<String>> userSpecificOverlays = mEnabledOverlayPaths.get(userId); if (userSpecificOverlays != null) { if (!"android".equals(ai.packageName)) { ArrayList<String> frameworkOverlays = userSpecificOverlays.get("android"); if (frameworkOverlays != null) { paths.addAll(frameworkOverlays); } } ArrayList<String> appOverlays = userSpecificOverlays.get(ai.packageName); if (appOverlays != null) { paths.addAll(appOverlays); } } ai.resourceDirs = paths.size() > 0 ? paths.toArray(new String[paths.size()]) : null; } private String normalizePackageNameLPr(String packageName) { String normalizedPackageName = mSettings.getRenamedPackageLPr(packageName); return normalizedPackageName != null ? normalizedPackageName : packageName; Loading Loading @@ -4567,24 +4536,6 @@ public class PackageManagerService extends IPackageManager.Stub return updateFlagsForComponent(flags, userId, intent /*cookie*/); } private ActivityInfo generateActivityInfo(ActivityInfo ai, int flags, PackageUserState state, int userId) { ActivityInfo ret = PackageParser.generateActivityInfo(ai, flags, state, userId); if (ret != null) { rebaseEnabledOverlays(ret.applicationInfo, userId); } return ret; } private ActivityInfo generateActivityInfo(PackageParser.Activity a, int flags, PackageUserState state, int userId) { ActivityInfo ai = PackageParser.generateActivityInfo(a, flags, state, userId); if (ai != null) { rebaseEnabledOverlays(ai.applicationInfo, userId); } return ai; } @Override public ActivityInfo getActivityInfo(ComponentName component, int flags, int userId) { return getActivityInfoInternal(component, flags, Binder.getCallingUid(), userId); Loading Loading @@ -4612,11 +4563,12 @@ public class PackageManagerService extends IPackageManager.Stub if (filterAppAccessLPr(ps, filterCallingUid, component, TYPE_ACTIVITY, userId)) { return null; } return generateActivityInfo(a, flags, ps.readUserState(userId), userId); return PackageParser.generateActivityInfo( a, flags, ps.readUserState(userId), userId); } if (mResolveComponentName.equals(component)) { return generateActivityInfo(mResolveActivity, flags, new PackageUserState(), userId); return PackageParser.generateActivityInfo( mResolveActivity, flags, new PackageUserState(), userId); } } return null; Loading Loading @@ -4670,7 +4622,8 @@ public class PackageManagerService extends IPackageManager.Stub if (filterAppAccessLPr(ps, callingUid, component, TYPE_RECEIVER, userId)) { return null; } return generateActivityInfo(a, flags, ps.readUserState(userId), userId); return PackageParser.generateActivityInfo( a, flags, ps.readUserState(userId), userId); } } return null; Loading Loading @@ -4806,12 +4759,8 @@ public class PackageManagerService extends IPackageManager.Stub if (filterAppAccessLPr(ps, callingUid, component, TYPE_SERVICE, userId)) { return null; } ServiceInfo si = PackageParser.generateServiceInfo(s, flags, ps.readUserState(userId), userId); if (si != null) { rebaseEnabledOverlays(si.applicationInfo, userId); } return si; return PackageParser.generateServiceInfo( s, flags, ps.readUserState(userId), userId); } } return null; Loading @@ -4834,12 +4783,8 @@ public class PackageManagerService extends IPackageManager.Stub if (filterAppAccessLPr(ps, callingUid, component, TYPE_PROVIDER, userId)) { return null; } ProviderInfo pi = PackageParser.generateProviderInfo(p, flags, ps.readUserState(userId), userId); if (pi != null) { rebaseEnabledOverlays(pi.applicationInfo, userId); } return pi; return PackageParser.generateProviderInfo( p, flags, ps.readUserState(userId), userId); } } return null; Loading Loading @@ -8265,7 +8210,6 @@ public class PackageManagerService extends IPackageManager.Stub ai = PackageParser.generateApplicationInfo(ps.pkg, effectiveFlags, ps.readUserState(userId), userId); if (ai != null) { rebaseEnabledOverlays(ai, userId); ai.packageName = resolveExternalPackageNameLPr(ps.pkg); } } else { Loading @@ -8292,7 +8236,6 @@ public class PackageManagerService extends IPackageManager.Stub ApplicationInfo ai = PackageParser.generateApplicationInfo(p, flags, ps.readUserState(userId), userId); if (ai != null) { rebaseEnabledOverlays(ai, userId); ai.packageName = resolveExternalPackageNameLPr(p); list.add(ai); } Loading Loading @@ -8446,7 +8389,6 @@ public class PackageManagerService extends IPackageManager.Stub ApplicationInfo ai = PackageParser.generateApplicationInfo(p, flags, ps.readUserState(userId), userId); if (ai != null) { rebaseEnabledOverlays(ai, userId); finalList.add(ai); } } Loading Loading @@ -13309,7 +13251,8 @@ public class PackageManagerService extends IPackageManager.Stub return null; } final PackageUserState userState = ps.readUserState(userId); ActivityInfo ai = generateActivityInfo(activity, mFlags, userState, userId); ActivityInfo ai = PackageParser.generateActivityInfo(activity, mFlags, userState, userId); if (ai == null) { return null; } Loading Loading @@ -22279,11 +22222,6 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName()); dumpCompilerStatsLPr(pw, packageName); } if (!checkin && dumpState.isDumping(DumpState.DUMP_ENABLED_OVERLAYS)) { if (dumpState.onTitlePrinted()) pw.println(); dumpEnabledOverlaysLPr(pw); } if (!checkin && dumpState.isDumping(DumpState.DUMP_MESSAGES) && packageName == null) { if (dumpState.onTitlePrinted()) pw.println(); mSettings.dumpReadMessagesLPr(pw, dumpState); Loading Loading @@ -22480,23 +22418,6 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName()); } } private void dumpEnabledOverlaysLPr(PrintWriter pw) { pw.println("Enabled overlay paths:"); final int N = mEnabledOverlayPaths.size(); for (int i = 0; i < N; i++) { final int userId = mEnabledOverlayPaths.keyAt(i); pw.println(String.format(" User %d:", userId)); final ArrayMap<String, ArrayList<String>> userSpecificOverlays = mEnabledOverlayPaths.valueAt(i); final int M = userSpecificOverlays.size(); for (int j = 0; j < M; j++) { final String targetPackageName = userSpecificOverlays.keyAt(j); final ArrayList<String> overlayPackagePaths = userSpecificOverlays.valueAt(j); pw.println(String.format(" %s: %s", targetPackageName, overlayPackagePaths)); } } } private String dumpDomainString(String packageName) { List<IntentFilterVerificationInfo> iviList = getIntentFilterVerifications(packageName) .getList(); Loading Loading @@ -24671,11 +24592,10 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName()); Slog.e(TAG, "failed to find package " + targetPackageName); return false; } ArrayList<String> paths = null; if (overlayPackageNames != null) { ArrayList<String> overlayPaths = null; if (overlayPackageNames != null && overlayPackageNames.size() > 0) { final int N = overlayPackageNames.size(); paths = new ArrayList<>(N); overlayPaths = new ArrayList<>(N); for (int i = 0; i < N; i++) { final String packageName = overlayPackageNames.get(i); final PackageParser.Package pkg = mPackages.get(packageName); Loading @@ -24683,22 +24603,17 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName()); Slog.e(TAG, "failed to find package " + packageName); return false; } paths.add(pkg.baseCodePath); overlayPaths.add(pkg.baseCodePath); } } ArrayMap<String, ArrayList<String>> userSpecificOverlays = mEnabledOverlayPaths.get(userId); if (userSpecificOverlays == null) { userSpecificOverlays = new ArrayMap<>(); mEnabledOverlayPaths.put(userId, userSpecificOverlays); } if (paths != null && paths.size() > 0) { userSpecificOverlays.put(targetPackageName, paths); } else { userSpecificOverlays.remove(targetPackageName); final PackageSetting ps = mSettings.mPackages.get(targetPackageName); String[] frameworkOverlayPaths = null; if (!"android".equals(targetPackageName)) { frameworkOverlayPaths = mSettings.mPackages.get("android").getOverlayPaths(userId); } ps.setOverlayPaths(overlayPaths, frameworkOverlayPaths, userId); return true; } }
services/core/java/com/android/server/pm/PackageSettingBase.java +22 −0 Original line number Diff line number Diff line Loading @@ -31,6 +31,7 @@ import android.util.SparseArray; import android.util.proto.ProtoOutputStream; import com.android.internal.annotations.VisibleForTesting; import com.google.android.collect.Lists; import java.io.File; import java.util.ArrayList; Loading Loading @@ -329,6 +330,27 @@ abstract class PackageSettingBase extends SettingBase { modifyUserState(userId).installReason = installReason; } void setOverlayPaths(List<String> overlayPaths, String[] frameworkOverlayPaths, int userId) { if (overlayPaths == null && frameworkOverlayPaths == null) { modifyUserState(userId).overlayPaths = null; return; } final List<String> paths; if (frameworkOverlayPaths == null) { paths = overlayPaths; } else { paths = Lists.newArrayList(frameworkOverlayPaths); if (overlayPaths != null) { paths.addAll(overlayPaths); } } modifyUserState(userId).overlayPaths = paths.toArray(new String[paths.size()]); } String[] getOverlayPaths(int userId) { return readUserState(userId).overlayPaths; } /** Only use for testing. Do NOT use in production code. */ @VisibleForTesting SparseArray<PackageUserState> getUserState() { Loading
services/core/java/com/android/server/pm/Settings.java +9 −0 Original line number Diff line number Diff line Loading @@ -4858,6 +4858,15 @@ final class Settings { pw.print(ps.getEnabled(user.id)); pw.print(" instant="); pw.println(ps.getInstantApp(user.id)); String[] overlayPaths = ps.getOverlayPaths(user.id); if (overlayPaths != null && overlayPaths.length > 0) { pw.println("Overlay paths:"); for (String path : overlayPaths) { pw.println(path); } } String lastDisabledAppCaller = ps.getLastDisabledAppCaller(user.id); if (lastDisabledAppCaller != null) { pw.print(prefix); pw.print(" lastDisabledCaller: "); Loading