Migrate DangerousPermissionState(Sampled)

Test: atest UidAtomTests#testDangerousPermissionState
Test: atest UidAtomTests#testDangerousPermissionStateSampled
Test: adb shell cmd stats pull-source 10050
Test: adb shell cmd stats pull-source 10067
Change-Id: Ia740d185cc510a73e8c4f07ef8ce8d50e99779c2
This commit is contained in:
Jeffrey Huang
2020-01-16 16:47:22 -08:00
parent 730bf96884
commit 7f9fe5024f
3 changed files with 88 additions and 107 deletions

View File

@@ -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;

View File

@@ -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) {

View File

@@ -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()
);
}
}