diff options
| author | 2020-05-18 10:26:25 +0000 | |
|---|---|---|
| committer | 2020-05-18 10:26:25 +0000 | |
| commit | f6fa2536aa624002e35c9d1ad91a61c3e3e6020b (patch) | |
| tree | 467d94397927a2f8847168b9565ddf0c431b3e24 | |
| parent | aca712335eb2b03225b00d3e6e05052395203169 (diff) | |
| parent | e08a2bbc1e29c8a5602a72b8cc55b7441e3fab6e (diff) | |
Merge "Precache calls to PermissionManager to avoid calls which use shared PackageManager and PermissionManager lock." into rvc-dev
| -rw-r--r-- | services/core/java/com/android/server/stats/pull/StatsPullAtomService.java | 36 |
1 files changed, 21 insertions, 15 deletions
diff --git a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java index 12309f407786..a859a42d8a8f 100644 --- a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java +++ b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java @@ -289,6 +289,7 @@ public class StatsPullAtomService extends SystemService { private StatsPullAtomCallbackImpl mStatsCallbackImpl; private int mAppOpsSamplingRate = 0; + private final ArraySet<Integer> mDangerousAppOpsList = new ArraySet<>(); // Baselines that stores list of NetworkStats right after initializing, with associated // information. This is used to calculate difference when pulling @@ -526,6 +527,25 @@ public class StatsPullAtomService extends SystemService { } catch (RemoteException e) { Slog.e(TAG, "failed to initialize healthHalWrapper"); } + + // Initialize list of AppOps related to DangerousPermissions + PackageManager pm = mContext.getPackageManager(); + for (int op = 0; op < AppOpsManager._NUM_OP; op++) { + String perm = AppOpsManager.opToPermission(op); + if (perm == null) { + continue; + } else { + PermissionInfo permInfo; + try { + permInfo = pm.getPermissionInfo(perm, 0); + if (permInfo.getProtection() == PROTECTION_DANGEROUS) { + mDangerousAppOpsList.add(op); + } + } catch (PackageManager.NameNotFoundException exception) { + continue; + } + } + } } void registerEventListeners() { @@ -3113,22 +3133,8 @@ public class StatsPullAtomService extends SystemService { e.writeLong(op.getBackgroundRejectCount(OP_FLAGS_PULLED)); e.writeLong(op.getForegroundAccessDuration(OP_FLAGS_PULLED)); e.writeLong(op.getBackgroundAccessDuration(OP_FLAGS_PULLED)); + e.writeBoolean(mDangerousAppOpsList.contains(op.getOpCode())); - String perm = AppOpsManager.opToPermission(op.getOpCode()); - if (perm == null) { - e.writeBoolean(false); - } else { - PermissionInfo permInfo; - try { - permInfo = mContext.getPackageManager().getPermissionInfo( - perm, - 0); - e.writeBoolean( - permInfo.getProtection() == PROTECTION_DANGEROUS); - } catch (PackageManager.NameNotFoundException exception) { - e.writeBoolean(false); - } - } if (atomTag == FrameworkStatsLog.ATTRIBUTED_APP_OPS) { e.writeInt(mAppOpsSamplingRate); } |