summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java89
-rw-r--r--cmds/statsd/src/external/StatsPullerManager.cpp9
-rw-r--r--services/core/java/com/android/server/stats/pull/StatsPullAtomService.java97
3 files changed, 88 insertions, 107 deletions
diff --git a/apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java b/apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java
index bb65867e4204..5e0b52a22ce9 100644
--- a/apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java
+++ b/apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java
@@ -907,83 +907,6 @@ public class StatsCompanionService extends IStatsCompanionService.Stub {
pulledData.add(e);
}
- private void pullDangerousPermissionState(int atomId, long elapsedNanos,
- final long wallClockNanos, List<StatsLogEventWrapper> pulledData) {
- long token = Binder.clearCallingIdentity();
- Set<Integer> reportedUids = new HashSet<>();
- try {
- PackageManager pm = mContext.getPackageManager();
-
- List<UserInfo> users = mContext.getSystemService(UserManager.class).getUsers();
-
- int numUsers = users.size();
- for (int userNum = 0; userNum < numUsers; userNum++) {
- UserHandle user = users.get(userNum).getUserHandle();
-
- List<PackageInfo> pkgs = pm.getInstalledPackagesAsUser(
- PackageManager.GET_PERMISSIONS, user.getIdentifier());
-
- int numPkgs = pkgs.size();
- for (int pkgNum = 0; pkgNum < numPkgs; pkgNum++) {
- PackageInfo pkg = pkgs.get(pkgNum);
-
- if (pkg.requestedPermissions == null) {
- continue;
- }
-
- if (reportedUids.contains(pkg.applicationInfo.uid)) {
- // do not report same uid twice
- continue;
- }
- reportedUids.add(pkg.applicationInfo.uid);
-
- if (atomId == StatsLog.DANGEROUS_PERMISSION_STATE_SAMPLED
- && ThreadLocalRandom.current().nextFloat() > 0.2f) {
- continue;
- }
-
- int numPerms = pkg.requestedPermissions.length;
- for (int permNum = 0; permNum < numPerms; permNum++) {
- String permName = pkg.requestedPermissions[permNum];
-
- PermissionInfo permissionInfo;
- int permissionFlags = 0;
- try {
- permissionInfo = pm.getPermissionInfo(permName, 0);
- permissionFlags =
- pm.getPermissionFlags(permName, pkg.packageName, user);
-
- } catch (PackageManager.NameNotFoundException ignored) {
- continue;
- }
-
- if (permissionInfo.getProtection() != PROTECTION_DANGEROUS) {
- continue;
- }
-
- StatsLogEventWrapper e = new StatsLogEventWrapper(
- atomId, elapsedNanos, wallClockNanos);
-
- e.writeString(permName);
- e.writeInt(pkg.applicationInfo.uid);
- if (atomId == StatsLog.DANGEROUS_PERMISSION_STATE) {
- e.writeString(null);
- }
- e.writeBoolean((pkg.requestedPermissionsFlags[permNum]
- & REQUESTED_PERMISSION_GRANTED) != 0);
- e.writeInt(permissionFlags);
-
- pulledData.add(e);
- }
- }
- }
- } catch (Throwable t) {
- Log.e(TAG, "Could not read permissions", t);
- } finally {
- Binder.restoreCallingIdentity(token);
- }
- }
-
private void pullAppOps(long elapsedNanos, final long wallClockNanos,
List<StatsLogEventWrapper> pulledData) {
long token = Binder.clearCallingIdentity();
@@ -1276,18 +1199,6 @@ public class StatsCompanionService extends IStatsCompanionService.Stub {
break;
}
- case StatsLog.DANGEROUS_PERMISSION_STATE: {
- pullDangerousPermissionState(StatsLog.DANGEROUS_PERMISSION_STATE, elapsedNanos,
- wallClockNanos, ret);
- break;
- }
-
- case StatsLog.DANGEROUS_PERMISSION_STATE_SAMPLED: {
- pullDangerousPermissionState(StatsLog.DANGEROUS_PERMISSION_STATE_SAMPLED,
- elapsedNanos, wallClockNanos, ret);
- break;
- }
-
case StatsLog.TIME_ZONE_DATA_INFO: {
pullTimeZoneDataInfo(tagId, elapsedNanos, wallClockNanos, ret);
break;
diff --git a/cmds/statsd/src/external/StatsPullerManager.cpp b/cmds/statsd/src/external/StatsPullerManager.cpp
index b282693a2456..4ff29d6a4d29 100644
--- a/cmds/statsd/src/external/StatsPullerManager.cpp
+++ b/cmds/statsd/src/external/StatsPullerManager.cpp
@@ -128,10 +128,6 @@ std::map<PullerKey, PullAtomInfo> StatsPullerManager::kAllPullAtomInfo = {
{{.atomTag = android::util::ROLE_HOLDER},
{.puller = new StatsCompanionServicePuller(android::util::ROLE_HOLDER)}},
- // PermissionState.
- {{.atomTag = android::util::DANGEROUS_PERMISSION_STATE},
- {.puller = new StatsCompanionServicePuller(android::util::DANGEROUS_PERMISSION_STATE)}},
-
// TrainInfo.
{{.atomTag = android::util::TRAIN_INFO}, {.puller = new TrainInfoPuller()}},
@@ -167,11 +163,6 @@ std::map<PullerKey, PullAtomInfo> StatsPullerManager::kAllPullAtomInfo = {
{{.atomTag = android::util::VMS_CLIENT_STATS},
{.additiveFields = {5, 6, 7, 8, 9, 10},
.puller = new CarStatsPuller(android::util::VMS_CLIENT_STATS)}},
-
- // PermissionStateSampled.
- {{.atomTag = android::util::DANGEROUS_PERMISSION_STATE_SAMPLED},
- {.puller =
- new StatsCompanionServicePuller(android::util::DANGEROUS_PERMISSION_STATE_SAMPLED)}},
};
StatsPullerManager::StatsPullerManager() : mNextPullTimeNs(NO_ALARM_UPDATE) {
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 122426099938..24c49fcbeb6d 100644
--- a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java
+++ b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java
@@ -301,7 +301,6 @@ public class StatsPullAtomService extends SystemService {
registerDebugFailingElapsedClock();
registerBuildInformation();
registerRoleHolder();
- registerDangerousPermissionState();
registerTimeZoneDataInfo();
registerExternalStorageInfo();
registerAppsOnExternalStorageInfo();
@@ -2145,11 +2144,89 @@ public class StatsPullAtomService extends SystemService {
}
private void registerDangerousPermissionState() {
- // No op.
+ int tagId = StatsLog.DANGEROUS_PERMISSION_STATE;
+ mStatsManager.registerPullAtomCallback(
+ tagId,
+ null, // use default PullAtomMetadata values
+ (atomTag, data) -> pullDangerousPermissionState(atomTag, data),
+ BackgroundThread.getExecutor()
+ );
}
- private void pullDangerousPermissionState() {
- // No op.
+ private int pullDangerousPermissionState(int atomTag, List<StatsEvent> pulledData) {
+ final long token = Binder.clearCallingIdentity();
+ Set<Integer> reportedUids = new HashSet<>();
+ try {
+ PackageManager pm = mContext.getPackageManager();
+
+ List<UserInfo> users = mContext.getSystemService(UserManager.class).getUsers();
+
+ int numUsers = users.size();
+ for (int userNum = 0; userNum < numUsers; userNum++) {
+ UserHandle user = users.get(userNum).getUserHandle();
+
+ List<PackageInfo> pkgs = pm.getInstalledPackagesAsUser(
+ PackageManager.GET_PERMISSIONS, user.getIdentifier());
+
+ int numPkgs = pkgs.size();
+ for (int pkgNum = 0; pkgNum < numPkgs; pkgNum++) {
+ PackageInfo pkg = pkgs.get(pkgNum);
+
+ if (pkg.requestedPermissions == null) {
+ continue;
+ }
+
+ if (reportedUids.contains(pkg.applicationInfo.uid)) {
+ // do not report same uid twice
+ continue;
+ }
+ reportedUids.add(pkg.applicationInfo.uid);
+
+ if (atomTag == StatsLog.DANGEROUS_PERMISSION_STATE_SAMPLED
+ && ThreadLocalRandom.current().nextFloat() > 0.2f) {
+ continue;
+ }
+
+ int numPerms = pkg.requestedPermissions.length;
+ for (int permNum = 0; permNum < numPerms; permNum++) {
+ String permName = pkg.requestedPermissions[permNum];
+
+ PermissionInfo permissionInfo;
+ int permissionFlags = 0;
+ try {
+ permissionInfo = pm.getPermissionInfo(permName, 0);
+ permissionFlags =
+ pm.getPermissionFlags(permName, pkg.packageName, user);
+ } catch (PackageManager.NameNotFoundException ignored) {
+ continue;
+ }
+
+ if (permissionInfo.getProtection() != PROTECTION_DANGEROUS) {
+ continue;
+ }
+
+ StatsEvent.Builder e = StatsEvent.newBuilder();
+ e.setAtomId(atomTag);
+ e.writeString(permName);
+ e.writeInt(pkg.applicationInfo.uid);
+ if (atomTag == StatsLog.DANGEROUS_PERMISSION_STATE) {
+ e.writeString("");
+ }
+ e.writeBoolean((pkg.requestedPermissionsFlags[permNum]
+ & REQUESTED_PERMISSION_GRANTED) != 0);
+ e.writeInt(permissionFlags);
+
+ pulledData.add(e.build());
+ }
+ }
+ }
+ } catch (Throwable t) {
+ Log.e(TAG, "Could not read permissions", t);
+ return StatsManager.PULL_SKIP;
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
+ return StatsManager.PULL_SUCCESS;
}
private void registerTimeZoneDataInfo() {
@@ -2277,10 +2354,12 @@ public class StatsPullAtomService extends SystemService {
}
private void registerDangerousPermissionStateSampled() {
- // No op.
- }
-
- private void pullDangerousPermissionStateSampled() {
- // No op.
+ int tagId = StatsLog.DANGEROUS_PERMISSION_STATE_SAMPLED;
+ mStatsManager.registerPullAtomCallback(
+ tagId,
+ null, // use default PullAtomMetadata values
+ (atomTag, data) -> pullDangerousPermissionState(atomTag, data),
+ BackgroundThread.getExecutor()
+ );
}
}