diff options
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() + ); } } |