Loading services/core/java/com/android/server/policy/AppOpsPolicy.java +18 −16 Original line number Original line Diff line number Diff line Loading @@ -280,14 +280,15 @@ public final class AppOpsPolicy implements AppOpsManagerInternal.CheckOpsDelegat private static void updateAllowListedTagsForPackageLocked(int uid, String packageName, private static void updateAllowListedTagsForPackageLocked(int uid, String packageName, Set<String> allowListedTags, ConcurrentHashMap<Integer, ArrayMap<String, Set<String> allowListedTags, ConcurrentHashMap<Integer, ArrayMap<String, ArraySet<String>>> datastore) { ArraySet<String>>> datastore) { final int appId = UserHandle.getAppId(uid); // We make a copy of the per UID state to limit our mutation to one // We make a copy of the per UID state to limit our mutation to one // operation in the underlying concurrent data structure. // operation in the underlying concurrent data structure. ArrayMap<String, ArraySet<String>> uidTags = datastore.get(uid); ArrayMap<String, ArraySet<String>> appIdTags = datastore.get(appId); if (uidTags != null) { if (appIdTags != null) { uidTags = new ArrayMap<>(uidTags); appIdTags = new ArrayMap<>(appIdTags); } } ArraySet<String> packageTags = (uidTags != null) ? uidTags.get(packageName) : null; ArraySet<String> packageTags = (appIdTags != null) ? appIdTags.get(packageName) : null; if (packageTags != null) { if (packageTags != null) { packageTags = new ArraySet<>(packageTags); packageTags = new ArraySet<>(packageTags); } } Loading @@ -299,17 +300,17 @@ public final class AppOpsPolicy implements AppOpsManagerInternal.CheckOpsDelegat } else { } else { packageTags = new ArraySet<>(allowListedTags); packageTags = new ArraySet<>(allowListedTags); } } if (uidTags == null) { if (appIdTags == null) { uidTags = new ArrayMap<>(); appIdTags = new ArrayMap<>(); } } uidTags.put(packageName, packageTags); appIdTags.put(packageName, packageTags); datastore.put(uid, uidTags); datastore.put(appId, appIdTags); } else if (uidTags != null) { } else if (appIdTags != null) { uidTags.remove(packageName); appIdTags.remove(packageName); if (!uidTags.isEmpty()) { if (!appIdTags.isEmpty()) { datastore.put(uid, uidTags); datastore.put(appId, appIdTags); } else { } else { datastore.remove(uid); datastore.remove(appId); } } } } } } Loading @@ -318,9 +319,10 @@ public final class AppOpsPolicy implements AppOpsManagerInternal.CheckOpsDelegat @NonNull String attributionTag, @NonNull Map<Integer, ArrayMap<String, @NonNull String attributionTag, @NonNull Map<Integer, ArrayMap<String, ArraySet<String>>> mappedOps) { ArraySet<String>>> mappedOps) { // Only a single lookup from the underlying concurrent data structure // Only a single lookup from the underlying concurrent data structure final ArrayMap<String, ArraySet<String>> uidTags = mappedOps.get(uid); final int appId = UserHandle.getAppId(uid); if (uidTags != null) { final ArrayMap<String, ArraySet<String>> appIdTags = mappedOps.get(appId); final ArraySet<String> packageTags = uidTags.get(packageName); if (appIdTags != null) { final ArraySet<String> packageTags = appIdTags.get(packageName); if (packageTags != null && packageTags.contains(attributionTag)) { if (packageTags != null && packageTags.contains(attributionTag)) { return true; return true; } } Loading Loading
services/core/java/com/android/server/policy/AppOpsPolicy.java +18 −16 Original line number Original line Diff line number Diff line Loading @@ -280,14 +280,15 @@ public final class AppOpsPolicy implements AppOpsManagerInternal.CheckOpsDelegat private static void updateAllowListedTagsForPackageLocked(int uid, String packageName, private static void updateAllowListedTagsForPackageLocked(int uid, String packageName, Set<String> allowListedTags, ConcurrentHashMap<Integer, ArrayMap<String, Set<String> allowListedTags, ConcurrentHashMap<Integer, ArrayMap<String, ArraySet<String>>> datastore) { ArraySet<String>>> datastore) { final int appId = UserHandle.getAppId(uid); // We make a copy of the per UID state to limit our mutation to one // We make a copy of the per UID state to limit our mutation to one // operation in the underlying concurrent data structure. // operation in the underlying concurrent data structure. ArrayMap<String, ArraySet<String>> uidTags = datastore.get(uid); ArrayMap<String, ArraySet<String>> appIdTags = datastore.get(appId); if (uidTags != null) { if (appIdTags != null) { uidTags = new ArrayMap<>(uidTags); appIdTags = new ArrayMap<>(appIdTags); } } ArraySet<String> packageTags = (uidTags != null) ? uidTags.get(packageName) : null; ArraySet<String> packageTags = (appIdTags != null) ? appIdTags.get(packageName) : null; if (packageTags != null) { if (packageTags != null) { packageTags = new ArraySet<>(packageTags); packageTags = new ArraySet<>(packageTags); } } Loading @@ -299,17 +300,17 @@ public final class AppOpsPolicy implements AppOpsManagerInternal.CheckOpsDelegat } else { } else { packageTags = new ArraySet<>(allowListedTags); packageTags = new ArraySet<>(allowListedTags); } } if (uidTags == null) { if (appIdTags == null) { uidTags = new ArrayMap<>(); appIdTags = new ArrayMap<>(); } } uidTags.put(packageName, packageTags); appIdTags.put(packageName, packageTags); datastore.put(uid, uidTags); datastore.put(appId, appIdTags); } else if (uidTags != null) { } else if (appIdTags != null) { uidTags.remove(packageName); appIdTags.remove(packageName); if (!uidTags.isEmpty()) { if (!appIdTags.isEmpty()) { datastore.put(uid, uidTags); datastore.put(appId, appIdTags); } else { } else { datastore.remove(uid); datastore.remove(appId); } } } } } } Loading @@ -318,9 +319,10 @@ public final class AppOpsPolicy implements AppOpsManagerInternal.CheckOpsDelegat @NonNull String attributionTag, @NonNull Map<Integer, ArrayMap<String, @NonNull String attributionTag, @NonNull Map<Integer, ArrayMap<String, ArraySet<String>>> mappedOps) { ArraySet<String>>> mappedOps) { // Only a single lookup from the underlying concurrent data structure // Only a single lookup from the underlying concurrent data structure final ArrayMap<String, ArraySet<String>> uidTags = mappedOps.get(uid); final int appId = UserHandle.getAppId(uid); if (uidTags != null) { final ArrayMap<String, ArraySet<String>> appIdTags = mappedOps.get(appId); final ArraySet<String> packageTags = uidTags.get(packageName); if (appIdTags != null) { final ArraySet<String> packageTags = appIdTags.get(packageName); if (packageTags != null && packageTags.contains(attributionTag)) { if (packageTags != null && packageTags.contains(attributionTag)) { return true; return true; } } Loading