diff options
| author | TreeHugger Robot <treehugger-gerrit@google.com> | 2021-04-07 03:08:20 +0000 |
|---|---|---|
| committer | Android (Google) Code Review <android-gerrit@google.com> | 2021-04-07 03:08:20 +0000 |
| commit | 086a0be6b2a360f9c823a596cba50867101a5a0f (patch) | |
| tree | ab16a5746b63f359ea5b838f0cedf50e87b959e0 /core/java/android | |
| parent | a740a2e46b71f8f793b90f4db4ec86b06e961300 (diff) | |
| parent | 1eda90e312950de519920e2ca6b04b970e7dbd6b (diff) | |
Merge "Assemble proxy chain based on package/uid, not attribution tag" into sc-dev
Diffstat (limited to 'core/java/android')
| -rw-r--r-- | core/java/android/permission/PermissionUsageHelper.java | 48 |
1 files changed, 25 insertions, 23 deletions
diff --git a/core/java/android/permission/PermissionUsageHelper.java b/core/java/android/permission/PermissionUsageHelper.java index 2d6fa3c77966..b427df725663 100644 --- a/core/java/android/permission/PermissionUsageHelper.java +++ b/core/java/android/permission/PermissionUsageHelper.java @@ -302,7 +302,7 @@ public class PermissionUsageHelper { OpUsage usage = new OpUsage(packageName, attributionTag, op, uid, lastAccessTime, isRunning, proxyUsage); - Integer packageAttr = usage.getPackageAttrHash(); + Integer packageAttr = usage.getPackageIdHash(); if (!usages.containsKey(permGroupName)) { ArrayMap<Integer, OpUsage> map = new ArrayMap<>(); map.put(packageAttr, usage); @@ -342,19 +342,19 @@ public class PermissionUsageHelper { } ArrayMap<Integer, OpUsage> allUsages = new ArrayMap<>(); - // map of uid -> most recent non-proxy-related usage for that uid. + // map of packageName and uid hash -> most recent non-proxy-related usage for that uid. ArrayMap<Integer, OpUsage> mostRecentUsages = new ArrayMap<>(); - // set of all uids involved in a proxy usage - ArraySet<Integer> proxyUids = new ArraySet<>(); + // set of all packages involved in a proxy usage + ArraySet<Integer> proxyPackages = new ArraySet<>(); // map of usage -> list of proxy app labels ArrayMap<OpUsage, ArrayList<CharSequence>> proxyLabels = new ArrayMap<>(); // map of usage.proxy hash -> usage hash, telling us if a usage is a proxy ArrayMap<Integer, OpUsage> proxies = new ArrayMap<>(); for (int i = 0; i < usages.size(); i++) { OpUsage usage = usages.get(i); - allUsages.put(usage.getPackageAttrHash(), usage); + allUsages.put(usage.getPackageIdHash(), usage); if (usage.proxy != null) { - proxies.put(usage.proxy.getPackageAttrHash(), usage); + proxies.put(usage.proxy.getPackageIdHash(), usage); } } @@ -365,25 +365,27 @@ public class PermissionUsageHelper { continue; } - int usageAttr = usage.getPackageAttrHash(); + int usageAttr = usage.getPackageIdHash(); // If this usage has a proxy, but is not a proxy, it is the end of a chain. if (!proxies.containsKey(usageAttr) && usage.proxy != null) { proxyLabels.put(usage, new ArrayList<>()); - proxyUids.add(usage.uid); + proxyPackages.add(usage.getPackageIdHash()); } // If this usage is not by the system, and is more recent than the next-most recent - // for it's uid, save it. - if (!usage.packageName.equals(SYSTEM_PKG) && (!mostRecentUsages.containsKey(usage.uid) - || usage.lastAccessTime > mostRecentUsages.get(usage.uid).lastAccessTime)) { - mostRecentUsages.put(usage.uid, usage); + // for it's uid and package name, save it. + int usageId = usage.getPackageIdHash(); + OpUsage lastMostRecent = mostRecentUsages.get(usageId); + if (!usage.packageName.equals(SYSTEM_PKG) && (lastMostRecent == null + || usage.lastAccessTime > lastMostRecent.lastAccessTime)) { + mostRecentUsages.put(usageId, usage); } } // get all the proxy labels for (int numStart = 0; numStart < proxyLabels.size(); numStart++) { OpUsage start = proxyLabels.keyAt(numStart); - // Remove any non-proxy usage for the starting uid - mostRecentUsages.remove(start.uid); + // Remove any non-proxy usage for the starting package + mostRecentUsages.remove(start.getPackageIdHash()); OpUsage currentUsage = proxyLabels.keyAt(numStart); ArrayList<CharSequence> proxyLabelList = proxyLabels.get(currentUsage); if (currentUsage == null || proxyLabelList == null) { @@ -393,8 +395,8 @@ public class PermissionUsageHelper { int maxUsages = allUsages.size(); while (currentUsage.proxy != null) { - if (allUsages.containsKey(currentUsage.proxy.getPackageAttrHash())) { - currentUsage = allUsages.get(currentUsage.proxy.getPackageAttrHash()); + if (allUsages.containsKey(currentUsage.proxy.getPackageIdHash())) { + currentUsage = allUsages.get(currentUsage.proxy.getPackageIdHash()); } else { // We are missing the proxy usage. This may be because it's a one-step trusted // proxy. Check if we should show the proxy label, and show it, if so. @@ -411,12 +413,12 @@ public class PermissionUsageHelper { if (currentUsage == null || iterNum == maxUsages - || currentUsage.getPackageAttrHash() == start.getPackageAttrHash()) { + || currentUsage.getPackageIdHash() == start.getPackageIdHash()) { // We have an invalid state, or a cycle, so break break; } - proxyUids.add(currentUsage.uid); + proxyPackages.add(currentUsage.getPackageIdHash()); // Don't add an app label for the main app, or the system app if (!currentUsage.packageName.equals(start.packageName) && !currentUsage.packageName.equals(SYSTEM_PKG)) { @@ -440,9 +442,9 @@ public class PermissionUsageHelper { proxyLabelList.isEmpty() ? null : formatLabelList(proxyLabelList)); } - for (int uid : mostRecentUsages.keySet()) { - if (!proxyUids.contains(uid)) { - usagesAndLabels.put(mostRecentUsages.get(uid), null); + for (int packageHash : mostRecentUsages.keySet()) { + if (!proxyPackages.contains(packageHash)) { + usagesAndLabels.put(mostRecentUsages.get(packageHash), null); } } @@ -490,8 +492,8 @@ public class PermissionUsageHelper { return UserHandle.getUserHandleForUid(uid); } - public int getPackageAttrHash() { - return Objects.hash(packageName, attributionTag, uid); + public int getPackageIdHash() { + return Objects.hash(packageName, uid); } @Override |
